串口地址转换的纯软件实现
武汉波仕电子有限公司 __向媛______
串口多机通信,就是RS-232/RS-485多机通信,要求通信的下位机必须带地址。通信时由上位机先发送某个下位机的地址,位于同一个网络中的所有下位机都同时读取这个地址的值,然后与自己的地址进行比较,如果地址相同则接收后面的数据,如果地址不同则不读取后面的数据。某些情况下,下位机也可以主动向上位机发送数据,但是必须按照预先设置的格式在数据前面加上下位机的地址,这样上位机才可以知道是哪一个下位机发来的数据。可是在许多情况下,下位机没有设置地址的功能,或者地址的格式不同,这就必须进行串口地址的转换。本文介绍了如何用纯软件实现串口地址的转换。
如果上位机与多个下位机之间需要通信,但是下位机却不带地址。纯软件实现串口地址的转换的原理就是利用计算机的两个串口,称为上位机串口和下位机串口,利用纯软件加上人为设置的地址。将上位机串口接收到的数据去掉地址后从下位机串口发送出去。将下位机串口接收到的数据加上地址后从上位机串口发送出去。 地址转换软件使用非常方便。首先根据用户通信程序的波特率进行波特率设置,特点是可以独立选择上位机串口(串口A)和下位机串口(串口B)不同的的波特率等。 设置好串口格式后,按“打开串口”。注意A和B两个串口都要打开。成功打开串口后会在“打开串口”按钮的旁边显示红色的圆圈。“打开串口”按钮下面为“清空计数”按钮和本串口接收和发送数据的个数。正常情况下,由于串口A接收到的数据减去地址码后立即发送给了串口B,所以串口A接收的计数比串口B发送的计数时多地址码的位数。同理串口B接收的计数比串口A发送的计数时少地址码的位数。 界面右下角有“字符格式”和“十六进制”的选项,默认为“字符格式”。当选择“十六进制”时,本软件可以实现16进制数据的格式转换,特别适合MODBUS等工控软件。 然后设置将要连接的下位机的地址码,包括地址码前缀、地址值、地址码后缀,这3部分合起来共同称为地址码。软件界面的左侧为 “上位机串口”;右侧“下位机串口”。 通信规则:上位机串口发送数据=地址码+下位机串口接收数据 或者:下位机串口发送数据=上位机串口接收数据—地址码 比如我们可以在软件界面中键入地址码前缀为###后缀为:(冒号),那么如果上位机串口收到 ###3:1234567,则地址为3的产品的下位机串口发送出 1234567(地址不是3的软件的下位机串口不发送任何数据),就是去帧头。地址码就是在地址值的前面加3个井号(###)和后面加一个冒号(:)的英文字符。如果地址为3的产品的下位机串口收到abcdefg ,则上位机串口发送出###3:abcdefg 就是加帧头。 纯软件实现串口地址转换的zui大优势就在于通用性。由于不同厂家对地址码的定义不一样,软件的实现可以非常方便地设置各种不同的地址编码方案。比如有以$开头,以!开头的地址编码,只要在本软件界面的地址码前缀填写$或者!,后缀空着即可。 在同一个RS-232/RS-485总线中可以同时接入的地址转换软件的数量理论上无限。甚至可以将不同地址编码方案的软件一起使用。使用时将这地址分别设置为不同的值即可。将所有地址转换软件的上位机串口共同接入到一个总线并接到上位机的RS-232或RS-485口。 计算机必须至少有两个RS-232或者RS-485串口,扩展串口可以采用USB-串口转换器等。这样就实现了两个串口之间的地址转换。 本软件用Visual Basic软件编写,串口用MSCOMM控件实现。核心功能就是将Mscomm1接收的数据立即送到Mscomm2的发送区。难点在于对16进制数据的转换处理。 Mscomm的核心代码如下: Private Sub MSComm1_OnComm() Dim BytReceived() As Byte Dim strBuff As String Dim i As Integer Select Case mEvent '事件发生 Case 2 MSComm1.InputLen = 0 '读入缓冲区全部内容 strBuff = MSComm1.Input '读入到缓冲区 If MSComm1.InputMode = comInputModeBinary Then BytReceived() = strBuff '如果是二进制接收模式则进行数据处理,否则直接显示字符串 For i = 0 To UBound(BytReceived) If Len(Hex(BytReceived(i))) = 1 Then strData = strData & "0" & Hex(BytReceived(i)) & " " '如果只有一个字符,则前补0,如F显示0F,zui后补空格 Else '方便显示观察如: 00 0F FE strData = AdressCode+strData & Hex(BytReceived(i)) & " " End If Next Text1 = strData Call hexSend2 ' '发送一个16进制 strData = "" Else Text1 = Text1 & strBuff If MSComm2.PortOpen = False Then MsgBox "请打开串口B" End If On Error GoTo uerror3 MSComm2.Output = strBuff Label14.Caption = Label14.Caption + Len(strBuff) '发送计数 End If End Select uerror3: End Sub 本文介绍的串口地址转换的纯软件方法和程序,对不带地址的串口多机通信具有一定的使用价值。本软件不仅仅实现了地址的转换,还同时实现了波特率、校验位、数据位和停止位的转换。文中介绍的软件可以从波仕电子的下载。纯软件地址转换的不足之处在于占用了一台计算机,并且必须配有两个专门用于地址转换的串口。如果要实现方便简单的地址转换,还是要用具有双串口的单片机或者FPGA。通过对单片机或者FPGA的两个串口进行地址等格式的设置,而两个串口在内部进行数据地址帧的加减。这种产品就是硬件串口地址转换器,我们将以另外文章《串口地址转换的纯硬件实现》予以介绍。 详细参数请到查看。咨询: 向 咨询订购:1256985485 :bosicomcn@