关于VB作为上位机RS232改485通信协议问题

时间:2021-03-06 10:11:48
用VB作为上位机,本来是用RS232实现串口通信的,但是由于RS232的通信距离短,现在希望改成485的~我上网查了下资料,知道232是全双工工作,485是半双工工作的,但是对于通信协议还是有点迷茫~现在我将我232的通信协议发上来,希望大神们帮我改一下适合于485的~而且我想知道如果485是半双工的,那么怎么控制他来开和关呢~请指教。。谢谢了!!原程序如下
 Timer1.Enabled = True

MSComm1.InBufferSize = 2
    
    MSComm1.InBufferCount = 0
    
    MSComm1.OutBufferCount = 0
    
    MSComm1.InputMode = comInputModeBinary 
    MSComm1.CommPort = 3
    MSComm1.Settings = "9600,N,8,1"
    
    MSComm1.RThreshold = 24
    
    MSComm1.InputLen = 24 
    
    MSComm1.OutBufferSize = 1
    
    Timer1.Interval = 20

18 个解决方案

#1


首先,你得有一个概念,RS232和RS485在硬件电路上就有区别。就程序而言,两者没有什么区别。要改,就得从硬件改起,换芯片。

#2


除了传输距离远,RS485 协议还支持一主多从。比较容易的改法:

1 从机改用 485 接口芯片。

2 主机端加一台 RS232 上行口的 RS485 集线器。这种集线器可以级联,便于扩展。

3 主机端程序要改:

  与任意一台从机会话时,必须先以地址帧(9-bit 格式)发送地址,然后切换回数据帧发送一条命令,接收一条应答。

  使用 VB 的 MSComm 控件比较麻烦的是,切换帧格式的时候,需要关闭串口,再重新打开,速度较慢。可以采用 API 或者用 VC++ 做动态库。

#3


恩,我上网查了下485的用法,但是不清楚的是用VB如何控制485的发和收~难道是用高低电平?我能不能用flag=0或者1来控制呢?

#4


引用 3 楼 ddw111 的回复:
恩,我上网查了下485的用法,但是不清楚的是用VB如何控制485的发和收~难道是用高低电平?我能不能用flag=0或者1来控制呢?

这是驱动程序该做的事情,不用你操心。

#5


在232口上装个485转换器就完事了,也就几十块钱,
貌似以前写的时候485发送的时候,接收区缓存被写入了送的数据,不过那时候不懂,没确定485口好坏,后来干脆用232转485的办法来处理了

#6


引用 4 楼 Veron_04 的回复:
引用 3 楼 ddw111 的回复:恩,我上网查了下485的用法,但是不清楚的是用VB如何控制485的发和收~难道是用高低电平?我能不能用flag=0或者1来控制呢?
这是驱动程序该做的事情,不用你操心。

就是DSP要控制的事?不需要我上位机做什么吗?

#7


引用 5 楼 bakw 的回复:
在232口上装个485转换器就完事了,也就几十块钱,
貌似以前写的时候485发送的时候,接收区缓存被写入了送的数据,不过那时候不懂,没确定485口好坏,后来干脆用232转485的办法来处理了

不行的,232是全双工,485是半双工~~要是那么简单我就开心死了。。。

#8


一般,如果你的上下位机使用应答式通信,那么可以直接将232转485,如果不是应答式,收发如果有可能同时进行,则不能转换(可转为422进行通信)

方法:假设,你原来已经可以使用232进行通信,那么到电子城买两个232-485转换头,其232端直接接入上位机及其下位机,使用一485线两端分别连接到转换器的485端,即可,软件无须进行任何更改

#9


引用 7 楼 ddw111 的回复:
Quote: 引用 5 楼 bakw 的回复:

在232口上装个485转换器就完事了,也就几十块钱,
貌似以前写的时候485发送的时候,接收区缓存被写入了送的数据,不过那时候不懂,没确定485口好坏,后来干脆用232转485的办法来处理了

不行的,232是全双工,485是半双工~~要是那么简单我就开心死了。。。

为什么不行,你两台电脑一直在同时交换数据?

#10


我以前做的是应答试,用的是232转485的,挺好的

#11


问题不在全双工还是半双工。

重要的是你的线路上是多从机还是单从机。

如果你的通讯线上是单一从机,那就很简单,你的主机只要使用数据帧发送命令,接收应答。格式与 RS232 相同,你加一个 RS232-485 转换器就可以了。

