CSerialPort类,如何知道本次接收完了

安琪有纪 2005-09-01 10:05:25
Remon Spekreijse 的 CSerialPort类
在OnCommunication每次接收一个字符,
我该如何区分收到的字符是本次的还是下次的啊?
...全文
361 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
awjx 2006-07-08
  • 打赏
  • 举报
回复
看来这个问题还真的不点难.

我最近在做modbus协议,根本没有结束符号,也不知长度,郁闷!



不做什么时候接完了一条数据,因为master是不停地一串一串地发,但接收却是一个一个收,真不知什么时候接收完了!















吹雪 2006-07-08
  • 打赏
  • 举报
回复
强烈建议使用起始符或结束符.否则比如因连接问题引起丢失部分数据你怎么处理?
awjx 2006-03-17
  • 打赏
  • 举报
回复
我与楼主有同样的问题。

如果在单线程中还好办,因为我发完一条指令后,收到的数据肯定是本次的。
但如果是多线程的话,就不知怎么区分。因为每条线程都在非常小的时间性片内发了指令,那接收到的数据不是有错位的可能吗?













56xue 2006-03-15
  • 打赏
  • 举报
回复
我是根据设备传输情况设的一个合时的时间值,在这时间内保证信息接受完,最后再外处理收到的字符。
有些协议是没有结束符的标志,这种的话如果有校验码,可以计算对比下。
打雷啦的专栏 2005-11-11
  • 打赏
  • 举报
回复
以下是我自己写的一个串口类,应该和CSerialPort里的差不多吧,我给你写了注释,楼主可以参考一下.
---------------------------------------------------------------------------
while (pComm->ComIsConnected())
{
ClearCommError(pComm->m_hCom, &dwErrorFlags, &ComStat);
if(ComStat.cbInQue)//判断串口里有没有数据
{ //有数据,直到数据读完

pComm->bCommRxSign = true;
ResetEvent(pComm->hPostMsgEvent);
pComm->OnCommRecvNotify(0,1);//读数据函数

WaitForSingleObject(pComm->hPostMsgEvent, 0xFFFFFFFF);

continue;
}
dwEventMask = 0;
if (!WaitCommEvent(pComm->m_hCom, &dwEventMask, &os))
{ //到这行代码说明串口读完了,用WaitCommEvent等待新的数据
//WaitCommEvent()没有等到结果,
//就用GetOverlappedResult()来等待。
if (ERROR_IO_PENDING == GetLastError())
{

GetOverlappedResult(pComm->m_hCom, &os, &dwTransfer, TRUE); //dwTransfer:actual bytes count
//TRUE:If TRUE, the function does not return until the operation has been completed.
}
}
if ((dwEventMask & EV_RXCHAR) == EV_RXCHAR)
{//这里说明WaitCommEvent()等待到结果,又去读串口
//Sets the state of the event to nonsignaled until explicitly set to signaled by the SetEvent member function.
pComm->bCommRxSign = true;
ResetEvent(pComm->hPostMsgEvent);
pComm->OnCommRecvNotify(0, 1);//读数据函数

WaitForSingleObject(pComm->hPostMsgEvent, 0xFFFFFFFF);
}
}
CloseHandle(os.hEvent);
CloseHandle(os.hEvent);
安琪有纪 2005-11-09
  • 打赏
  • 举报
回复
Mscomm就能知道每次收完了
zjz800800 2005-09-09
  • 打赏
  • 举报
回复
你问"如何知道本次接收完了"是吧?

这个要看发的是什么了,否则肯定不知道什么时候接收完?如果知道发的是什么东西的话,你可以做个
判断,如果不知道那就必须等,如果数据多的话也不知道要什么时候发完,这个类首先打开传口然后一直监听,有数据到达就接收没有就阻塞,仅此而已
zjz800800 2005-09-09
  • 打赏
  • 举报
回复

这个类每次都发一个字符然后启动消息接收,如果你有一个字符串它就这样周而复始的给你传完,所以不从在本次还是下次的情况。
安琪有纪 2005-09-09
  • 打赏
  • 举报
回复
楼上说的方法没用,因为不知道收的是啥
需要像mscomm那样将一次接收完的东西列出来
UnrealImagecoffee 2005-09-04
  • 打赏
  • 举报
回复
这个 要 看 你们 规定的 截止符
比如 规定 # 就是结束
我做的是 不同的包
发送的时候
头一个自负不同
A3334#
b#asrf$#
之后 写 你的 解析协议 就 可以了

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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