Imports@H_404_12@ System Imports@H_404_12@ System.IO.Ports Public@H_404_12@ Class@H_404_12@ Form1 Private@H_404_12@ Sub@H_404_12@ Form1_Load(ByVal@H_404_12@ sender As@H_404_12@ System.Object,ByVal@H_404_12@ e As@H_404_12@ System.EventArgs) Handles@H_404_12@ MyBase@H_404_12@.Load '获取计算机有效串口 @H_404_12@ Dim@H_404_12@ ports As@H_404_12@ String@H_404_12@() @H_404_12@=@H_404_12@ SerialPort.GetPortNames() '必须用命名空间,用SerialPort,获取计算机的有效串口 @H_404_12@ Dim@H_404_12@ port As@H_404_12@ String@H_404_12@ For@H_404_12@ Each@H_404_12@ port In@H_404_12@ ports portnameBox.Items.Add(port) '向comboBox中添加项 @H_404_12@ Next@H_404_12@ port '初始化界面 @H_404_12@ baudrateBox.Text @H_404_12@=@H_404_12@ baudrateBox.Items(2@H_404_12@) '注释和不注释的地方可以替换 @H_404_12@ portnameBox.Text @H_404_12@=@H_404_12@ portnameBox.Items(0@H_404_12@) 'baudrateBox.SelectedIndex() = 2 @H_404_12@ ' portnameBox.SelectedIndex() = 0 @H_404_12@ Serial_Port1() '初始化串口 @H_404_12@ Label3.Text @H_404_12@=@H_404_12@ SerialPort1.IsOpen statuslabel.Text @H_404_12@=@H_404_12@ "串口未连接"@H_404_12@ statuslabel.ForeColor @H_404_12@=@H_404_12@ Color.Red sendBox.Text @H_404_12@=@H_404_12@ "123"@H_404_12@ receivebytes.Text @H_404_12@=@H_404_12@ "0"@H_404_12@ linecheck.Enabled @H_404_12@=@H_404_12@ True@H_404_12@ timeBox.Enabled @H_404_12@=@H_404_12@ True@H_404_12@ End Sub@H_404_12@ Private@H_404_12@ Sub@H_404_12@ Serial_Port1() '设置串口参数 @H_404_12@ 'SerialPort1.BaudRate = Val(baudrateBox.Text) '波特率 @H_404_12@ 'SerialPort1.PortName = portnameBox.Text '串口名称 @H_404_12@ SerialPort1.PortName @H_404_12@=@H_404_12@ portnameBox.SelectedItem SerialPort1.BaudRate @H_404_12@=@H_404_12@ Val@H_404_12@(baudrateBox.SelectedItem) SerialPort1.DataBits @H_404_12@=@H_404_12@ 8@H_404_12@ '数据位 @H_404_12@ SerialPort1.StopBits @H_404_12@=@H_404_12@ IO.Ports.StopBits.One '停止位 @H_404_12@ SerialPort1.Parity @H_404_12@=@H_404_12@ IO.Ports.Parity.None '校验位 @H_404_12@ End Sub@H_404_12@ '关闭串口连接 @H_404_12@ Private@H_404_12@ Sub@H_404_12@ closebtn_Click(ByVal@H_404_12@ sender As@H_404_12@ System.Object,ByVal@H_404_12@ e As@H_404_12@ System.EventArgs) Handles@H_404_12@ closebtn.Click Try@H_404_12@ SerialPort1.Close() '关闭串口 @H_404_12@ Label3.Text @H_404_12@=@H_404_12@ SerialPort1.IsOpen If@H_404_12@ SerialPort1.IsOpen @H_404_12@=@H_404_12@ False@H_404_12@ Then@H_404_12@ statuslabel.Text @H_404_12@=@H_404_12@ "串口未连接"@H_404_12@ statuslabel.ForeColor @H_404_12@=@H_404_12@ Color.Red receiveBox.Text @H_404_12@=@H_404_12@ ""@H_404_12@ receivebytes.Text @H_404_12@=@H_404_12@ ""@H_404_12@ End@H_404_12@ If@H_404_12@ Catch@H_404_12@ ex As@H_404_12@ Exception MessageBox.Show(ex.Message) End@H_404_12@ Try@H_404_12@ End Sub@H_404_12@ '打开串口连接 @H_404_12@ Private@H_404_12@ Sub@H_404_12@ openbtn_Click(ByVal@H_404_12@ sender As@H_404_12@ System.Object,ByVal@H_404_12@ e As@H_404_12@ System.EventArgs) Handles@H_404_12@ openbtn.Click Try@H_404_12@ SerialPort1.Open() '打开串口 @H_404_12@ Label3.Text @H_404_12@=@H_404_12@ SerialPort1.IsOpen If@H_404_12@ SerialPort1.IsOpen @H_404_12@=@H_404_12@ True@H_404_12@ Then@H_404_12@ statuslabel.Text @H_404_12@=@H_404_12@ "串口已连接"@H_404_12@ statuslabel.ForeColor @H_404_12@=@H_404_12@ Color.Green End@H_404_12@ If@H_404_12@ Catch@H_404_12@ ex As@H_404_12@ Exception MessageBox.Show(ex.Message) End@H_404_12@ Try@H_404_12@ End Sub@H_404_12@ '手动发送数据 @H_404_12@ Private@H_404_12@ Sub@H_404_12@ Button1_Click(ByVal@H_404_12@ sender As@H_404_12@ System.Object,ByVal@H_404_12@ e As@H_404_12@ System.EventArgs) Handles@H_404_12@ Button1.Click send() End Sub@H_404_12@ '触发接收事件,接收数据 @H_404_12@ Public@H_404_12@ Sub@H_404_12@ Sp_DataReceived(ByVal@H_404_12@ sender As@H_404_12@ Object@H_404_12@,ByVal@H_404_12@ e As@H_404_12@ System.IO.Ports.SerialDataReceivedEventArgs) Handles@H_404_12@ SerialPort1.DataReceived Me@H_404_12@.Invoke(New@H_404_12@ EventHandler(AddressOf@H_404_12@ Sp_Receiving)) '调用接收数据函数 @H_404_12@ End Sub@H_404_12@ '接收数据过程 @H_404_12@ Private@H_404_12@ Sub@H_404_12@ Sp_Receiving(ByVal@H_404_12@ sender As@H_404_12@ Object@H_404_12@,ByVal@H_404_12@ e As@H_404_12@ EventArgs) ' Dim strIncoming As Byte @H_404_12@ Dim@H_404_12@ strIncoming As@H_404_12@ Integer@H_404_12@ Dim@H_404_12@ str1() As@H_404_12@ String@H_404_12@ Dim@H_404_12@ str2() As@H_404_12@ String@H_404_12@ Dim@H_404_12@ bytes() As@H_404_12@ Byte@H_404_12@ Dim@H_404_12@ i As@H_404_12@ Integer@H_404_12@ Try@H_404_12@ Threading.Thread.Sleep(100@H_404_12@) '添加的延时 @H_404_12@ receivebytes.Text @H_404_12@=@H_404_12@ Str@H_404_12@(Val@H_404_12@(receivebytes.Text) @H_404_12@+@H_404_12@ SerialPort1.BytesToRead) If@H_404_12@ SerialPort1.BytesToRead @H_404_12@>@H_404_12@ 0@H_404_12@ Then@H_404_12@ ReDim@H_404_12@ bytes(SerialPort1.BytesToRead) 'strIncoming = Convert.ToByte(SerialPort1.ReadByte()) @H_404_12@ If@H_404_12@ receivecheck.Checked @H_404_12@=@H_404_12@ True@H_404_12@ Then@H_404_12@ strIncoming @H_404_12@=@H_404_12@ SerialPort1.ReadByte() bytes(0@H_404_12@) @H_404_12@=@H_404_12@ strIncoming For@H_404_12@ i @H_404_12@=@H_404_12@ 1@H_404_12@ To@H_404_12@ SerialPort1.BytesToRead strIncoming @H_404_12@=@H_404_12@ SerialPort1.ReadByte() '读取缓冲区中的数据 @H_404_12@ bytes(i) @H_404_12@=@H_404_12@ strIncoming Next@H_404_12@ ' SerialPort1.Write(sendBox.Text)'发送数据 @H_404_12@ SerialPort1.DiscardInBuffer() str1 @H_404_12@=@H_404_12@ Split@H_404_12@(BitConverter.ToString(bytes),"-"@H_404_12@) ReDim@H_404_12@ str2(str1.Length @H_404_12@-@H_404_12@ 1@H_404_12@) '去除str1中最后的字符 @H_404_12@ For@H_404_12@ i @H_404_12@=@H_404_12@ 0@H_404_12@ To@H_404_12@ str1.Length @H_404_12@-@H_404_12@ 2@H_404_12@ str2(i) @H_404_12@=@H_404_12@ str1(i) Next@H_404_12@ receiveBox.Text @H_404_12@=@H_404_12@ receiveBox.Text @H_404_12@&@H_404_12@ Join@H_404_12@(str2," "@H_404_12@) 'BitConverter.ToString(bytes) @H_404_12@ Else@H_404_12@ receiveBox.Text @H_404_12@=@H_404_12@ receiveBox.Text @H_404_12@&@H_404_12@ SerialPort1.ReadExisting() End@H_404_12@ If@H_404_12@ End@H_404_12@ If@H_404_12@ Catch@H_404_12@ ex As@H_404_12@ Exception MessageBox.Show(ex.Message) End@H_404_12@ Try@H_404_12@ End Sub@H_404_12@ '更改串口设置 @H_404_12@ Private@H_404_12@ Sub@H_404_12@ portnameBox_SelectedIndexChanged(ByVal@H_404_12@ sender As@H_404_12@ System.Object,ByVal@H_404_12@ e As@H_404_12@ System.EventArgs) Handles@H_404_12@ portnameBox.SelectedIndexChanged Try@H_404_12@ Serial_Port1() Catch@H_404_12@ ex As@H_404_12@ Exception MessageBox.Show(ex.Message) End@H_404_12@ Try@H_404_12@ End Sub@H_404_12@ '清空接收区 @H_404_12@ Private@H_404_12@ Sub@H_404_12@ clearbtn_Click(ByVal@H_404_12@ sender As@H_404_12@ System.Object,ByVal@H_404_12@ e As@H_404_12@ System.EventArgs) Handles@H_404_12@ clearbtn.Click receiveBox.Text @H_404_12@=@H_404_12@ ""@H_404_12@ End Sub@H_404_12@ '定时发送数据 @H_404_12@ Private@H_404_12@ Sub@H_404_12@ Timer1_Tick(ByVal@H_404_12@ sender As@H_404_12@ System.Object,ByVal@H_404_12@ e As@H_404_12@ System.EventArgs) Handles@H_404_12@ Timer1.Tick Timer1.Interval @H_404_12@=@H_404_12@ timeBox.Text send() End Sub@H_404_12@ '选择定时发送的触发事件 @H_404_12@ Private@H_404_12@ Sub@H_404_12@ timecheck_CheckedChanged(ByVal@H_404_12@ sender As@H_404_12@ System.Object,ByVal@H_404_12@ e As@H_404_12@ System.EventArgs) Handles@H_404_12@ timecheck.CheckedChanged If@H_404_12@ timecheck.Checked @H_404_12@=@H_404_12@ True@H_404_12@ Then@H_404_12@ If@H_404_12@ timeBox.Text @H_404_12@=@H_404_12@ ""@H_404_12@ Then@H_404_12@ MsgBox@H_404_12@("时间间隔不能为0"@H_404_12@) timecheck.Checked @H_404_12@=@H_404_12@ False@H_404_12@ Else@H_404_12@ send() timeBox.Enabled @H_404_12@=@H_404_12@ False@H_404_12@ End@H_404_12@ If@H_404_12@ Else@H_404_12@ timeBox.Enabled @H_404_12@=@H_404_12@ True@H_404_12@ End@H_404_12@ If@H_404_12@ End Sub@H_404_12@ Public@H_404_12@ Sub@H_404_12@ send() '发送数据过程 @H_404_12@ Dim@H_404_12@ databyte() As@H_404_12@ Byte@H_404_12@ Dim@H_404_12@ str1() As@H_404_12@ String@H_404_12@ Dim@H_404_12@ str2 As@H_404_12@ String@H_404_12@ Dim@H_404_12@ str3 As@H_404_12@ String@H_404_12@ Dim@H_404_12@ i As@H_404_12@ Integer@H_404_12@ Try@H_404_12@ If@H_404_12@ sendcheck.Checked @H_404_12@=@H_404_12@ False@H_404_12@ Then@H_404_12@ '不按照16进制发送 @H_404_12@ 'timecheck.Enabled = True @H_404_12@ If@H_404_12@ linecheck.Checked @H_404_12@=@H_404_12@ False@H_404_12@ Then@H_404_12@ '判断是否选中分行发送 @H_404_12@ SerialPort1.Write(sendBox.Text) Else@H_404_12@ SerialPort1.WriteLine(sendBox.Text) End@H_404_12@ If@H_404_12@ Else@H_404_12@ '按照16进制发送 @H_404_12@ If@H_404_12@ InStr@H_404_12@(sendBox.Text," "@H_404_12@) Then@H_404_12@ '判断是否有空格 @H_404_12@ str1 @H_404_12@=@H_404_12@ Split@H_404_12@(sendBox.Text) str2 @H_404_12@=@H_404_12@ Join@H_404_12@(str1,""@H_404_12@) Else@H_404_12@ str2 @H_404_12@=@H_404_12@ sendBox.Text End@H_404_12@ If@H_404_12@ If@H_404_12@ str2.Length Mod@H_404_12@ 2@H_404_12@ @H_404_12@=@H_404_12@ 0@H_404_12@ Then@H_404_12@ '判断字符串字节数是否为偶数 @H_404_12@ ReDim@H_404_12@ databyte(str2.Length @H_404_12@/@H_404_12@ 2@H_404_12@) '重新定义数组 @H_404_12@ For@H_404_12@ i @H_404_12@=@H_404_12@ 0@H_404_12@ To@H_404_12@ str2.Length @H_404_12@/@H_404_12@ 2@H_404_12@ @H_404_12@-@H_404_12@ 1@H_404_12@ databyte(i) @H_404_12@=@H_404_12@ Convert.ToByte(Mid@H_404_12@(str2,2@H_404_12@ @H_404_12@*@H_404_12@ i @H_404_12@+@H_404_12@ 1@H_404_12@,2@H_404_12@),16@H_404_12@) '两个字符转换为一个16进制字节 @H_404_12@ 'databyte(i) = Val(Mid(str2,2 * i + 1,2)) @H_404_12@ Next@H_404_12@ SerialPort1.Write(databyte,0@H_404_12@,databyte.Length @H_404_12@-@H_404_12@ 1@H_404_12@) sendbytes.Text @H_404_12@=@H_404_12@ Str@H_404_12@(Val@H_404_12@(sendbytes.Text) @H_404_12@+@H_404_12@ databyte.Length @H_404_12@-@H_404_12@ 1@H_404_12@) Else@H_404_12@ str3 @H_404_12@=@H_404_12@ Mid@H_404_12@(str2,1@H_404_12@,(str2.Length @H_404_12@-@H_404_12@ 1@H_404_12@)) @H_404_12@&@H_404_12@ "0"@H_404_12@ @H_404_12@&@H_404_12@ Mid@H_404_12@(str2,str2.Length) ReDim@H_404_12@ databyte(str3.Length @H_404_12@/@H_404_12@ 2@H_404_12@) For@H_404_12@ i @H_404_12@=@H_404_12@ 0@H_404_12@ To@H_404_12@ str3.Length @H_404_12@/@H_404_12@ 2@H_404_12@ @H_404_12@-@H_404_12@ 1@H_404_12@ databyte(i) @H_404_12@=@H_404_12@ Convert.ToByte(Mid@H_404_12@(str3,16@H_404_12@) Next@H_404_12@ SerialPort1.Write(databyte,databyte.Length @H_404_12@-@H_404_12@ 1@H_404_12@) sendbytes.Text @H_404_12@=@H_404_12@ Str@H_404_12@(Val@H_404_12@(sendbytes.Text) @H_404_12@+@H_404_12@ databyte.Length @H_404_12@-@H_404_12@ 1@H_404_12@) End@H_404_12@ If@H_404_12@ 'databyte = System.Text.Encoding.Default.GetBytes(sendBox.Text)把每个字符转换成字节 @H_404_12@ End@H_404_12@ If@H_404_12@ Catch@H_404_12@ ex As@H_404_12@ Exception MessageBox.Show(ex.Message) End@H_404_12@ Try@H_404_12@ End Sub@H_404_12@ '是否按照16进制发送,如果是换行将不可选。如果不是,换行可选 @H_404_12@ Private@H_404_12@ Sub@H_404_12@ sendcheck_CheckedChanged(ByVal@H_404_12@ sender As@H_404_12@ System.Object,ByVal@H_404_12@ e As@H_404_12@ System.EventArgs) Handles@H_404_12@ sendcheck.CheckedChanged If@H_404_12@ sendcheck.Checked @H_404_12@=@H_404_12@ True@H_404_12@ Then@H_404_12@ '不按照16进制发送 @H_404_12@ linecheck.Enabled @H_404_12@=@H_404_12@ False@H_404_12@ Else@H_404_12@ linecheck.Enabled @H_404_12@=@H_404_12@ True@H_404_12@ End@H_404_12@ If@H_404_12@ End Sub@H_404_12@ End Class