如果必须多从机,但是可以分开连线。那么,从机程序不用改,加 RS485 Hub。主机程序需要分地址和数据帧。地址帧用来使 Hub 分支数据信号。

如果多从机并联在同一线路中,则从机的程序也要改,要获取广播的地址帧,来判断是否应答。这种情况可以不用 Hub,用转接芯片或转接线即可。

如果你原来不是主从应答协议,两段都可以主动发送,就需要使用两路 RS485。也就是两端都要使用 2 个 RS232 接口,分别用于发送和接收。

#12


引用 11 楼 of123 的回复:
问题不在全双工还是半双工。

重要的是你的线路上是多从机还是单从机。

如果你的通讯线上是单一从机,那就很简单,你的主机只要使用数据帧发送命令,接收应答。格式与 RS232 相同,你加一个 RS232-485 转换器就可以了。

如果必须多从机,但是可以分开连线。那么,从机程序不用改,加 RS485 Hub。主机程序需要分地址和数据帧。地址帧用来使 Hub 分支数据信号。

如果多从机并联在同一线路中,则从机的程序也要改,要获取广播的地址帧,来判断是否应答。这种情况可以不用 Hub,用转接芯片或转接线即可。

如果你原来不是主从应答协议,两段都可以主动发送,就需要使用两路 RS485。也就是两端都要使用 2 个 RS232 接口,分别用于发送和接收。
我的就是一个单从机,我网上买了232转485的转换器,那我买了装下试一下~谢谢大家的指点!

#13


引用 9 楼 bakw 的回复:
Quote: 引用 7 楼 ddw111 的回复:

Quote: 引用 5 楼 bakw 的回复:

在232口上装个485转换器就完事了,也就几十块钱,
貌似以前写的时候485发送的时候,接收区缓存被写入了送的数据,不过那时候不懂,没确定485口好坏,后来干脆用232转485的办法来处理了

不行的,232是全双工,485是半双工~~要是那么简单我就开心死了。。。

为什么不行,你两台电脑一直在同时交换数据?
不是一直,就是我先用VB的上位机设置一个温度值发给DSP,然后DSP就开始给我传送实时的温度值,期间需要设置缓冲什么的,我就是怕在DSP给我传送数据的时候我设置缓冲什么的会有冲突!

#14


引用 8 楼 worldy 的回复:
一般,如果你的上下位机使用应答式通信,那么可以直接将232转485,如果不是应答式,收发如果有可能同时进行,则不能转换(可转为422进行通信)

方法:假设,你原来已经可以使用232进行通信,那么到电子城买两个232-485转换头,其232端直接接入上位机及其下位机,使用一485线两端分别连接到转换器的485端,即可,软件无须进行任何更改
恩,我买来试一下!谢谢你给的方法~如果成功了就万分感谢了!

#15


只接收的话没什么问题的

#16


引用 11 楼 of123 的回复:
问题不在全双工还是半双工。

重要的是你的线路上是多从机还是单从机。

如果你的通讯线上是单一从机,那就很简单,你的主机只要使用数据帧发送命令,接收应答。格式与 RS232 相同,你加一个 RS232-485 转换器就可以了。

如果必须多从机,但是可以分开连线。那么,从机程序不用改,加 RS485 Hub。主机程序需要分地址和数据帧。地址帧用来使 Hub 分支数据信号。

如果多从机并联在同一线路中,则从机的程序也要改,要获取广播的地址帧,来判断是否应答。这种情况可以不用 Hub,用转接芯片或转接线即可。

如果你原来不是主从应答协议,两段都可以主动发送,就需要使用两路 RS485。也就是两端都要使用 2 个 RS232 接口,分别用于发送和接收。


大姐你这个说法刚好是反的,问题的关键是在于工作于双工还是半双工,如果是工作于半双工还是双工,那么无论,是单从机还是多从机,都可以转换为485

如果是工作于双工模式,那么只能是使用232,并且,无法使用多从机

#17


引用 15 楼 bakw 的回复:
只接收的话没什么问题的
不是只接收,我还要用上位机给DSP设置温度的,所以还是有发送的

#18


引用 17 楼 ddw111 的回复:
Quote: 引用 15 楼 bakw 的回复:

只接收的话没什么问题的
不是只接收,我还要用上位机给DSP设置温度的,所以还是有发送的



