串口编程之一: WIN32 API 中串口DCB 结构的介绍

在应用WIN32  API 对串口进行编程时, 必定会使用到DCB 结构. 下面的DCB 结构的一些介绍.

首先是DCB 结构.

typedef 
struct _DCB {  
        DWORD DCBlength;           
        DWORD BaudRate;            
        DWORD fBinary: 1;          
        DWORD fParity: 1;          
        DWORD fOutxCtsFlow:1;      
        DWORD fOutxDsrFlow:1;      
        DWORD fDtrControl:2;       
        DWORD fDsrSensitivity:1;  
        DWORD fTXContinueOnXoff:1
        DWORD fOutX: 1;            
        DWORD fInX: 1;             
        DWORD fErrorChar: 1;       
        DWORD fNull: 1;            
        DWORD fRtsControl:2;       
        DWORD fAbortOnError:1;     
        DWORD fDummy2:17;         
        WORD wReserved;                    
        WORD XonLim;               
 
        WORD XoffLim;               
        BYTE ByteSize;              
        BYTE Parity;                
        BYTE StopBits;              
        char XonChar;               
        char XoffChar;              
        char ErrorChar;             
        char EofChar;               
        char EvtChar;               
        WORD wReserved1;         
    } DCB; 

在这个结构中, 共有28个变量, 我把这些成员归类为几种.
1.  串口的基本设置
     1) DWORD BaudRate;                      波特率设置。 
     2) BYTE ByteSize;                             数据位设置。
     3) DWORD fParity: 1;                       TRUE时, 支持奇偶检验。
     4) BYTE Parity;                                 奇偶检验位的设置
     5) BYTE StopBits;                             停止位的设置
2. 流控制(Flow Control) 的设置
     流控制分为硬件流控制和软件流控制。 而硬件流控制又分为RTS/CTS和DTR/DSR两种。而软件流控制, 则是Xon/Xoff。 
     DTR/DSR 硬件流控制:
     1) DWORD fOutxDsrFlow:1;            TRUE时,支持DSR流控制。 当DSR为OFF时,停止发送。 
     2) DWORD fDtrControl:2;                DTR设置。 (置高/置低...)    

fDTRControlDTR_CONTROL_Disable :  使DTR为 off.
DTR_CONTROL_Enable :  使DTR 为 on. 
DTR_CONTROL_HANDSHAKE : DTR 硬件流控.

     3) DWORD fDsrSensitivity:1;           TRUE时,当DSR为OFF,则接收端忽略所有字符。  

     RTS/CTS 硬件流控制:
     4) DWORD fOutxCtsFlow:1;            TRUE时,支持CTS流控制。 当CTS为OFF时,停止发送。
     5) DWORD fRtsControl:2;               RTS设置。 (置高/置低...)                                                                  

fRTSControlRTS_CONTROL_DISABLE : 使RTS保持 off
RTS_CONTROL_ENABLE : 使RTS保持on
RTS_CONTROL_HANDSHAKE :  RTS 硬件流控
RTS_CONTROL_TOGGLE : 485通讯RTS自动流控

     
     Xon/Xoff 软件流控制:
     6) DWORD fOutX: 1;                       发送端支持Xon/Xoff。收到Xoff停止发送,收到Xon重新开始
     7) DWORD fInX: 1;                         接收端支持Xon/Xoff。当FIFO中字节超过XoffLim时发送Xoff, 当FIFO中少于XonLim时发送Xon. 
     8) WORD XonLim;                          当接收Buffer中的字符减少到XonLim规定的字符数, 就发送Xon字符,让对方继续发送。
     9) WORD XoffLim;                          接收Buffer达到XoffLim规定的字符数, 就发送Xoff字符, 让对方停止发送。
     10)char XonChar;                          Xon 字符。 
     11)char XoffChar;                          Xoff 字符。
     12)DWORD fTXContinueOnXoff:1TRUE时,不管接收端是否Xoff, 本方发送端持续发送。 (也就是本方的发送端, 与本方接收端Xon/Xoff是相互独立的)。若为False 时,则当接收端buffer 达到XoffLim时,发送端发送完Xoff字符后,就停止发送。 

                   
