我使用下面的代码使用 C# 接收来自串行端口的消息
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (comPort.IsOpen == true)
{
string msg = comPort.ReadExisting();
MessageBox.Show(msg.Trim());
}
}
问题是,我正在部分地收到消息。就像,如果你发送“你好,你好吗”
我逐字逐句地收到它。我希望一次性完成。我能怎么做 ??
另外,是否可以检索应用程序发送和接收消息的端口名称?
到目前为止,通过串行端口一次性传输固定量数据的最简单方法是在数据前面添加长度标头。使用固定数量的字节作为长度(2-4 就足够了),然后读取length
使用同步数据字节Read
方法。当然,您也可以异步执行此操作,只需将长度保存在某个成员字段中,并在达到长度后立即执行后处理。
次佳方法是附加停止字符或单词。如果恰好是换行符,那么可以使用同步串行端口.ReadLine方法。否则,将接收到的数据收集在StringBuilder
,继续附加到StringBuilder
直到您到达停止字符,然后返回该字符的内容StringBuilder
直到(但不包括)停止字符。
如果你无法控制源数据,需要读取固定量的数据,and如果事先不知道这个尺寸是多少,那么你的工作将会变得更加困难。我认为真正处理这种情况的唯一方法是等待预定的超时,此时如果您没有收到任何新数据,则假设传输已结束。它不是特别可靠,这就是为什么大多数通信协议都使用上述设计之一的原因。
如果您考虑一下串行端口(或任何端口)的工作方式,只需通过电线推送位,那么很明显,如果无法预测未来,就无法知道传输是否已完成。如果您连接到远程主机(即通过调制解调器),并且该主机在传输完成后断开连接,那么您也许可以使用载波检测,但听起来并非如此。
希望这不是您当前所处的情况,并且您有一定的能力来控制源数据,或者您要连接的设备已经使用长度标头和/或停止模式。如果是的话,一定要使用它。否则,您可能会因使用超时而陷入困境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)