serialport类如何判断接收到一帧数据?

夫山 2017-05-18 11:33:22
本人新手,刚入门.net开发几天。
在测试serialport类的时候,发送10个字节给程序,有时候收到2个字节,就触发了接收事件。
导致我收不到完整的一帧数据。
想知道这是什么原因?
...全文
727 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
夫山 2017-05-27
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
[quote=引用 2 楼 u014574806 的回复:] 帧头帧尾是可以的,但是我在想serialport的事件触发是什么机制的? 比如我一帧数据有10个字节发过来,为什么有的时候2个字节收到就触发了事件。 有的时候又是收到10个字节才触发事件。
你是从哪里看到说 serialport 一次收10个字节的呢?请贴出来你看到的东西。 例如 msdn 上第一句话就说“DataReceived 数据事件会在数据可枚举时的任何时间触发”,什么时候说过跟你发送数据端怎么编写代码、发几个字节之后停止发送有关了呢? msdn 文档充其量是告诉你说发送端如果发送 EOF 符号的话,会引起接收端立刻触发 DataReceived 事件,也没有说这之前在接收端就不会触发 DataReceived 事件。 msdn 还说接收端不会每一个字节都触发 DataReceived 事件,这也没有说要等多少个固定的字节数才触发。[/quote] 有点明白了!谢谢! 我现在理解的就是说,串口通信的过程中,可能会因为硬件原因,或者我线程处理的原因导致接收不足,就触发接收事件,所以最终还是要用头尾或者校验来保证消息的准确送达。 我原先的理解是,我一次性发送10个字节,或者我一次性发送20个字节,只要缓冲区足够大,就应该能保证在都接收完之后再触发
夫山 2017-05-18
  • 打赏
  • 举报
回复
帧头帧尾是可以的,但是我在想serialport的事件触发是什么机制的? 比如我一帧数据有10个字节发过来,为什么有的时候2个字节收到就触发了事件。 有的时候又是收到10个字节才触发事件。
angel6709 2017-05-18
  • 打赏
  • 举报
回复
枕头和真伪啊
  • 打赏
  • 举报
回复
串口对象的默认的接收缓冲区是 4K,虽然这很小,但是对于20年前的极慢速的串行设备也差不多可以了(对于快速的设备,你当然应该以测试为准来调整,例如改为10K)。 默认缓冲区足够大了,不会影响你“只能收两个字节”。接收数据本来就是这样的,跟网络质量有关,跟协议有关。总之你要使用信令协议格式来判断一个消息,而不是根据什么 Sleep 时间的长短来判断。
exception92 2017-05-18
  • 打赏
  • 举报
回复
只要想Com口写数据到缓冲区就会触发, 这就是为什么一般都要在接受数据的时候 进行数据有效性校验工作。 要确定所有的serialport 参数设置正确。
  • 打赏
  • 举报
回复
引用 2 楼 u014574806 的回复:
帧头帧尾是可以的,但是我在想serialport的事件触发是什么机制的? 比如我一帧数据有10个字节发过来,为什么有的时候2个字节收到就触发了事件。 有的时候又是收到10个字节才触发事件。
你是从哪里看到说 serialport 一次收10个字节的呢?请贴出来你看到的东西。 例如 msdn 上第一句话就说“DataReceived 数据事件会在数据可枚举时的任何时间触发”,什么时候说过跟你发送数据端怎么编写代码、发几个字节之后停止发送有关了呢? msdn 文档充其量是告诉你说发送端如果发送 EOF 符号的话,会引起接收端立刻触发 DataReceived 事件,也没有说这之前在接收端就不会触发 DataReceived 事件。 msdn 还说接收端不会每一个字节都触发 DataReceived 事件,这也没有说要等多少个固定的字节数才触发。
  • 打赏
  • 举报
回复
quote=引用 2 楼 u014574806 的回复:] 帧头帧尾是可以的,但是我在想serialport的事件触发是什么机制的? 比如我一帧数据有10个字节发过来,为什么有的时候2个字节收到就触发了事件。 有的时候又是收到10个字节才触发事件。[/quote] 你是从哪里看到说 serialport 一次收10个字节的呢?请贴出来你看到的东西。 例如 msdn 上第一句话就说“DataReceived 数据事件会在数据可枚举时的任何时间触发”,什么时候说过跟你发送数据端怎么编写代码、发几个字节之后停止发送有关了呢?
xuggzu 2017-05-18
  • 打赏
  • 举报
回复
1,设置接收缓冲大小为10
2,按一楼说的

不是一次发10个,那接收可能也不是一次收10个,很正常。缓冲太小的话也会多次接收。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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