串口程序如下,WritePort函数通过PostThreadMessage投递消息到写线程WriteThreadFunc,这两个函数如下所示:
BOOL CSeries::WritePort(const char *buf, DWORD bufLen)

    CopyMemory(psendmsgtrue,buf,1024);     if(PostThreadMessage(m_dwWriteThreadID,CM_THREADCOMMWRITE,WPARAM(bufLen),LPARAM(psendmsgtrue)))
   {
  TRACE(L"发送写消息成功");      return TRUE;
   }
   
   TRACE(L"发送写消息失败");
   return FALSE;

}
DWORD CSeries::WriteThreadFunc(LPVOID lparam)
{
CSeries *pSeries = (CSeries *)lparam;
MSG msg;
DWORD dwWritenLen=0; while(TRUE)
{
  //如果捕捉到线程消息
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
   if(msg.hwnd!=0)
   {
     TranslateMessage(&msg);
 DispatchMessage(&msg);  continue;
   }
   if(msg.message==CM_THREADCOMMWRITE)
   {
         //向串口写
   char *pbuf = (char *)msg.lParam;
   dwWritenLen=msg.wParam;
                                WritePort(pSeries->m_hComm,pbuf,dwWritenLen);
//这个重载的WritePort函数
                                                                                调用WriteFile函数写串口    //删除动态分配的内存
    delete []pbuf;
   }
} if(WaitForSingleObject(pSeries->m_hWriteCloseEvent,500) == WAIT_OBJECT_0)
{
  break;
} pSeries->m_hWriteThread=NULL;
}
    return 0;
}在向串口循环写数据时,在一个单独开辟的线程中:
        char  Data[512]={0x24,0x24,0x24,0x24};
         char Data1[512]={0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44};
      
          while(1)
          {
            Sleep(500);
   m_series.WritePort(otherData,4);//调用上面的WritePort函数写串口    Sleep(500);
   m_series.WritePort(otherData1,8);
           }
   问题是,如果没有上面的两个 Sleep(500);程序就会出错,串口发出的数据就会乱码,通过调试发现,如果没有 Sleep ,连续调用WritePort函数,在WritePort函数中投递消息前数据还是正确的,而在那个写线程收到消息后,lpraram里的数据就会出错;如果有Sleep之后,数据就正确了,而且Sleep的时间还要大于500ms;
   我认为应该是消息处理可能需要花费比较多的时间,是不是这样呢?
    但是能否有其他办法,这样连续向串口写不同数据,还要确保数据正确呢?
   请大家指教了

解决方案 »

  1.   

    为什么不让SLEEP一下?那就当数据包大到一定程度后再WirtePort,不要一有数据就发送。
      

  2.   

    psendmsgtrue在哪里new?
    在发送后会被删除..............小心指针
      

  3.   

    消息处理花的时间比起串口发送数据时间要小的多,怀疑是发送的事,把 WritePort 的代码贴出来。如果你的波特率是9600的每秒的最多发960个字节(要是数据位为8,有校验位的话)
      

  4.   

    psendmsgtrue就是在构造函数里定义了一个数组,没有new
    是这样定义的:char psendmsgtrue[512];
      

  5.   

    说错了,不是在构造函数里定义的,
    psendmsgtrue是类的数据成员。
      

  6.   

    补:就是有WriteFile函数的 代码贴出来
      

  7.   

    不用贴WritePort 了char *pbuf = (char *)msg.lParam;
    dwWritenLen=msg.wParam;
    //在这加::Sleep(500); 效果是一样的
    WritePort(pSeries->m_hComm,pbuf,dwWritenLen);//这个重载的WritePort函数调用WriteFile是这的问题第一次的数据还没发完第二次的数据就到了 pbuf 里的数据就变了所以数据就乱了
      

  8.   


        在你这里加了Sleep(500),是不行的。现在确实是连续收到两次消息使pbuf的数据乱了。但是这里加Sleep解决不了问题,因为那边投递了消息,消息处理这边本来就处理的慢,就来不急,若再Sleep,串口发出来的数据跟WritePort时的数据还是不对的。