半双工并不是单向发送数据或接收数据,而是,有收有发,只是收发不会在同一瞬间发生;比如两个人对话,你一句,我一句,两个人不会同时说,一般,总是要等到对方说完你再说,收和发在时间上错开,这就是半双工。

但是如果你是控制视频装置,并通过串口接收视频数据(假设的操作,实际可能很难实现,因为串口标准的速度太慢),视频数据连续不断的传人串口,控制命令随时发送给装置,在任意的瞬间,允许双向数据流,这就是双工

#1


首先,你得有一个概念,RS232和RS485在硬件电路上就有区别。就程序而言,两者没有什么区别。要改,就得从硬件改起,换芯片。

#2


除了传输距离远,RS485 协议还支持一主多从。比较容易的改法:

1 从机改用 485 接口芯片。

2 主机端加一台 RS232 上行口的 RS485 集线器。这种集线器可以级联,便于扩展。

3 主机端程序要改:

  与任意一台从机会话时,必须先以地址帧(9-bit 格式)发送地址,然后切换回数据帧发送一条命令,接收一条应答。

  使用 VB 的 MSComm 控件比较麻烦的是,切换帧格式的时候,需要关闭串口,再重新打开,速度较慢。可以采用 API 或者用 VC++ 做动态库。

#3


恩,我上网查了下485的用法,但是不清楚的是用VB如何控制485的发和收~难道是用高低电平?我能不能用flag=0或者1来控制呢?

#4


引用 3 楼 ddw111 的回复:
恩,我上网查了下485的用法,但是不清楚的是用VB如何控制485的发和收~难道是用高低电平?我能不能用flag=0或者1来控制呢?

这是驱动程序该做的事情,不用你操心。

#5


在232口上装个485转换器就完事了,也就几十块钱,
貌似以前写的时候485发送的时候,接收区缓存被写入了送的数据,不过那时候不懂,没确定485口好坏,后来干脆用232转485的办法来处理了

#6


引用 4 楼 Veron_04 的回复:
引用 3 楼 ddw111 的回复:恩,我上网查了下485的用法,但是不清楚的是用VB如何控制485的发和收~难道是用高低电平?我能不能用flag=0或者1来控制呢?
这是驱动程序该做的事情,不用你操心。

就是DSP要控制的事?不需要我上位机做什么吗?

#7


引用 5 楼 bakw 的回复:
在232口上装个485转换器就完事了,也就几十块钱,
貌似以前写的时候485发送的时候,接收区缓存被写入了送的数据,不过那时候不懂,没确定485口好坏,后来干脆用232转485的办法来处理了

不行的,232是全双工,485是半双工~~要是那么简单我就开心死了。。。

#8


一般,如果你的上下位机使用应答式通信,那么可以直接将232转485,如果不是应答式,收发如果有可能同时进行,则不能转换(可转为422进行通信)

方法:假设,你原来已经可以使用232进行通信,那么到电子城买两个232-485转换头,其232端直接接入上位机及其下位机,使用一485线两端分别连接到转换器的485端,即可,软件无须进行任何更改

#9


引用 7 楼 ddw111 的回复:
Quote: 引用 5 楼 bakw 的回复:

在232口上装个485转换器就完事了,也就几十块钱,
貌似以前写的时候485发送的时候,接收区缓存被写入了送的数据,不过那时候不懂,没确定485口好坏,后来干脆用232转485的办法来处理了

不行的,232是全双工,485是半双工~~要是那么简单我就开心死了。。。

为什么不行,你两台电脑一直在同时交换数据?

#10


我以前做的是应答试,用的是232转485的,挺好的

#11


问题不在全双工还是半双工。

重要的是你的线路上是多从机还是单从机。

如果你的通讯线上是单一从机,那就很简单,你的主机只要使用数据帧发送命令,接收应答。格式与 RS232 相同,你加一个 RS232-485 转换器就可以了。

如果必须多从机,但是可以分开连线。那么,从机程序不用改,加 RS485 Hub。主机程序需要分地址和数据帧。地址帧用来使 Hub 分支数据信号。

如果多从机并联在同一线路中,则从机的程序也要改,要获取广播的地址帧,来判断是否应答。这种情况可以不用 Hub,用转接芯片或转接线即可。

如果你原来不是主从应答协议,两段都可以主动发送,就需要使用两路 RS485。也就是两端都要使用 2 个 RS232 接口,分别用于发送和接收。

