搜索
bottom↓
回复: 11

【求助】关于C#窗体中串口接收

[复制链接]

出0入8汤圆

发表于 2015-3-30 08:11:36 | 显示全部楼层 |阅读模式
究竟怎样才能实时性好,我的做法:
1.        使用Timer控件,每200msTick一次
2.        在Tick事件中向串口发送数据(MODBUS RTU)
3.        serialPort_DataReceived 事件中,先休眠线程5ms(网上的大神好像都有这句,我也不知道为啥),再处理回复的数据。再跨线程调用控件,把串口的数据解析出来,放到TextBox里。发现几秒才变一次

大侠们快来看看吧,小弟先谢过了

PS:串口接收数据,每次都是11个字节,所以触发事件的阀值也写的11.

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-3-30 09:50:06 | 显示全部楼层
本帖最后由 alitasoft 于 2015-3-30 09:52 编辑

楼上的方法太慢了,不用定时器,第三点说的实际上很清楚:
DataReceived事件会阻塞当前线程,如果没有数据就一直阻塞,当有数据到达时就可以从缓冲区中读取数据
——这一点和中断机制非常类似:串口读取线程和主任务线程分离,当有数据到达时,系统(来源于底层硬件)会产生数据到达中断,然后由OS通知你的程序

这里sleep(5ms)没必要,反而会影响实时性。

这是08年写的一个通讯组件的调度模型,1个线程用于数据读取和发送,多个线程用于数据处理,中间通过适配器进行数据/指令调度
双缓冲可以做到基本无延迟

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-30 09:56:32 | 显示全部楼层
定时器模式相当于你每间隔XXXms去询问一下,总体上而言和使用循环去检测有无没啥区别,不过定时器可以避免阻塞当前进程,不会出现页面刷新、无法操作这样的问题

至于“放到TextBox里。发现几秒才变一次”这个还取决于对Received缓冲区的使用方式
其中有这么一句话
由于 SerialPort 类会缓冲数据,而 BaseStream 属性内包含的流则不缓冲数据,因此二者在可读字节数量上可能会不一致。 BytesToRead 属性可以指示有要读取的字节,但 BaseStream 属性中包含的流可能无法访问这些字节,原因是它们已缓冲到 SerialPort 类中

出0入8汤圆

 楼主| 发表于 2015-3-30 10:00:48 | 显示全部楼层
alitasoft 发表于 2015-3-30 09:56
定时器模式相当于你每间隔XXXms去询问一下,总体上而言和使用循环去检测有无没啥区别,不过定时器可以避免 ...

谢谢你,我突然发现我的下位机是出厂设置的1.38s更新一次,改为50ms后情况大为改善

出0入0汤圆

发表于 2015-3-30 11:28:57 | 显示全部楼层
休眠哪个线程5ms?

出0入8汤圆

 楼主| 发表于 2015-3-30 12:22:06 | 显示全部楼层
sbk100 发表于 2015-3-30 11:28
休眠哪个线程5ms?

this.thread.sleep(5);

出0入0汤圆

发表于 2015-3-30 12:46:54 | 显示全部楼层

这句话是不是相当于单片机里的delay_ms(5)?

出0入8汤圆

 楼主| 发表于 2015-3-30 12:54:05 | 显示全部楼层
sbk100 发表于 2015-3-30 12:46
这句话是不是相当于单片机里的delay_ms(5)?

不是的,除非你的单片机上了操作系统

出0入0汤圆

发表于 2015-3-30 13:34:55 | 显示全部楼层
百里屠苏 发表于 2015-3-30 12:54
不是的,除非你的单片机上了操作系统

那为啥要休眠5ms呢?

出0入0汤圆

发表于 2015-3-30 14:39:25 | 显示全部楼层
本帖最后由 error_dan 于 2015-3-30 14:42 编辑



----------------------------
图文混排好麻烦啊。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-31 08:56:08 | 显示全部楼层
error_dan 发表于 2015-3-30 14:39
----------------------------
图文混排好麻烦啊。。。

谢谢你的讲解 但是我理解的是只要串口收到数据就会触发serialPort_DataReceived 事件,如果serialPort_DataReceived是一个线程的话,cpu也不会因为执行这个线程而不去执行其他线程啊
线程间的切换不是一直是CPU自己调度的吗,即使不休眠这5ms,CPU也应该可以去干其他的事情吧?

出0入8汤圆

 楼主| 发表于 2015-3-31 14:53:48 | 显示全部楼层
error_dan 发表于 2015-3-30 14:39
----------------------------
图文混排好麻烦啊。。。

果然阻塞线程了,我在主界面上放了checkBox,点好几次才点到。郁闷
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表