如何用事件驱动方式读取串口的批量数据????
小弟做了个程序要和外部的单片机通信。但在读串口(一组数组)时发现数据总是出错。小弟的程序如下:
//串口初始化 hCom=CreateFile(ComPort_Array[m_ComPort.GetCurSel()],
GENERIC_READ|GENERIC_WRITE,//
0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//
NULL);//
if(hCom==INVALID_HANDLE_VALUE)
{
MessageBox("串口初始化错误","警告",MB_OK);
}
    BOOL Success=SetCommMask(hCom,EV_RXCHAR);
if(!Success)
{
MessageBox("设置掩码错误","警告",MB_OK);
}
BOOL Error=SetupComm(hCom,1024,
1024);
if(!Error)
{
MessageBox("设置缓冲区错误","警告",MB_OK);
}
Error=GetCommState(hCom,&dcb);
if(!Error)
{
MessageBox("获取串口状态错误","警告",MB_OK);
} dcb.BaudRate=BaudRate_Array[m_BaudRate.GetCurSel()]; /*9600*/
dcb.ByteSize=ByteSize_Array[m_DataBit.GetCurSel()];
dcb.Parity=Parity_Array[m_Verify.GetCurSel()];
    dcb.StopBits=StopBits_Array[m_StopBit.GetCurSel()];     Error=SetCommState(hCom,&dcb);
if(!Error)
{
MessageBox("设置通讯参数错误","警告",MB_OK);
}
memset(&CommRead_Overlapped,0,sizeof(OVERLAPPED));
//初始化完毕!!
      
        //启动串口监视线程
HWND hWnd=GetSafeHwnd();
AfxBeginThread(WaitReadThread,hWnd,THREAD_PRIORITY_NORMAL);
       //启动完毕      //监视串口线程的函数
UINT WaitReadThread(LPVOID param)
{
DWORD dwDWORD=0;
WaitCommEvent(hCom,&dwDWORD,&CommRead_Overlapped);
if(dwDWORD&EV_RXCHAR)
{
  ::PostMessage((HWND)param,WM_READSERIALPORT,0,0);
}
return 0;
}
    //完毕   //读串口函数
LONG CSendfileDlg::OnReadSerialPort(WPARAM wParam,LPARAM lParam) 
{
HWND hWnd=GetSafeHwnd();
DWORD dwLength;
DWORD dwError;
COMSTAT ComStat;
ComStat.cbInQue = 0;
while(ComStat.cbInQue < (DWORD)HEXFile.OLCounts)
{
ClearCommError(hCom,&dwError,&ComStat);
}
if(!ReadFile(hCom,readbuffer,HEXFile.OLCounts,&dwLength,
&CommRead_Overlapped))
{
::MessageBox(hWnd,"读串口出错","警告",MB_OK);
CWnd* pwnd = this->GetDlgItem(IDC_SENDBUTTON);
pwnd->EnableWindow(TRUE);
CloseHandle(hCom);
return 0;
}
}在读的时候发现readbuffer数组中总是错的,只有第1,第2个元素是正确的。我在论坛上也看了好几篇文章,但因为初学之故,总不得要领。哪位好心人救救我啊!!

解决方案 »

  1.   

    WM_READSERIALPORT是你自定义的消息吧,你这样写太麻烦了!!!
    我这里有一个串口类,如果你需要,留下email!!!
      

  2.   

    的确是我定义的消息。我的E是[email protected]
      

  3.   

    ReadFile的返回值才是你实际读到的数据数。不对,看你的ReadFile的函数,有一个dwLength,它传入的是引用,也有可能是它才是实际读到的数据数。你好好查一查吧。总的来说,就是你的ReadFile有误,你需要判断一下你到底读入了多少个字节的数据 。
      

  4.   

    回复redfire:我刚刚调试了一下,发现dwLength值和ComStat.cbInQue 是一样的。加了判断后,数据还是不正确。是不是我的串口初始化或在串口监视的函数运用中有问题啊???