用Win32API写串口调试程序,关于循环侦听串口消息的有关问题

用Win32API写串口调试程序,关于循环侦听串口消息的问题
临下班前发个贴。

工程描述:
1 串口调试程序,串口部分是基于Win32 API的,就是用CreateFile,WriteFile,ReadFile
2
C/C++ code
hCon = CreateFile(g_ctrPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,  2222222 
                     OPEN_EXISTING, _FLAG_OVERLAPPED, NULL); 

3
C/C++ code
SetupComm(hCon,1024,1024);
     PurgeComm(hCon,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
    SetCommMask(hCon, EV_BREAK|EV_CTS|EV_DSR|EV_ERR|EV_RING|EV_RLSD
                     |EV_RXCHAR|EV_RXFLAG|EV_TXEMPTY);

4
C/C++ code
DCB g_dcb;
也配置正确

问题描述:
1 向串口发送数据没有问题(经测试)
 
C/C++ code
WriteFile(hCon,buffer_send,dw_buffer,&dw_buffer,NULL);

2 手动接收数据(即我按一下Button,函数执行一次。)有问题
 
C/C++ code
ReadFile(hCon,(void *)buffer_recv.GetBuffer(buffer_recv.GetLength()),dw_buffer,&dw_buffer,NULL)

  2.1 如果我发一条,接收一条,是OK的;
  2.2 如果我不发,直接接收,接收线程会堵死;
3 现在我在一开始的时候就启动接收线程,接收线程就会像2.2那样直接堵死,代码如下:
  /* 接收线程(侦听串口) */
C/C++ code
  while(TRUE)
  {
      //经查MSDN,ReadFile为True的情况很多,所以加上了一个buffer_recv是否为空的判断
      if (ReadFile(hCon,(void *)buffer_recv.GetBuffer(buffer_recv.GetLength()),dw_buffer,&dw_buffer,NULL)
     && buffer_recv.IsEmpty())
    {
        g_record.InsertString(nLine,buffer_recv);//在“消息记录”上面增加一条消息
        nLine++;
        buffer_recv.Empty();//清空buffer

    }
     else
         {
         continue;
    }
  }


4 3的代码有一个很明显的问题:我只有先Read串口,接下来才能判断串口是否有数据进入;但是一旦串口没有数据的情况下,Read串口就会堵死线程。
5 我尝试用 
C/C++ code
             _COMMTIMEOUTS TimeOut;//超时结构体
             TimeOut.ReadTotalTimeoutConstant = 50;//这两个参数只知道单位是毫秒,具体指什么我不是很clear
        TimeOut.WriteTotalTimeoutConstant = 50;
        SetCommTimeouts(hCon,&TimeOut);//设置超时

  也不知道是我设置不对,还是怎么怎么地,发现米的效果


不知道大家有没有什么好的意见或建议

最好是实际的经验,太理论的东西对小马帮助很小的哇



------解决方案--------------------
不懂 帮顶
------解决方案--------------------
你是第一次操作串口?
串口的读取线程是要通过事件控制的
网上很多例子的
不过我手的例子都是MFC
要不然就给你段代码参考了
------解决方案--------------------
1.线程中不要直接操作界面
2.串口接收是有事件的
3.线程会堵死是因为线程里没有sleep