您现在所在的是:

串口通信

回帖:2个,阅读:638 [上一页] [1] [下一页]
2943
1256985485
文章数:1
年度积分:50
历史总积分:2943
注册时间:2009/9/21
发站内信
发表于:2013/10/10 15:03:50
#0楼
   串口通信,就是RS-232/RS-485通信,要求通信的双方波特率等通信格式一样才可以通信成功。可是在许多情况下,两种不同格式比如不同波特率的串口也要相互通信,这就必须进行串口波特率等格式的转换。本文介绍了如何用纯软件实现串口波特率的转换。
如果串口设备1与串口设备2之间需要通信,但是它们之间的通信波特率不一样。纯软件实现串口波特率的转换的原理就是利用计算机的两个串口,称为串口A和串口B,分别设置为不同的波特率、不同的校验位、不同的数据位和不同的停止位。其中串口A按照串口A设置的波特率等格式接收数据立即从串口B按照串口B设置的波特率等格式发送出去,同样串口B以串口B设置波特率等格式收到的数据立即从串口A以串口A设置的波特率等格式发送出去。
附件 a3.jpg


将计算机的串口A接设备1,串口A的通信波特率设置为设备1的波特率、校验位、数据位和停止位。将计算机的串口B接设备2,串口B的通信波特率设置为设备2的波特率、校验位、数据位和停止位。计算机必须至少有两个RS-232串口,扩展串口可以采用USB-串口转换器等。这样就实现了串口设备1与串口设备2之间的通信。
附件 a4.jpg



串口波特率转换软件的界面如图。左边分别是两个串口的设置框,分别可以设置COM口的号码、波特率、校验位、数据位、停止位,默认的格式为(9600,N,8,1)。可以选择的COM口号码为1到16号。COM串口号可以从操作系统的“设备管理器”只能够的“端口”看到。波特率的可选择范围为:256000、128000、115200、57600、38400、28800、19200、14400、9600、 4800、2400、1200、600。校验位可选择:n(无)、o(偶)、e(奇)。数据位可选择:8、7、6、5、4。停止位可选择1和0。

设置好串口格式后,按“打开串口”。注意A和B两个串口都要打开。成功打开串口后会在“打开串口”按钮的旁边显示红色的圆圈。“打开串口”按钮下面为“清空计数”按钮和本串口接收和发送数据的个数。正常情况下,由于串口A接收到的数据都立即发送给了串口B,所以串口A接收的计数与串口B发送的计数时一样的。同理串口B接收的计数与串口A发送的计数时一样的。

串口波特率转换软件的界面右边为测试和检测部分,正常工作时不需要操作。按“手动发送A串口”可以测试串口A的设置是否生效,是否可以正确与设备1通信,接收到的数据显示在“接收区A”框内。串口B的部分是同样的功能。右下角有“字符格式”和“十六进制”的选项,默认为“字符格式”。当选择“十六进制”时,本软件可以实现16进制数据的格式转换,特别适合MODBUS等工控软件。
如果在软件界面上只打开一个串口,比如串口A或者串口B,那么本软件就是一个功能齐全的串口调试助手软件,可以进行每个串口的设置、数据收发等。
本软件用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 MSComm1.CommEvent    '事件发生

           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,最后补空格

               Else                      '方便显示观察如: 00 0F FE

                   strData = 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
4798
576187527
文章数:2422
年度积分:50
历史总积分:4798
注册时间:2010/8/1
发站内信
发表于:2013/10/10 21:49:07
#1楼
学习了
-18
a1431897797
文章数:36
年度积分:-18
历史总积分:-18
注册时间:2014/9/19
发站内信
发表于:2014/9/19 22:11:15
#2楼
期待提供软件下载,或者更加详细的介绍。

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

62.4004