(3) 打开与关闭串口
在创建一个SerialPort 对象,设置串口属性后,可以通过 Open()方法打开串口。数据读写完成后,可以通过Close()方法关闭串口。根据经验,对于有些系统,在打开
串口后,还需要将RtsEnable设置为True,这样才能读写数据,否则不能正常读写数据。
本程序中,打开串口的相关程序在SearchPort函数中,当搜索本机可用串口时,便会打开串口。打开串口的程序语句为:
If SerialPortStatus = False Then
Try
SerialPort1.Open()
Threading.Thread.Sleep(500)
Dim Version As String = ""
Version = SerialPort1.ReadExisting()
If InStr(Version, "JB5000") > 0 Then
SerialPortStatus = True
Return True
Else
SerialPort1.Close()
Return False
End If
Catch ex As Exception
ToolStripButton1.Enabled = False
ToolStripButton3.Enabled = True
Return False
End Try
Else
Try
SerialPort1.PortName = ComName
SerialPort1.Open()
Return False
Catch ex As Exception
Return False
End Try
End If
同样,关闭串口的程序如下:
Private Sub ClosePort()
SerialPort1.Close()
End Sub
(4) 利用DataReceived事件进行数据接收
SerialPort提供了DataReceived事件。当有数据进入时,该事件被触发。该事件的触发由操作系统决定,当有数据到达时,该事件在辅助线程中被触发。辅助线程的优先级比较低,因此并不能确保每个字节的数据到达时,该事件都被触发。在使用该事件接收数据时,最好对定义通讯协议格式,添加桢头和桢尾。在DataReceived事件中接收数据时,把数据放在数组中或字符串中缓冲起来,当接收的包含桢头和桢尾的完整数据时,再进行处理。
本程序在DataReceived事件的通用过程中用到了If...Then...End If语句。如果软件正在运行且布尔型变量SerialPortStatus的值是True,即本机存在可用串口,那么就会用Try...Catch语句,Try语句里面用到了ReadTo方法,串口会一直读取数据,直到输入缓冲区中的"F"为止。F为数据包或指令包的包尾。然后赋值给字符型数组ReceiveBuff。在异步调用的函数的参数里面,会调用CallbackShow通用过程。这个CallbackShow通用过程里面用到了两个If...Then...End If语句。第一个If...Then...End If语句,如果软件正在运行,那么调用通用过程WriteToFile。通用过程WriteToFile主要实现了将数据写入文件的功能,后面将会具体提到。第二个If...Then...End If语句,如果字符型数组ReceiveBuff的长度大于0,那么调用JudgeTaskMode函数。JudgeTaskMode函数里面有关于数据接收的具体形式,是根据协议里面的指令包和数据包对接收到的数据做出具体的反应。 基于VB.NET的辐射报警仪上位机管理软件设计(10):http://www.751com.cn/tongxin/lunwen_2658.html