说明 |
|
@H_301_0@Open | @H_301_0@打开一个新的串行端口连接。 |
@H_301_0@Close | @H_301_0@关闭端口连接,将 IsOpen 属性设置为 false,并释放内部 Stream 对象。 |
@H_301_0@Read | @H_301_0@已重载。 从 SerialPort 输入缓冲区中读取。 |
@H_301_0@ReadByte | @H_301_0@从 SerialPort 输入缓冲区中同步读取一个字节。 |
@H_301_0@ReadChar | @H_301_0@从 SerialPort 输入缓冲区中同步读取一个字符。 |
@H_301_0@ReadExisting | @H_301_0@在编码的基础上,读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节。 |
@H_301_0@ReadLine | @H_301_0@一直读取到输入缓冲区中的 NewLine 值。 |
@H_301_0@ReadTo | @H_301_0@一直读取到输入缓冲区中的指定 value 的字符串。 |
@H_301_0@Write | @H_301_0@已重载。 将数据写入串行端口输出缓冲区。 |
@H_301_0@WriteLine | @H_301_0@将指定的字符串和 NewLine 值写入输出缓冲区。 |
@H_301_0@DiscardInBuffer | @H_301_0@丢弃来自串行驱动程序的接收缓冲区的数据。 |
@H_301_0@DiscardOutBuffer | @H_301_0@丢弃来自串行驱动程序的传输缓冲区的数据。 |
@H_301_0@GetPortNames | @H_301_0@获取当前计算机的串行端口名称数组。 |
说明 |
|
@H_301_0@PortName | @H_301_0@获取或设置通信端口,包括但不限于所有可用的 COM 端口。 |
@H_301_0@BaudRate | @H_301_0@获取或设置串行波特率。 |
@H_301_0@DataBits | @H_301_0@获取或设置每个字节的标准数据位长度。 |
@H_301_0@Parity | @H_301_0@获取或设置奇偶校验检查协议。 |
@H_301_0@StopBits | @H_301_0@获取或设置每个字节的标准停止位数。 |
@H_301_0@IsOpen | @H_301_0@获取一个值,该值指示 SerialPort 对象的打开或关闭状态。 |
@H_301_0@BytesToRead | @H_301_0@获取接收缓冲区中数据的字节数。 |
@H_301_0@BytesToWrite | @H_301_0@获取发送缓冲区中数据的字节数。 |
@H_301_0@Encoding | @H_301_0@获取或设置传输前后文本转换的字节编码。 |
@H_301_0@ReadBufferSize | @H_301_0@获取或设置 SerialPort 输入缓冲区的大小。 |
@H_301_0@ReceivedBytesThreshold | @H_301_0@获取或设置 DataReceived 事件发生前内部输入缓冲区中的字节数。 |
@H_301_0@WriteBufferSize | @H_301_0@获取或设置串行端口输出缓冲区的大小。 |
Private Sub SerialPortOpen()
On Error GoTo Err
If SerialPort.IsOpen = True Then SerialPort.Close() '避免重复打开端口
SerialPort.Open()
LabelCOMStatus.Text = "串口已打开"
Exit Sub
Err: MsgBox("串口不存在或已被占用!" + vbNewLine + ErrorToString()) '出现错误,显示错误信息
@H_301_0@ End Sub @H_301_0@如果想要在串口中支持中文字符收发,则可在初始化时设置串口控件的编码: @H_301_0@SerialPort.Encoding = System.Text.Encoding.Default @H_301_0@发送数据通过Write方法来完成,由于串口调试助手需要支持文本和16进制,需要加入转换代码:Private Sub ButtonSendData_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles ButtonSendData.Click
On Error GoTo Err
Dim outDataBuf As String = TextBoxSend.Text
If outDataBuf = "" Then Exit Sub '如果输入文本框中没有数据则不发送
If SerialPort.IsOpen = True Then '判断串口是否打开
If HexSendFlag = True Then
'-----------十六进制发送------------
outDataBuf = outDataBuf.Replace(" ","") '清除空格与回车
outDataBuf = outDataBuf.Replace(vbNewLine,"")
'十六进制数据位数为偶数,例如:FF 00 15 AC 0D
If outDataBuf.Length Mod 2 <> 0 Then
MsgBox("请输入正确的十六进制数,用空格和回车隔开。")
Exit Sub
End If
Dim outBytes(outDataBuf.Length / 2 - 1) As Byte
For I As Integer = 1 To outDataBuf.Length - 1 Step 2
outBytes((I - 1) / 2) = Val("&H" + Mid(outDataBuf,I,2)) 'VB的十六进制表示方法,例如0x1D表示为&H1D
Next
SerialPort.Write(outBytes,outDataBuf.Length / 2)
BarCountTx.Text = Val(BarCountTx.Text) + outDataBuf.Length / 2
Else
'-------------文本发送--------------
SerialPort.Write(outDataBuf)
BarCountTx.Text = Val(BarCountTx.Text) + outDataBuf.Length '发送字节计数
End If
Else
MsgBox("串口未打开,请先打开串口。")
End If
Exit Sub
Err: MsgBox("数据输入或发送错误!" + vbNewLine + ErrorToString())
@H_301_0@ End Sub @H_301_0@接收数据采用DataReceived事件,该事件在串口输入缓冲区中的字节数满足设置条件时触发,并执行事件中的代码。事件触发的字节数在ReceivedBytesThreshold属性中设置,默认为1字节。由于DataReceived事件采用了独立的线程,无法对软件界面中的控件进行直接操作,因而在现实时需要采用委托实例的方法。首先建立委托:Delegate Sub RecieveRefreshMethodDelegate(ByVal [text] As String) '声明委托
Dim RecieveRefresh As New RecieveRefreshMethodDelegate(AddressOf RecieveRefreshMethod) '定义数据显示委托实例
Sub RecieveRefreshMethod(ByVal str As String) '定义一个数据显示委托实例的方法
ShowRecieveData(str)
@H_301_0@End Sub @H_301_0@其中ShowRecieveData函数将str字符串显示到TextBox控件中。 @H_301_0@下面是DataReceived事件中对十六进制数据的处理。同发送数据一样,读取数据时也要根据不同的显示方式使用不同的方法。VB.NET通过Read方法,根据缓冲区中存在的字节数读取十六进制数据,而文本显示则简单的多,只需ReadExisting即可。最后通过Invoke方法调用委托,显示数据。Private Sub SerialPort_DataReceived(ByVal sender As Object,ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
If HexRecieveFlag Then
'-----------十六进制显示------------
Dim inDataLen As Integer = SerialPort.BytesToRead() '获取可读取的字节数
If inDataLen > 0 Then
Dim inBytes(inDataLen - 1) As Byte,bytes As Byte
Dim strHex As String = ""
SerialPort.Read(inBytes,inDataLen) '读取数据
For Each bytes In inBytes
strHex = strHex + [String].Format("{0:X2} ",bytes) '格式化成十六进制(不含&H)
Next
TextBoxRecieve.Invoke(RecieveRefresh,strHex) '调用委托,显示接收的数据
BarCountRx.Text = (Val(BarCountRx.Text) + inDataLen).ToString '接收字节计数
End If
Else
'-------------文本显示--------------
Dim str As String
str = SerialPort.ReadExisting '读取全部可用字符串
TextBoxRecieve.Invoke(RecieveRefresh,str)
BarCountRx.Text = (Val(BarCountRx.Text) + str.Length).ToString '接收字节计数
End If
End Sub
原文链接:https://www.f2er.com/vb/260168.html