如何提供mscomm的通信效率

王二.麻子 2013-11-22 10:03:22
背景:
和AT89C51ED2的bootloader通信。ED2的bootloader会收到一个字节就立即返回这个字节。
使用了485,但485是个半双工的通信方式。而ED2的bootloader是双工通信。
如果上位机连续发送,ED2立即返回接受的字节,会在485总线产生冲突,从而不能正常通讯。

处理方法:
VB 用mscomm控件写上位机发送程序,一次发送1个字节,延时等待(或者在接收事件中再发生下一个字节)接收到返回的1个字节后再发送下一个字节。

问题:
VB的整个过程效率太低下了,57600波特率,2个停止位,发送64K数据(实际还要增加大约10%的命令头,尾等信息)需要大约22分钟。
而厂家提供的双工模式下的通讯程序只要1-2分钟。

即使双工变半双工,理论上应该2-4分钟就可以完成。

怎么提高速度?
...全文
379 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
王二.麻子 2013-12-06
  • 打赏
  • 举报
回复
引用 15 楼 worldy 的回复:
[quote=引用 11 楼 of123 的回复:] 很抱歉。不是有意要反驳,实在是希望初学者能够得到正确的信息。
讨论本来就是否定肯定否定肯定的过程,反驳很正常, 继续讨论: 你转换为4线后,硬件要如何搭建,才能实现两两通信?[/quote] 是不是发送2条线,接受两条线?
worldy 2013-11-29
  • 打赏
  • 举报
回复
引用 12 楼 spt_petrolor 的回复:
在地面使用工业级别的485,422芯片,都是简单的,即使更复杂而使用CAN总线都是可以的。 但是在特殊的应用中,比如温度需要达到175度或者更高的200度,又有多少芯片可以支持?这个要准备的资料,实验板,温度实验,现场实验,需要太多时间了。 感谢各位的回复,不论是修改485的配置为4线,还是422,都是要修改硬件,在现有经过试验,快要硬件定型的时候都是有困难的。 485这样2线形式的硬件,如果通讯的速度能是232速度的一般或者三分之一都是可以接受的。 所以现在的问题不是推翻已有的硬件,而是用更好的编程方法达到目标即可。
长线的场合,485的速度肯定比232快的多
worldy 2013-11-29
  • 打赏
  • 举报
回复
引用 11 楼 of123 的回复:
很抱歉。不是有意要反驳,实在是希望初学者能够得到正确的信息。
讨论本来就是否定肯定否定肯定的过程,反驳很正常, 继续讨论: 你转换为4线后,硬件要如何搭建,才能实现两两通信?
of123 2013-11-27
  • 打赏
  • 举报
回复
的确,MSComm 的切换模式时,特别是需要 Close 再 Open 时明显迟缓。此时宜用 API 来直接控制。
王二.麻子 2013-11-26
  • 打赏
  • 举报
回复
使用API,232同步方式,发送1字节,等待字节返回,然后发送下一个字节的方式,64K用了不到7分钟,速度还是提升不少。 貌似mscomm控件用了太多时间了。
王二.麻子 2013-11-26
  • 打赏
  • 举报
回复
在地面使用工业级别的485,422芯片,都是简单的,即使更复杂而使用CAN总线都是可以的。 但是在特殊的应用中,比如温度需要达到175度或者更高的200度,又有多少芯片可以支持?这个要准备的资料,实验板,温度实验,现场实验,需要太多时间了。 感谢各位的回复,不论是修改485的配置为4线,还是422,都是要修改硬件,在现有经过试验,快要硬件定型的时候都是有困难的。 485这样2线形式的硬件,如果通讯的速度能是232速度的一般或者三分之一都是可以接受的。 所以现在的问题不是推翻已有的硬件,而是用更好的编程方法达到目标即可。
worldy 2013-11-25
  • 打赏
  • 举报
回复
引用 8 楼 of123 的回复:
估计 Bootloader 不是他写的,是原厂商预装的。 另外,在 4-线全双工 方面,RS-422 与 RS-485 没有本质区别。 RS-485, like RS-422, can be made full-duplex by using four wires. Since RS-485 is a multi-point specification, however, this is not necessary in many cases. RS-485 and RS-422 can interoperate with certain restrictions.
还是有差别的 485在多点连接场合是可以两两通信的,改为4线制后,将失去这种功能,只能用于一个主机和若干从机的通信
of123 2013-11-25
  • 打赏
  • 举报
回复
估计 Bootloader 不是他写的,是原厂商预装的。 另外,在 4-线全双工 方面,RS-422 与 RS-485 没有本质区别。 RS-485, like RS-422, can be made full-duplex by using four wires. Since RS-485 is a multi-point specification, however, this is not necessary in many cases. RS-485 and RS-422 can interoperate with certain restrictions.
of123 2013-11-25
  • 打赏
  • 举报
回复
很抱歉。不是有意要反驳,实在是希望初学者能够得到正确的信息。
of123 2013-11-25
  • 打赏
  • 举报
回复
并非如此。 RS-485 是 RS-422 的超集,反过来说,可以认为 RS-422 是 RS-485 的子集。 1 RS-422 只能有一个主,其他都是从。 2 在 2 线模式下,RS-422 是单向的。扩展到 4 线可以双向通讯。 3 RS-485 是点对点架构。通常不采用 4 线的原因是,它天然地支持点之间相互通讯(2 线下可认为是半双工)。扩展为 4 线后,可以成为全双工。但多数应用下不需要这样做。 在 RS-485 总线系统中可以兼容 RS-422 的线段。 详见 EIA 相关规范。 具体到这个应用,在 4 线下两者功能上没有区别。
王二.麻子 2013-11-22
  • 打赏
  • 举报
