用的是 网上流传挺广的CSerialPort类
这里有例子下载:http://www.daxia.com/bibis/upload/serialport_demo.93.zip
CSerialPort类是异步的串口通信,以下是一些关键代码:
OVERLAPPED m_ov;
m_hComm=CreateFile(FILE_FLAG_OVERLAPPED);//设置超时
m_CommTimeouts.ReadIntervalTimeout = 1000;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(m_hComm, &m_CommTimeouts)
//设置缓冲区大小
SetupComm(m_hComm, 2000, 2000)//启动线程接收
while(1)
{
   WaitCommEvent(m_hComm, &Event, m_ov);//等待串口事件
   WaitForObject(m_ov);//等待 重叠端口 事件
   for(;;)
   {
      bResult = ClearCommError(m_hComm, &dwError, &comstat);
      if (comstat.cbInQue == 0)
      {
           break;
      }
      ReadFile(buf, 1, m_ov);//读取,每次都是1个1个字节读取
   }
}
当发送端一次性发送3000字节的时候,接收端触发了一次接收事件(EV_RXCHAR),for(;;)也只进入一次,然后把2000字节读出来,也就是接收了2000字节,然后就没再一次到来消息了。停在了WaitForObject(m_ov);//等待 重叠端口 事件这里。当把缓冲区大小设置为2500的时候,也是同样的情况,接收了2500,没有再继续下去。
第一次做串口通信,没经验。不知道这样描述算不算清除了。

解决方案 »

  1.   

    在while之前应该先创建事件CreateEvent()
      

  2.   

    缓冲区永远都是不够的啊。我已经设置了2K了,难道要设置2M?即使设置了2M,也是不够的啊。
      

  3.   


     for (;;)
    {
       EnterCriticalSection(&port->m_csCommunicationSync); //没有这个的话可能会出现冲突
       if (bRead)   
       {   
            bResult = ReadFile(port->m_hComm,&RXBuff,1,&BytesRead,&port->m_ov);
       }
       if (!bResult)//出错了
       {
        ...//清除错误,然后进入下一次循环
       }
       LeaveCriticalSection(&port->m_csCommunicationSync);//离开
       ::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);//这里我改动了下,每接收到一个字符RXBuff就发送一个中断一个字符一个字符中断的话速度会慢一点儿
      

  4.   

    有没有介绍相关函数SetupComm的文档