C# 串口读写

chenwangfeng 2015-01-21 11:02:18
需求描述:有15个信号箱,我需要不断读取这15信号箱的当前状态,通讯方式是串口通讯,我通过串口向一个信号箱发指令,然后该信号箱会回我一个指令。
使用的是 serialPort控件
问题描述:使用该控件的DataReceived方法有个问题,回的指令有7字节,但是第一个字节到了之后就触发该事件了,试过使用BytesToRead,但是想到万一没有收到估计的7个字节,会一直错下去。同时又要考虑到15箱子轮巡一遍时间不能太长,最好控制在1秒左右,不知道各位大神是否有好的建议!
...全文
337 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
leafmao 2015-01-22
  • 打赏
  • 举报
回复
引用 1 楼 wyd1520 的回复:
看一下这个吧,http://blog.csdn.net/wyd1520/article/details/23822313 这个也是为论坛另一网友跟你提的一样的问题写的。 这是当时他提的原贴子 http://bbs.csdn.net/topics/390316188
果然是我以前提过的那个问题。。。 楼主可以参考参考,其实关键就是把接收到的数据保存好然后去查询是否符合条件。 如果要求15个箱子的轮询在1秒内完成,是一个箱子返回了正确的指令后然后向下一个箱子发送指令吗?如果是这样,DataReceived事件可能无法在1秒内完成,可以考虑调用API,那个比较快
於黾 2015-01-22
  • 打赏
  • 举报
回复
收到数据先放缓冲区,比如定义一个List<byte>来临时存放数据,收到就往里add,都add完了判断一下长度,太短就等下次接收到数据再说.够长了就要判断起始,结尾,校验,看是否合法的数据,还是传输过程中受干扰变成乱码了,处理完remove
chenwangfeng 2015-01-22
  • 打赏
  • 举报
回复
还有一个问题追问下,假设我接受的数据是 AA BB CC DD EE FF GG,要是在某一个次我接受到的数据是 AA BB CC DD,剩下来的等到我下次读缓存的开头是EE FF GG,这个断掉的一条数据怎么处理?
chenwangfeng 2015-01-22
  • 打赏
  • 举报
回复
引用 1 楼 wyd1520 的回复:
看一下这个吧,http://blog.csdn.net/wyd1520/article/details/23822313 这个也是为论坛另一网友跟你提的一样的问题写的。 这是当时他提的原贴子 http://bbs.csdn.net/topics/390316188
这个方法我试过,不知道是不是中间的判断多了,感觉运行的有点慢。我是发完上一个信号箱处理完后发下一个信号箱,发完15号再发1号,中间处理结果还要保存到数据库。API的方法想测试下,没写成功!
yalunwang123 2015-01-22
  • 打赏
  • 举报
回复
再说一句,如果时间要求比较短,可以考虑开线程
yalunwang123 2015-01-22
  • 打赏
  • 举报
回复
串口的上位机我也做过,因为串口这个东西是比较复杂的,比如他要发7个字节的数据,有可能第一次就发了2个字节,第二次又发了5个,这两次都会触发那个DataReceived事件,解决办法其实也很简单: 串口通信一般都有帧头,帧结束符,帧长度 所以你要先判断帧头,用listbyte<>数组将几次接收到的数据放到一个数组里面在处理。就是按上面那3个条件进行判断,存到数组,其实不难,楼主好好想想
本拉灯 2015-01-21
  • 打赏
  • 举报
回复
看一下这个吧,http://blog.csdn.net/wyd1520/article/details/23822313 这个也是为论坛另一网友跟你提的一样的问题写的。 这是当时他提的原贴子 http://bbs.csdn.net/topics/390316188

111,096

社区成员

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

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

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