打印

串口通信实时性

[复制链接]
2960|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请教下大家,本人想采用RS422进行高速通信,目标速率希望能达到1Mbit/s及以上,实际调试中发生一个问题,虽然很多的USB转串口或者PCI转串口都能满足这个速率,但是由于我是想通过RS485对PC及下位机之间不断的进行通信,所以虽然通信速率能到1Mbit/s。但是受限制于通信的实时性,实际的通信速率远低于1Mbit/s。像USB转串口最高只能达到1ms,PCI转串口时不管是发送数据还是接收数据时也都有一定的延时。举一个例子,我上位机是采用VB.net的SerialPort控件实现的,发送采用  buffer(0) = &H55  buffer(1) = &H55  buffer(2) = &H55  sIo.Write(buffer, 0, 2) sIo.Write(buffer, 0, 2)与 sIo.Write(buffer, 0, 3) sIo.Write(buffer, 0, 1),同样是发送4个字节的数据,波形有很大的不同如附件,如果像单片机进行操作时波形应该都是连续的中间不应该出现长时间的间隔,Vb.net如何才能像单片机那样操作串口呢?否则虽然串口的通信速率比较高,但是由于实时性差,实际的速率会远低于设定的波特率的理想速率。请问大家有什么好的建议,我的初衷是想问有没有能够在VB.net下能够通信满足快速及高实时性的通信方式,谢谢大家。

3字节 1字节.jpg (314.93 KB )

3字节+1字节

3字节+1字节

2字节 2字节.jpg (338.22 KB )

2字节 + 2字节

2字节 + 2字节

使用特权

评论回复

相关帖子

沙发
William1994| | 2020-8-29 12:49 | 只看该作者
看你的示波器测试结果,电脑的速度慢于了串口的速度,不大可能的事情,你release模式看看。
或者你改到9600 bps,看看波形还是不连着的吗? 电脑程序足够快的话,发完3个字节再发一个字节,应该波形上会连起来。

使用特权

评论回复
板凳
skky2010|  楼主 | 2020-8-29 13:22 | 只看该作者
William1994 发表于 2020-8-29 12:49
看你的示波器测试结果,电脑的速度慢于了串口的速度,不大可能的事情,你release模式看看。
或者你改到9600 ...

这个和波特率及是否为Release没有关系

使用特权

评论回复
地板
William1994| | 2020-8-30 09:46 | 只看该作者
本帖最后由 William1994 于 2020-8-30 09:52 编辑
skky2010 发表于 2020-8-29 13:22
这个和波特率及是否为Release没有关系

我做过很多windows的串口驱动,这些里面基本都用到串口,而且流量是关键指标。
非常熟悉16550标准和windows里面的ringbuffer及io排序的细节。c、c++、vb、vb.net、labview、cvi、mathlab等等语言的串口的波形都测过很多。
如果你试过了,波特率降低到9600,还没有连一起,那么可能是你的电脑的主频太低了,或者CPU太卡了,比如虚拟机里面,或者电脑开了多个快播同时看视频等。还有就是vb里面按shift+F2看看是不是性能查看器开了。
System.IO.SerialPort类的效率非常高,而且安全的很。

使用特权

评论回复
5
skky2010|  楼主 | 2020-8-31 11:17 | 只看该作者
William1994 发表于 2020-8-30 09:46
我做过很多windows的串口驱动,这些里面基本都用到串口,而且流量是关键指标。
非常熟悉16550标准和window ...

多谢你的建议,我试了9600的波特率,波形还是不连续,我电脑是I3处理器,3.59G的处理速度,这个电脑只是用于跑串口软件的,没有处理其他任务,我怀疑这个和PCI转422卡的驱动有关,因为我试不同的PCI卡,延时时间是不一样的。但是基本上都是100us

使用特权

评论回复
6
oufuqiang| | 2020-8-31 11:47 | 只看该作者
实在不行就先打成一个长包再发了

使用特权

评论回复
7
skky2010|  楼主 | 2020-8-31 14:00 | 只看该作者
oufuqiang 发表于 2020-8-31 11:47
实在不行就先打成一个长包再发了

嗯,只能想其他办法解决了,后续要研究下PCI协议了解下具体哪边影响了实时性

使用特权