回复
引用 1 楼 of123 的回复:
多种选择: 1 采用 4 线制 RS-485 架构,做成全双工。 2 仍采用 2 线制 RS-485 架构,每字节切换传输方向。在 PC 端,不要采用延时方式,而是使用 OnComm 事件触发,接收并发送一字节。
及时不是用延时,而是用OnComm,在事件触发后发送下一个字节,速度也不够快。 延时实际用的是不停查询输入缓冲区的字节数量。

Function mWait(chrCount As Long, Optional TimerOut As Long = 0) As Long
    '等待mscomm1的接收缓冲区至少有chrCount个字符
    Dim Count As Long
    Dim t As Double, EnterT As Double, mT As Double
    mT = IIf(TimerOut = 0, 2, TimerOut)
    'debug.Print TimerOut
    If TimerOut <> 0 Then Stop
    EnterT = Timer
    Count = MSComm1.InBufferCount
    Do While Not (Count >= chrCount Or t > mT)
        DoEvents
        Count = MSComm1.InBufferCount
        t = Timer - EnterT
    Loop
    mWait = IIf(t > mT, 1, 0)
End Function
是用OnComm的代码:

Dim WithEvents Com1 As MSComm
Dim Com1SendStr() As Byte'需要发送的字节数组
Dim Com1SendP As Integer'发送的字节在数组的位置
Dim Com1SendCount As Integer'发送的数组的长度
Dim Com1RevN As Integer'命令返回的自己数量
Dim Com1InBuf() As Byte'输入缓冲区数组,接收用
Dim Com1OutBuf() As Byte'输出缓冲区

With Com1
    Select Case Com1.CommEvent
       ' 事件
        Case comEvReceive   ' 收到 RThreshold # of chars.已经设置为1
            If .RThreshold = 1 Then
                If Com1SendP <> Com1SendCount Then'返回的是单字节,命令发送未完成
                    Com1SendP = Com1SendP + 1
                    If Com1SendP = Com1SendCount Then
                        .RThreshold = Com1RevN
                    End If
                    Com1OutBuf(0) = Com1SendStr(Com1SendP)
                    .Output = Com1OutBuf
                Else
                    
                End If
            Else
                .InputLen = 0
                Com1InBuf = .Input
                .RThreshold = 1
'GetAline函数,返回下一个准备发送的命令
'Com1SendString过程,准备发送GetALine返回的字符串所需要的一些准备,3表示命令发送成功后会额外返回3个字节
                Com1SendString GetALine, 3
            End If
       End Select
End With
使用OnComm后,程序逻辑不严谨,偶尔会出现发送中断的问题。 但是,从速度上讲,还是很慢。并没有比mWait快什么。
of123 2013-11-22
  • 打赏
  • 举报
回复
多种选择: 1 采用 4 线制 RS-485 架构,做成全双工。 2 仍采用 2 线制 RS-485 架构,每字节切换传输方向。在 PC 端,不要采用延时方式,而是使用 OnComm 事件触发,接收并发送一字节。
worldy 2013-11-22
  • 打赏
  • 举报
回复
为什么要每个字节处理?你可以一块块发-收 全双工可以使用422总线,反正51也支持全双工
王二.麻子 2013-11-22
  • 打赏
  • 举报
回复
感谢你的回复。 厂家的程序是双工模式下的通讯,如果要带着485转换,那根本就不能工作,所以所说厂家程序都是直接232下的通讯。 我现在准备程序,并不是在真实的485环境下,而是在232下实现半双工通讯,最后才会在485下使用。 下位机芯片的返回字节并不是重要的,但是如果要断开下位机芯片的Trx,就彻底失去下位机发送信息的能力了,如果用下位机芯片的接收脚来控制Trx,那么硬件需要改动,现在是不愿意去动的。 修改厂家的程序的目的在于: 下位机编程需要用到芯片在bootloader程序状态,而bootloader程序是用户程序不可修改的。 下位机进入bootloader程序,需要给ALE脚低电平,然后下位机复位。这样下位机需要一个开关,一个复位按钮,同时还要去掉485芯片而直接连接232转换成的TTL电平信号。 而在编程结束,下位机使用的过程中,是不需要这些按钮,开关的,又要把485芯片装上去。 这样的话太麻烦,从而有了自己写个编程下位机的程序的想法。 485转换芯片的速度我需要查下手册。 我在看看增加时间输出,找找时间消耗在什么地方。
of123 2013-11-22
  • 打赏
  • 举报
回复
还有一点,你和转换器的波特率是 57600,并不意味着 RS485 线上的波特率也是这么高。RS485 远距离传输时,波特率一般都低于 9600。距离越远,可实现的波特率就越低,有用 1200 的。 因此,与 RS232 传输相比,速度差个几倍十几倍,很正常。
of123 2013-11-22
  • 打赏
  • 举报
回复
其实很容易确定问题出在那个环节。 你的发送和接收到一个字节时,都 Debug.Print Timer。看看哪一个环节时间长。我估计是消耗在等待数据进来的环节上了。
of123 2013-11-22
  • 打赏
  • 举报
回复
PC 的速度是很快的。如果没有有意的延时,一般不会影响到串口通讯的速度。 问题是否出在 RS-232 转 RS-485 的环节? 你一定要得到芯片返回的字节吗?如果不是必要的,在从机硬件方面做一些改动,在这个操作期间,芯片的 TXD 不要连接到 RS485 去,RS485 的 2 条线仅用作主机发送的差分信号。把芯片返回数据忽略掉。 如果一定要返回的字节,就改成 4 线制,或者找能够更快转换发送方向的 232-485 转换器。 有一点你没有说清楚,厂家双向模式的程序不是用当前 RS485 环境测试的吧?

864

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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