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

安琪有纪 2005-09-01 10:05:25
Remon Spekreijse 的 CSerialPort类
在OnCommunication每次接收一个字符,
我该如何区分收到的字符是本次的还是下次的啊?
...全文
356 10 打赏 收藏 转发到动态 举报
写回复
用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$#
之后 写 你的 解析协议 就 可以了
CSerialPort First Version by Remon Spekreijse on 2000-02-08 http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483/A-communication-class-for-serial-port.htm Second Version by mrlong on 2007-12-25 https://code.google.com/p/mycom/ 增加 ClosePort 增加 WriteToPort 两个方法 增加 SendData 与 RecvData 方法 by liquanhai on 2011-11-04 http://blog.csdn.net/liquanhai/article/details/4955253 增加 ClosePort 中交出控制权,防止死锁问题 by liquanhai on 2011-11-06 http://blog.csdn.net/liquanhai/article/details/6941574 增加 ReceiveChar 中防止线程死锁 by viruscamp on 2013-12-04 https://github.com/viruscamp/CSerialPort 增加 IsOpen 判断是否打开 修正 InitPort 中 parity Odd Even 参数取值错误 修改 InitPort 中 portnr 取值范围,portnr>9 时特殊处理 取消对 MFC 的依赖,使用 HWND 替代 CWnd,使用 win32 thread 函数而不是 MFC 的 增加用户消息编号自定义,方法来自 CnComm by itas109 on 2014-01-10 http://blog.csdn.net/itas109/article/details/18358297 解决COM10以上端口无法显示的问题 扩展可选择端口,最大值MaxSerialPortNum可以自定义 添加QueryKey()和Hkey2ComboBox两个方法,用于自动查询当前有效的串口号。 by liquanhai on 2014-12-18 增加一些处理措施,主要是对减少CPU占用率 by itas109 on 2016-05-07 http://blog.csdn.net/itas109 修复每次打开串口发送一次,当串口无应答时,需要关闭再打开或者接收完数据才能发送的问题。 解决办法:在m_hEventArray中调整m_hWriteEvent的优先级高于读的优先级。CommThread(LPVOID pParam)函数中读写的位置也调换。 参考:http://zhidao.baidu.com/link?url=RSrbPcfTZRULFFd2ziHZPBwnoXv1iCSu_Nmycb_yEw1mklT8gkoNZAkWpl3UDhk8L35DtRPo5VV5kEGpOx-Gea 修复停止位在头文件中定义成1导致SetCommState报错的问题,应为1对应的停止位是1.5。UINT stopsbits = ONESTOPBIT switch(stopbits)和switch(parity)增加默认情况,增强程序健壮性 by itas109 on 2016-06-22 http://blog.csdn.net/itas109 增加ReceiveStr方法,用于接收字符串(接收缓冲区有多少字符就接收多少字符)。 解决ReceiveChar只能接收单个字符的问题。 by itas109 on 2016-06-29 http://blog.csdn.net/itas109 解决RestartMonitoring方法和StopMonitoring方法命令不准确引起的歧义,根据实际作用。 将RestartMonitoring更改为ResumeMonitoring,将StopMonitoring更改为SuspendMonitoring。 增加IsThreadSuspend方法,用于判断线程是否挂起。 改进ClosePort方法,增加线程挂起判断,解决由于线程挂起导致串口关闭死锁的问题。 增加IsReceiveString宏定义,用于接收时采用单字节接收还是多字节接收 by itas109 on 2016-08-02 http://blog.csdn.net/itas109 https://github.com/itas109 改进IsOpen方法,m_hComm增加INVALID_HANDLE_VALUE的情况,因为CreateFile

16,473

社区成员

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

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

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