串口通信中接受数据的问题
ohoff 2006-06-15 02:52:27 我编了一个简单的对话框程序,功能是从串口接收数据并显示在一个Edit控件上。
现在程序可以运行,也可以收到由串口发来的字符串,但是,收到的字符串后面有时候会多出一些莫名奇妙的字符。最常出现的情况是,我用串口调试工具发送4个字符的字符串,就一定会收到额外的东西。比如我发“kkkk”,收到的一定是“kkkkstrcore.cpp”。我的程序也不太稳定,有时会出现异常。请问大家,有人知道这是怎么回事吗?
下面是我程序的部分代码,希望能对大家的分析有帮助。
在程序中,我开了一个线程用于监听串口。线程的工作函数如下:
UINT CSerialTestDlg::ReadData(LPVOID pParam)
{
EnterCriticalSection(&cs);
CSerialTestDlg *mydlg=(CSerialTestDlg *)pParam;
LeaveCriticalSection(&cs);
while (true)
{
EnterCriticalSection(&cs);
long mysize=mydlg->m_SerialConnection.read(m_readbuff,1024); //m_readbuff是Edit控件的变量,CString型。
LeaveCriticalSection(&cs);
mydlg->SendMessage(WM_UPDATEDATA, FALSE);//updatedata();
Sleep(100);
}
}
程序中,m_SerialConnection是一个别人封装好的类,其读取函数是:
long read(const char *data, unsigned int size,unsigned int msWait)
{
COMSTAT stat;
unsigned long ret;
unsigned int numToRead;
ZHTimer timeDone; //一个定时器类,用于设置延时
if (myPort != INVALID_HANDLE_VALUE && myStatus == STATUS_OPEN)
{
if (msWait > 0)
{
timeDone.setToNow();
timeDone.addMSec(msWait);
while (timeDone.mSecTo() >= 0)
{
if (!ClearCommError(myPort, &ret, &stat))
return -1;
if (stat.cbInQue < size)
Sleep(2);
else
break;
}
}
if (!ClearCommError(myPort, &ret, &stat))
return -1;
if (stat.cbInQue == 0)
return 0;
if (stat.cbInQue > size)
numToRead = size;
else
numToRead = stat.cbInQue;
if (ReadFile( myPort, (void *)data, numToRead, &ret, NULL))
{
return (int)ret;
}
else
{
return -1;
}
}
return -1;
}
当我在程序中打开串口并设置好以后,创建读取线程:
DWORD ThreadId;
m_Handle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReadData,(PVOID)this,NULL,&ThreadId);
ASSERT(m_Handle!=NULL);