主题:[原创]求教串口
lcrxl1815
[专家分:110] 发布于 2008-09-02 22:41:00
一.仪表:
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个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2008-09-03 13:45:00
这不就是你要的吗?
[quote]每帧数据共有9组组成(包括小数点)。数据传送先底位后高位,每帧数据间有一组间隔符“=”,比如仪表显示70.15,连续发送51.07000[/quote]
板凳
lcrxl1815 [专家分:110] 发布于 2008-09-03 18:25:00
不是,我要的是文本框和仪表显示的一样!现在文本框显示的是=25.210=25.210=.....,仪表显示的是12.52
3 楼
老大徒伤悲 [专家分:29120] 发布于 2008-09-03 20:32:00
这样,因为我不懂接口,也许有更简单的方法。(我总觉得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 楼
lcrxl1815 [专家分:110] 发布于 2008-09-04 22:22:00
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 楼
lcrxl1815 [专家分:110] 发布于 2008-09-04 22:53:00
上面的这段代码是取一串字符!看看有没有更好的方法?调过来的程序我写出来了,请指教:
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 楼
lcrxl1815 [专家分:110] 发布于 2008-09-05 07:38:00
想请教老大徒伤悲!如果不是"=",是不是应该用do while语句?
7 楼
老大徒伤悲 [专家分:29120] 发布于 2008-09-05 11:33:00
也可以。
这仅是我写程序的不良习惯。缘于86年学习早期的basic没有do所以很多时候可以用do我仍不自觉地使用if来控制。
不好意思。
我来回复