#12


引用 11 楼 of123 的回复:
问题不在全双工还是半双工。

重要的是你的线路上是多从机还是单从机。

如果你的通讯线上是单一从机,那就很简单,你的主机只要使用数据帧发送命令,接收应答。格式与 RS232 相同,你加一个 RS232-485 转换器就可以了。

如果必须多从机,但是可以分开连线。那么,从机程序不用改,加 RS485 Hub。主机程序需要分地址和数据帧。地址帧用来使 Hub 分支数据信号。

如果多从机并联在同一线路中,则从机的程序也要改,要获取广播的地址帧,来判断是否应答。这种情况可以不用 Hub,用转接芯片或转接线即可。

如果你原来不是主从应答协议,两段都可以主动发送,就需要使用两路 RS485。也就是两端都要使用 2 个 RS232 接口,分别用于发送和接收。
我的就是一个单从机,我网上买了232转485的转换器,那我买了装下试一下~谢谢大家的指点!

#13


引用 9 楼 bakw 的回复:
Quote: 引用 7 楼 ddw111 的回复:

Quote: 引用 5 楼 bakw 的回复:

在232口上装个485转换器就完事了,也就几十块钱,
貌似以前写的时候485发送的时候,接收区缓存被写入了送的数据,不过那时候不懂,没确定485口好坏,后来干脆用232转485的办法来处理了

不行的,232是全双工,485是半双工~~要是那么简单我就开心死了。。。

为什么不行,你两台电脑一直在同时交换数据?
不是一直,就是我先用VB的上位机设置一个温度值发给DSP,然后DSP就开始给我传送实时的温度值,期间需要设置缓冲什么的,我就是怕在DSP给我传送数据的时候我设置缓冲什么的会有冲突!

#14


引用 8 楼 worldy 的回复:
一般,如果你的上下位机使用应答式通信,那么可以直接将232转485,如果不是应答式,收发如果有可能同时进行,则不能转换(可转为422进行通信)

方法:假设,你原来已经可以使用232进行通信,那么到电子城买两个232-485转换头,其232端直接接入上位机及其下位机,使用一485线两端分别连接到转换器的485端,即可,软件无须进行任何更改
恩,我买来试一下!谢谢你给的方法~如果成功了就万分感谢了!

#15


只接收的话没什么问题的

#16


引用 11 楼 of123 的回复:
问题不在全双工还是半双工。

重要的是你的线路上是多从机还是单从机。

如果你的通讯线上是单一从机,那就很简单,你的主机只要使用数据帧发送命令,接收应答。格式与 RS232 相同,你加一个 RS232-485 转换器就可以了。

如果必须多从机,但是可以分开连线。那么,从机程序不用改,加 RS485 Hub。主机程序需要分地址和数据帧。地址帧用来使 Hub 分支数据信号。

如果多从机并联在同一线路中,则从机的程序也要改,要获取广播的地址帧,来判断是否应答。这种情况可以不用 Hub,用转接芯片或转接线即可。

如果你原来不是主从应答协议,两段都可以主动发送,就需要使用两路 RS485。也就是两端都要使用 2 个 RS232 接口,分别用于发送和接收。


大姐你这个说法刚好是反的,问题的关键是在于工作于双工还是半双工,如果是工作于半双工还是双工,那么无论,是单从机还是多从机,都可以转换为485

如果是工作于双工模式,那么只能是使用232,并且,无法使用多从机

#17


引用 15 楼 bakw 的回复:
只接收的话没什么问题的
不是只接收,我还要用上位机给DSP设置温度的,所以还是有发送的

#18


引用 17 楼 ddw111 的回复:
Quote: 引用 15 楼 bakw 的回复:

只接收的话没什么问题的
不是只接收,我还要用上位机给DSP设置温度的,所以还是有发送的



半双工并不是单向发送数据或接收数据,而是,有收有发,只是收发不会在同一瞬间发生;比如两个人对话,你一句,我一句,两个人不会同时说,一般,总是要等到对方说完你再说,收和发在时间上错开,这就是半双工。

但是如果你是控制视频装置,并通过串口接收视频数据(假设的操作,实际可能很难实现,因为串口标准的速度太慢),视频数据连续不断的传人串口,控制命令随时发送给装置,在任意的瞬间,允许双向数据流,这就是双工