串口通信中接受数据的问题

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);

...全文
268 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdsdyl 2006-06-16
  • 打赏
  • 举报
回复
//m_readbuff不使用CString类型吧,重量定义一变量
char chStr[1024];
memset(chStr, '\0', 1024);
//然后调用读数
long mysize=mydlg->m_SerialConnection.read(chStr,1024);
chStr[mysize] = '\0';
m_readbuff = chStr;//这里赋值到控件
ohoff 2006-06-15
  • 打赏
  • 举报
回复
没有人答么?分太少?

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