3.  Error 情况处理
     1) DWORD fErrorChar: 1;              TRUE时,若fParity为TRUE, 则用ErrorChar替换Parity Check错误的字符。 
     2) DWORD fAbortOnError:1         TRUE时,发生错误时停止读写操作。
     3) char ErrorChar;                         Parity Check 错误时,替换的字符。 
         

4. 其他参数
     1) DWORD DCBlength;        
          DCB结构的长度(以字节为单位)
     2) DWORD fBinary: 1;                   二进制模式。(必须为1 )
     3) DWORD fNull: 1;                       TRUE时,接收时去掉空字节(0x0)
     4) char EofChar;                           EOF替代字符
     5) char EvtChar;                           事件触发字符
     6) DWORD fDummy2:17;              保留
     7) WORD wReserved;                  保留
     8) WORD wReserved1;                 保留 


转自:http://forum.eet-cn.com/BLOG_ARTICLE_3444.HTM

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VS2010是Microsoft开发的集成开发环境,具有丰富的功能和强大的调试工具。基于Win32 API和MFC开发串口通信功能是相对常见的需求。下面是一个基于Win32 API和MFC实现串口通信的示例: 1. 首先,在VS2010创建一个新的MFC项目。选择创建一个对话框应用程序。 2. 打开资源视图,找到对话框资源,并双击打开对话框编辑器。 3. 在对话框添加两个按钮和一个编辑框。一个按钮用于打开串口,另一个按钮用于关闭串口。编辑框用于显示和接收串口数据。 4. 在类视图找到对话框类,右击并选择“添加成员变量”。添加一个CComboBox类型的成员变量,用于选择串口号。添加一个CEdit类型的成员变量,用于显示和接收串口数据。 5. 在对话框类的头文件包含头文件"afxwin.h"、"afxmt.h"和"atlstr.h"。 6. 在对话框类的头文件添加以下成员变量: ``` HANDLE m_hComm; //串口句柄 CEvent m_Event; //事件对象 CPtrList m_List; //接收数据的链表 ``` 7. 在OnInitDialog函数初始化串口号下拉框,并为两个按钮添加按钮事件处理程序。 8. 实现打开串口的函数OpenPort,代码如下: ``` bool CMySerialDlg::OpenPort(CString strPort) { DCB dcb; CString strCom; strCom.Format(_T("\\\\.\\%s"), strPort); m_hComm = CreateFile(strCom, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (m_hComm == INVALID_HANDLE_VALUE) { AfxMessageBox(_T("无法打开串口")); return false; } GetCommState(m_hComm, &dcb); dcb.BaudRate = 9600; //设置波特率 dcb.ByteSize = 8; //设置数据位 dcb.Parity = NOPARITY; //设置校验位 dcb.StopBits = ONESTOPBIT; //设置停止位 SetCommState(m_hComm, &dcb); m_Event.ResetEvent(); ::ResetEvent(m_OL.hEvent); //创建一个独立的线程来接收串口数据 AfxBeginThread(RecvThread, this); return true; } ``` 9. 实现关闭串口的函数ClosePort,代码如下: ``` void CMySerialDlg::ClosePort() { if (m_hComm != INVALID_HANDLE_VALUE) { PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR); CloseHandle(m_hComm); m_hComm = INVALID_HANDLE_VALUE; } m_Event.SetEvent(); } ``` 10. 创建一个独立的线程来接收串口数据,代码如下: ``` UINT RecvThread(LPVOID pParam) { CMySerialDlg* pDlg = (CMySerialDlg*)pParam; BOOL bResult = TRUE; DWORD dwBytesRead = 0; OVERLAPPED m_OL; m_OL.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //不停地接收串口数据 while (!::WaitForSingleObject(pDlg->m_Event, 0)) { bResult = ReadFile(pDlg->m_hComm, pDlg->m_buffer, sizeof(pDlg->m_buffer), &dwBytesRead, &m_OL); if (!bResult && GetLastError() != ERROR_IO_PENDING) { break; } ::WaitForSingleObject(m_OL.hEvent, INFINITE); pDlg->m_List.AddTail(dwBytesRead); //将接收到的数据添加到链表 pDlg->m_Event.SetEvent(); } CloseHandle(m_OL.hEvent); return 0; } ``` 11. 在按钮的点击事件处理程序调用OpenPort函数和ClosePort函数来打开关闭串口,并在链表读取和显示串口数据。 12. 编译和运行程序,可以在对话框选择串口号并通过按钮打开和关闭串口串口数据将在编辑框显示并可以通过编辑框发送到串口。 以上就是一个基于Win32 API和MFC实现串口通信的示例。 ### 回答2: 在VS2010,可以使用Win32 API和MFC来进行串口通信。下面是一个基于Win32 API和MFC的串口通信示例: 首先,我们需要创建一个MFC应用程序。在创建应用程序的对话框,勾选“对话框”选项,并在下一步选择“基于对话框”的应用程序类型。 在对话框资源,添加两个按钮,一个用于打开串口,另一个用于关闭串口。 打开串口按钮的点击事件处理程序,我们需要调用Win32 API函数来进行串口的初始化和打开。示例代码如下: ``` void CMyDlg::OnBnClickedOpenPort() { // 获取串口号和波特率 int nPort = GetDlgItemInt(IDC_EDIT_PORT); int nBaudrate = GetDlgItemInt(IDC_EDIT_BAUDRATE); // 打开串口 HANDLE hPort = CreateFileA("COM" + std::to_string(nPort).c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hPort != INVALID_HANDLE_VALUE) { // 配置串口参数 DCB dcb; dcb.DCBlength = sizeof(DCB); GetCommState(hPort, &dcb); dcb.BaudRate = nBaudrate; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hPort, &dcb); // 设置读写超时时间 COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout = MAXDWORD; timeouts.ReadTotalTimeoutConstant = 0; timeouts.ReadTotalTimeoutMultiplier = 0; timeouts.WriteTotalTimeoutConstant = 1000; timeouts.WriteTotalTimeoutMultiplier = 0; SetCommTimeouts(hPort, &timeouts); // 保存串口句柄 m_hPort = hPort; // 禁用打开串口按钮,启用关闭串口按钮 GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(TRUE); } else { // 打开串口失败 AfxMessageBox(_T("打开串口失败!")); } } ``` 关闭串口按钮的点击事件处理程序,我们需要调用Win32 API函数来关闭串口并释放资源。示例代码如下: ``` void CMyDlg::OnBnClickedClosePort() { if (m_hPort != INVALID_HANDLE_VALUE) { // 关闭串口 CloseHandle(m_hPort); // 清空串口句柄 m_hPort = INVALID_HANDLE_VALUE; // 启用打开串口按钮,禁用关闭串口按钮 GetDlgItem(IDC_BUTTON_OPENPORT)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_CLOSEPORT)->EnableWindow(FALSE); } } ``` 以上就是一个简单的基于Win32 API和MFC的串口通信示例。在实际应用,还需要处理串口数据的读取和写入等操作,以实现具体的数据通信功能。 ### 回答3: VS2010基于Win32API串口通信MFC实例可以通过以下步骤实现。 1. 首先,建立一个MFC应用程序项目,选择“对话框”类型,并创建一个对话框界面。 2. 打开资源视图,在对话框添加一个编辑框(用于显示串口收发的数据),两个按钮(一个用于打开串口,另一个用于发送数据),以及一个组合框(用于选择串口号和波特率)。 3. 在对话框的类文件添加相应的头文件和变量声明。头文件包括afxwin.h、winbase.h和commdlg.h等。 4. 在OnInitDialog()函数初始化串口列表并将其添加到组合框,同时设置波特率。 5. 添加按钮的响应函数,包括打开串口的按钮OnClickOpenSerial()和发送数据的按钮OnClickSendData()。 6. 在OnClickOpenSerial()函数,使用CreateFile()函数打开选串口号,并设置相应的串口参数,如波特率、数据位、停止位和校验位等。 7. 在OnClickSendData()函数,通过WriteFile()函数向串口发送数据。 8. 创建一个新的线程,用于读取串口数据。通过WaitCommEvent()函数等待串口数据的到来,并使用ReadFile()函数读取收到的数据。 9. 将读取到的数据显示在编辑框,可以通过SendMessage()函数将数据添加到编辑框的末尾,并使用SetSel()函数将光标移到末尾。 10. 在程序结束时,需要关闭串口,使用CloseHandle()函数关闭句柄。 以上是一个简单的基于Win32API串口通信MFC实例。根据需要可以进一步添加错误处理、数据校验和其他功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值