回 帖 发 新 帖 刷新版面

主题:[原创]求教串口



一.仪表: 




1.      所用的外围设备是仪表,仪表采用的通讯方式是:连续发送方式。 




2.      主机与仪表的连接方式是:RS232。 




3.      仪表的接口参数:(1)波特率:4800 




                  (2)数据位:所有的数据均为ASCII码,每组数据由10位组成,第一位为起始位,第十位为停止位,中间八位为数据位。 




4.仪表以连续发送方式时,数据以ASCII码方式输出,每帧数据共有9组组成(包括小数点)。数据传送先底位后高位,每帧数据间有一组间隔符“=”,比如仪表显示70.15,连续发送51.07000=51.07000=51.07000=……。 




二.VB 




1.当仪表传送命令过来时,系统自动判断,并显示结果。 




(1)建一个VB项目,在窗体上添加一个MSCOMM控件,作为串行通讯通道,并对MSCOMM控件的一些属性进行设置。 




(2)添加一个文本框控件,作为显示仪表所传送过来的字符的控件。要求文本框的内容和仪表显示的一样。

程序如下:

Option Explicit

Private Sub Form_Load()
MSC.CommPort = 2
MSC.Settings = "1200,n,8,1"
MSC.InBufferCount = 0
MSC.InputLen = 1
MSC.RThreshold = 1
MSC.PortOpen = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSC.PortOpen = True Then MSC.PortOpen = False
End Sub

Private Sub Mscomm1_Oncomm()
Select Case MSComm1.CommEvent
Case comEvReceive
Text2.Text = MSComm1.Input
End Select
End Sub

我用了MMC控件,但是取出来的数和我想要的数不一样,仪表上的数是12.52,但我读出的数却是=25.210=25.210=.....不知道怎么调过来,而且我只要一个就行了 

 
 
 
 2008-9-1 19:46:59 

回复列表 (共7个回复)

沙发

这不就是你要的吗?
[quote]每帧数据共有9组组成(包括小数点)。数据传送先底位后高位,每帧数据间有一组间隔符“=”,比如仪表显示70.15,连续发送51.07000[/quote]

板凳

不是,我要的是文本框和仪表显示的一样!现在文本框显示的是=25.210=25.210=.....,仪表显示的是12.52

3 楼

这样,因为我不懂接口,也许有更简单的方法。(我总觉得MSComm1.Input每次输入一个字符,你怎么就累计起来了呢?我这里只立足于你的代码而言)可以采取以下方法修改:
检测MSComm1.Input的当前最后字符:如果是等号,从上个等号到这里反转,并把反转结果显示出来;如果不是,继续等待。

代码如下:
Private Sub Mscomm1_Oncomm()
    dim s as string,j as integer
    static i as integer
    if MSComm1.CommEvent= comEvReceive then
        s=mscomm1.input
        if len(s)=1 then
            i=1
            exit sub
        elseif right(s,1)="=" then
            j=len(s)
            s=mid(s,i+1,j-i-1)
            s1=""
            for i=1 to len(s)
                s1=mid(s,i,1) & s1
            next i
            text2=s1
            i=j
        endif
    End endif
End Sub


4 楼

Dim i As Integer

Private Sub Form_Load()
MSC.CommPort = 2
MSC.Settings = "1200,n,8,1"
MSC.InBufferCount = 0
MSC.InputLen = 9
MSC.RThreshold = 9
MSC.PortOpen = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSC.PortOpen = True Then MSC.PortOpen = False
End Sub

Private Sub MSC_OnComm()
Select Case MSC.CommEvent
       Case comEvReceive
       buf = MSC.Input
       ary = StrConv(buf, vbFromUnicode)
       For i = 0 To UBound(ary)
       buf1 = buf1 + Chr(ary(i))
       End If
       Next
       txtreceive.Text = buf1
       buf1 = ""
       Case comEvSend
End Select
End Sub

5 楼

上面的这段代码是取一串字符!看看有没有更好的方法?调过来的程序我写出来了,请指教:
Option Explicit
Dim ary() As Byte
Dim buf As Variant
Dim i As Integer


Private Sub Form_Load()
MSC.CommPort = 2
MSC.Settings = "1200,n,8,1"
MSC.InBufferCount = 0
MSC.InputLen = 9
MSC.RThreshold = 9
MSC.PortOpen = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
If MSC.PortOpen = True Then MSC.PortOpen = False
End Sub

Private Sub MSC_OnComm()
Select Case MSC.CommEvent
       Case comEvReceive
       buf = MSC.Input
       ary = StrConv(buf, vbFromUnicode)
       For i = UBound(ary) To 0 Step -1
         If Chr(ary(i)) <> "=" Then txtReceive.Text = txtReceive.Text + Chr(ary(i))
       Next
       Case comEvSend
End Select
End Sub

6 楼

想请教老大徒伤悲!如果不是"=",是不是应该用do while语句?

7 楼

也可以。

这仅是我写程序的不良习惯。缘于86年学习早期的basic没有do所以很多时候可以用do我仍不自觉地使用if来控制。
不好意思。

我来回复

您尚未登录,请登录后再回复。点此登录或注册