eVC & VC 串口编程

步骤:

1.打开串口

2.读取串口的DCB

3.设置串口事件:接收到一个字符

4.设置接收与发送的缓冲区大小

5.修改DCB

6.设置串口的DCB

7.读取超时参数

8.修改超时参数

9.设置超时参数

10. 清除收/发缓冲区

 

11.创建串口接收线程退出事件

12.定义串口接收线程

13.创建串口接收线程

 

14.发送数据

 

 

 

 

代码例程

 

接收线程

DWORD WINAPI  CommRecvTread(LPVOID lparam)

{

           DWORD dwLength;

           char *recvBuf = new char[1024];

           CSerialPortDlg *pDlg = (CSerialPortDlg*)lparam;

          

           while(TRUE)

           {                                                                                                                                                                                                                if (pDlg->m_hComm != INVALID_HANDLE_VALUE)

                     {                                                                                                                                                                                                                 BOOL fReadState = ReadFile(pDlg->m_hComm, recvBuf, 3, &dwLength, NULL);

                                if(!fReadState)

                                {

                                          //MessageBox(_T("err"));

                                }

                                else

                                {

                                          if(dwLength != 0)

                                          {

                                                     //OnCommRecv(pDlg, recvBuf, dwLength);                          /

                                                     TRACE("Rx %d byte:/t", dwLength);

                                                     for (int i=0;i<dwLength;i++)

                                                     {

                                                               TRACE("[%X] ", recvBuf[i]);

                                                     }

                                                     TRACE("/r/n");

                                          }

                                }

                     }

           }                  

          

           delete[] recvBuf;

           return 0;

}

 


打开串口

{

           // 打开串口

           m_hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);   

           if(m_hComm == INVALID_HANDLE_VALUE)

           {

                     MessageBox(_T("无法打开端口或端口已打开!请检查是否已被占用."));

                     return ;

           }

          

           GetCommState(m_hComm, &dcb);                                                            // 读取串口的DCB

          dcb.BaudRate = CBR_9600;                            

          dcb.ByteSize = 8;

          dcb.Parity = NOPARITY;

          dcb.StopBits = ONESTOPBIT;    

//        dcb.fParity = FALSE;                                                                                  // 禁止奇偶校验

//        dcb.fBinary = TRUE;

//        dcb.fDtrControl = 0;                                                                                    // 禁止流量控制

//        dcb.fRtsControl = 0;

//        dcb.fOutX = 0;

//        dcb.fInX = 0;

//        dcb.fTXContinueOnXoff = 0;

          

           SetCommMask(m_hComm, EV_RXCHAR);                                              串口事件:接收到一个字符       

           //SetupComm(m_hComm, 16384, 16384);                                                 设置接收与发送的缓冲区大小

           SetupComm(m_hComm, 128, 128);

 

           if(!SetCommState(m_hComm, &dcb))                                             // 设置串口的DCB //

           {

                     MessageBox(_T("无法按当前参数配置端口,请检查参数!"));

                     //ClosePort();

                     SetCommMask(m_hComm, 0);             

                     PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);       // 清除收/发缓冲

                     CloseHandle(m_hComm);                                 // 关闭串口操作句柄

                     m_hComm = INVALID_HANDLE_VALUE;

                     return ;

           }

 

           //设置超时参数

           COMMTIMEOUTS CommTimeOuts;

           GetCommTimeouts(m_hComm, &CommTimeOuts);            

           CommTimeOuts.ReadIntervalTimeout = 10;                                     // 接收字符间最大时间间隔

           CommTimeOuts.ReadTotalTimeoutMultiplier = 1;                

           CommTimeOuts.ReadTotalTimeoutConstant = 10;                 // 读数据总超时常量

           CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

           CommTimeOuts.WriteTotalTimeoutConstant = 0;                  

           if(!SetCommTimeouts(m_hComm, &CommTimeOuts))

           {

                     MessageBox(_T("无法设置超时参数!"));

 

                     //ClosePort();

                     SetCommMask(m_hComm, 0);             

                     PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);       // 清除收/发缓冲

                     CloseHandle(m_hComm);                                                                           // 关闭串口操作句柄

                     m_hComm = INVALID_HANDLE_VALUE;

                     return ;

           }

 

           PurgeComm(m_hComm, PURGE_TXCLEAR | PURGE_RXCLEAR);       // 清除收/发缓冲区

 

           m_ExitThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);           // 创建串口接收线程退出事件

 

           DWORD IDThread;

           HANDLE hRecvThread;              // 接收线程句柄

           // 创建串口接收线程

           hRecvThread = CreateThread(0, 0, CommRecvTread, this, 0, &IDThread);

           if (hRecvThread == NULL)

           {

                     MessageBox(_T("创建接收线程失败!"));

                     return;

           }        

 

           TRACE("/r/n打开串口成功!/r/n");

 

}

 

 

发送数据

{

           char dd[] = "123456";

           DWORD sndLen;

 

           WriteFile(m_hComm, dd, 6, &sndLen, NULL);           //从串口发送数据 

           FlushFileBuffers(m_hComm);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值