如何用事件驱动方式读取串口的批量数据????
小弟做了个程序要和外部的单片机通信。但在读串口(一组数组)时发现数据总是出错。小弟的程序如下:
//串口初始化 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个元素是正确的。我在论坛上也看了好几篇文章,但因为初学之故,总不得要领。哪位好心人救救我啊!!
小弟做了个程序要和外部的单片机通信。但在读串口(一组数组)时发现数据总是出错。小弟的程序如下:
//串口初始化 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个元素是正确的。我在论坛上也看了好几篇文章,但因为初学之故,总不得要领。哪位好心人救救我啊!!
解决方案 »
- listen、 accept 是多线程的吗
- 求助CTooltipCtrl的使用问题
- 有对DXF文件格式了解的吗
- 如何将内存中的RGB值用设备上下文中在显示器上显示
- 巨难的问题,delphi区无人能解,只好到vc区求助,分不够再加。
- 请问 vc中如何用classwizard从cobject继承新类
- 在线等,小问题,如何把日期型转化为字符型,马上结!!!
- Vs7里面怎样把ADo加入到ATL项目中用啊?
- 求解:DBGrid的使用问题??
- QQ2014的气泡模式的实现方法
- 不知kingzai()与wuxuan(真心英雄)大哥有没时间再帮我解答这简单问题也希望大家帮助
- 怎么把tab键的控制权交出来 关键词(TAB , child ,子窗口 ,键盘控制,焦点)
我这里有一个串口类,如果你需要,留下email!!!