串口通讯的问题

nuaawenlin 2003-11-24 07:50:38
在串口通讯中,我使用多线程方式,API函数ReadFile()的时候,如何知道我接受区的总字节数?还有,在多线程函数中,使用如下代码的话,好象读不到数据

while(1)
{
if(WaitCommEvent(hCom,&dwEvent,NULL))
{
ClearCommError();
//在这里我用COMSTAT结构的cbInQue还是没有准确的得到总字节数。
ReadFile();
}
}
好象这样循环的话,读不到数据
将循环去掉这后,可以读到我指定的多少数据,可是这样线程就结束了,下一次就没法读


大家有什么好的建议解决这个问题,100分
1:如何知道总字节数
2:如何进行循环读取
谢谢各位!
...全文
76 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjg751206 2003-12-07
  • 打赏
  • 举报
回复
线程不要结束。除非你设置结束。作个循环。这样才好。数据不会丢失。当然要使用
char buffer【1024】了,一般都这样。不会有问题的
3jaja 2003-12-07
  • 打赏
  • 举报
回复
while ( ThreadFlag )
{
dwEvtMask = 0 ;
WaitCommEvent( hComDev, &dwEvtMask, &osWait);
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
ClearCommError( hComDev, &dwErrorFlags, &ComStat ) ;
if(ComStat.cbInQue > 0 )
{
if(ReadFile( hComDev, pb,nLength, &nLength, &osRead ))
nuaawenlin 2003-11-26
  • 打赏
  • 举报
回复
指定是可以的,但是我总不能这样指定吧,因为每次读的数据的总数是不确定的呀。
duyhui(杜) 的第一种方法我以前试过了,是可以的。不过我觉得不好
第二种方法如果读完之后,线程就结束了,下一次就不可以了
希望有更好的方法
sunyuan_01 2003-11-25
  • 打赏
  • 举报
回复
你用ReadFile()读的时候自己指定读多少不行吗
while(1)
{
if(WaitCommEvent(hCom,&dwEvent,NULL))
{
EnterCriticalSection();//临界
ClearCommError();
//在这里我用COMSTAT结构的cbInQue还是没有准确的得到总字节数。
LeaveCriticalSection();//临界

if (XXX.cbInQue == 0)//这里检查一下看数据有没有了
{
break;
}
EnterCriticalSection();//临界
ReadFile();//读取时指定读多少字节
LeaveCriticalSection();//临界
}
}
i_tingfeng 2003-11-25
  • 打赏
  • 举报
回复
上面的方法是可以的,没错,再仔细看看
duyhui 2003-11-25
  • 打赏
  • 举报
回复
1。总字节数我觉得有两种方法得到:
1)通过你在发送前测量,就是在发送数据前已经知道要发送的数据有多大。
2)在接收端设置全局变量,每收到数据后累加。
nLength=ReadComm(buf,255);

2。串口收数据不用循环的。是用事件激发的。while(1)这种写法不对的
if(!WaitCommEvent(pDoc->m_hCom, &dwMask, &os)) // 重叠操作

{

if(GetLastError()==ERROR_IO_PENDING)

// 无限等待重叠操作结果

GetOverlappedResult(pDoc->m_hCom, &os, &dwTrans, TRUE);

else

{

CloseHandle(os.hEvent);

return (UINT)-1;

}

}



zhangnanonnet 2003-11-25
  • 打赏
  • 举报
回复
bReturn = ReadFile(idComDev, tmp, 1, &dwBytesRead, NULL);

按一个自己一个自己的读是可以的,当读不出来的时候就说明一次传送完成,将刚才读出的数据拼成一个字符串输出,清空缓冲区,继续等待

2,640

社区成员

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

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