评论回复
8
dukedz| | 2020-8-31 15:10 | 只看该作者
本帖最后由 dukedz 于 2020-8-31 16:07 编辑

對於 RS485,我喜歡用 cdbus 協議,可以使用硬件打包解包,幾乎能跑滿總線,最快能上到 50 Mbps,是的,你沒有看錯,而且可以實現多主對等傳輸,不用擔心有衝突。。。
對於實時性不高的 PC 系統,也可以很適合,因爲發送數據是硬件乒乓操作,正在發送一幀數據的同時,電腦軟件可以把下一幀數據慢慢寫入控制器,等上一幀發送完畢的時候,瞬間交換一下又可以接着無縫發送。
不過,對於 PC,要性能高,可以使用 pcie 直接轉 cdbus 的控制器(不走傳統串口框架),配合實時 linux 才能做到最高實時性,用本身就沒有實時性可言的 windows 來說,還是使用 usb 串口轉 cdbus 比較方便(譬如 12Mbps 的 USB 接口,無論軟件設置 cdc 串口的波特率爲多少,實際傳輸都是 12Mbps,要快很多,想更快可以用 480Mbps 的 USB)。。。

github.com/dukelec/cdbus_ip (cdbus 控制器完全開源)

使用特权

评论回复
9
xxdjaj| | 2020-8-31 15:55 | 只看该作者
不错

使用特权

评论回复
10
William1994| | 2020-8-31 18:46 | 只看该作者
skky2010 发表于 2020-8-31 14:00
嗯,只能想其他办法解决了,后续要研究下PCI协议了解下具体哪边影响了实时性 ...

PCI很快,问题应该在PCI转422的部分,如果是FPGA的可能快一些,如果是单片机的可能慢一些。
不过这也不是绝对的,FPGA也可以做的很慢,只要是作者想玩的技术够高深,FPGA里面也可以跑软核。

使用特权

评论回复
11
skky2010|  楼主 | 2020-9-1 08:02 | 只看该作者
dukedz 发表于 2020-8-31 15:10
對於 RS485,我喜歡用 cdbus 協議,可以使用硬件打包解包,幾乎能跑滿總線,最快能上到 50 Mbps,是的,你 ...

谢谢,有空学习下,但是按照我的理解是USB设备最高的响应速率是1ms,所以最终的速率可能还是达不到要求,USB转串口的速率我也能设置到16Mbit/s进行通讯,但是受限于USB实时性的问题所以最终的速率不高了

使用特权

评论回复
12
skky2010|  楼主 | 2020-9-1 08:06 | 只看该作者
William1994 发表于 2020-8-31 18:46
PCI很快,问题应该在PCI转422的部分,如果是FPGA的可能快一些,如果是单片机的可能慢一些。
不过这也不是 ...

我用的PCI转串口是市场上买的现成的产品,多半是PCI转串口部分有发送延时或者有延时发送的操作,有空学习下这个部分的驱动开发,然后给大家汇报下

使用特权

评论回复
13
tianxj01| | 2020-9-1 10:50 | 只看该作者
skky2010 发表于 2020-9-1 08:06
我用的PCI转串口是市场上买的现成的产品,多半是PCI转串口部分有发送延时或者有延时发送的操作,有空学习 ...

VB.net的SerialPort控件估计是这个现象的原因。
各种上位机串口控件对串口的效率影响非常大,这个我们过去就测试到过。
VB.net的SerialPort控件我没用过,不能肯定的下结论,但是非常像过去我们用过某些效率比较低的控制的实际表现。
关键是,对于单字节操作,很多控件都有特定的处理周期,一般的表现就是效率比较低,传统的做法就是成组发送,开辟专门的缓存区域,然后成串发送。就可以直接接近目标数据速率。

使用特权

评论回复
14
ipman| | 2020-9-1 23:48 | 只看该作者
实时性差是因为读取线程优先级问题,还有空闲时间设置问题,一般读取线程都有个sleep的,哪怕是sleep(1),实际也是远大于1ms,windows本身就不是实时系统。能做到毫秒级响应已经不错了

使用特权

评论回复
15
madboy21| | 2020-9-2 00:45 | 只看该作者
1、数据肯定可以连续输出,要么你上位机问题,要么相关设计有问题。2、即然是串口,那就是超低低速通信,用于传输出简单指令或少量数据传输。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

145

帖子

1

粉丝