图1 用户界面 2 编写程序代码 编写的程序代码如下:
PriVate Sub Form_Load()
Msc1.CommPort=1 ’ 使用串行口1
’波特率9600,偶校验,8个数据位,1个停止位 Msc 1.Settings=“9600,E,8,1”
’当使用Msc 1.Input时,每次从接收缓冲区取一个字节。 Msc1.InputLen=0 ’读取整个接收缓冲区内码或消除 Msc1.Portopen=True ’ 打开串行口 End Sub
Private Sub Comd1_Click()
On Error Resume Next ’简单的错误处理 If Txt1.Text = \
x = MsgBox(\被检仪器程控码不能为空值\) Exit Sub End If
MSC1.Output = Txt1.Text + Chr$(13) ’发送程控码 For i = 1 To 20000000 Next End Sub
Private Sub Comd2_Click() Txt1.Text = \ Txt1.SetFocus End Sub
Private Sub Comd3_Click()
Dim instring As string instring = MSC1.Input
MSC1.Output = Txt2.Text + Chr$(13) Do DoEvents
Loop Until MSC1.InBufferCount >= 20
instring = MSC1.Input ’ 从接收队列中读入字符串 Txt2.Text = \
Txt2.Text = instring ’ 显示读入的字符串 End Sub
Private Sub Comd4_Click() Txt2.Text = \ Txt2.SetFocus End Sub
Private Sub Comd5_Click()
MSC1.PortOpen = False ’ 关闭串行口 End End Sub
3 程序简要说明
上述程序设置的端口通信协议为: 9600波特率,偶校验,8个数据位,1个停止位。当退出程序时,一定要关闭串行口,通过comm1.PortOpen=False完成。使用时,在“请输入被检仪器程控码控制仪器功能”文本框中输入“FUNC‘FREQ 1;FREQ:RES1HZ”即仪器的程控码为:“功能通道1测频,分辨率为1Hz。单击“确定”后,HP53150A置于相应功能。加入信号后即可测量检测,当读取测量数据时在“请输入被检仪器程控码读取仪器数据”框中输入“DATA?”,单击“确定”后,该框中以字符的形式显示测量结果。从而实现仪器程控功能和性能指标的检测。上述只是一个简单的例子。要实现完善的功
能,必须进一步改进程序。 上面介绍了笔者在使用VB6开发Windows环境下测控软件的一点收获,可以看出使用VB6开发Windows98下与仪器进行串口通信程序是非常简单的。
双击MSCOMM控件进入OnComm,当有数据传输到PC机时就会触发这个事件,所以不需要在Timer中来实时监测。
下面是一个例子可以参考一下: '***************************************** '串口处理
'***************************************** Private Sub MSComm_OnComm()
On Error GoTo hak: Dim intInputLen As Integer Dim str As String
Dim temp As Integer Dim fl As Single Dim i As Integer
Select Case MSComm.CommEvent Case comEvReceive RX = RX + 1
StatusBar1.Panels(4).Text = \接收:\
intInputLen = MSComm.InBufferCount '是指调制解调器已接收,并在接收缓冲区等待被取走的字符数。 ReDim inbyte(intInputLen) ' 重新定义数组长度 inbyte = MSComm.Input '按字符接收
If OpType(0).Value = True Then
For i = LBound(inbyte) To UBound(inbyte) str = str + Chr(inbyte(i)) Next i
txtReceive.Text = txtReceive.Text & str '十六进接收
ElseIf OpType(1).Value = True Then For i = LBound(inbyte) To UBound(inbyte) str = str + CStr(Hex(inbyte(i))) + Chr(32) If Len(Hex(inbyte(i))) <= 1 Then
txtReceive.Text = txtReceive.Text & \ Else
txtReceive.Text = txtReceive.Text & str End If Next i '整型接收
ElseIf OpType(2).Value = True Then Dim bit As Byte bit = inbyte(0)
For i = LBound(inbyte) To UBound(inbyte) temp = temp + CLng(inbyte(i)) Next i
If bit >= 128 Then '判断是否为负
txtReceive.Text = txtReceive.Text & (temp - 255) & \ Else
txtReceive.Text = txtReceive.Text & temp & \ End If End If End Select
MSComm.InBufferCount = 0 hak:
MSComm.InBufferCount = 0 End Sub
回答者: xmxqiyan - 江湖新秀 五级
只能分时接收了
比如 char rev_buf[1024] 现接收1024个 在循环判断 rev[i]=='A' rev[i+4]=='Z' 则为有效数字
另外:你的仪器为一台 这种单工通信还行 如果不止一台 则会有干扰 还不如不要上位机 当然 这只是我的想法而已
回答者: 摘一把青梅煮酒 - 同进士出身 六级
把comm控件设置为每6个字符激发一次oncomm事件。
这样实时读取就可以了。
用时钟控件也是可以的,定期把缓冲区的数据读出来,
再整理处理。
3-21 12:59
3-21 13:59