VS2010环境下使用VB编写串口助手
2016-05-20 18:20
567 查看
1、在Form1的设计模式下添加以下控件:
2、添加好控件之后我们就可以打开Form1.vb进行编程了:
然后运行,由于我电脑上没有串口,所以使用usb转串口线,这个线所用的转换芯片是ch340。
安装好驱动之后在计算机管理中查是COM3.
然后把串口的2,3针脚用杜邦线短路,因为这样的话我用电脑发送后又可以用电脑的同一个串口接收数据,方便测试。
测试效果如下:
2、添加好控件之后我们就可以打开Form1.vb进行编程了:
'使用串口需要引用的命名空间 Imports System.IO.Ports Imports System Public Class Form1 '在设计视图中双击Form1窗体出现的函数,在第一次显示窗体前发生的事件写在这个里面,类似于ViewWillAppear Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim ports As String() = SerialPort.GetPortNames() '必须用命名空间,用SerialPort,获取计算机的有效串口 Dim port As String For Each port In ports portnamebox.Items.Add(port) '向combobox中添加项 Next '初始化界面 baudratebox.Text = baudratebox.Items(2) '注释和不注释的地方可以替换 portnamebox.Text = portnamebox.Items(0) 'baudratebox.SelectedIndex() = 2 ' portnamebox.SelectedIndex() = 0 Serial_Port1() '初始化串口 Label3.Text = SerialPort1.IsOpen statuslabel.Text = "串口未连接" statuslabel.ForeColor = Color.Red sendbox.Text = "123" receivebytes.Text = "0" linecheck.Enabled = True timebox.Enabled = True '让发送、接收数据按钮不能点击(失能) Button1.Enabled = False Button2.Enabled = False Button3.Enabled = False End Sub Private Sub Serial_Port1() '设置串口参数 'SerialPort1.BaudRate = Val(baudratebox.Text) '波特率 'SerialPort1.PortName = portnamebox.Text '串口名称 SerialPort1.PortName = portnamebox.SelectedItem SerialPort1.BaudRate = Val(baudratebox.SelectedItem) SerialPort1.DataBits = 8 '数据位 SerialPort1.StopBits = IO.Ports.StopBits.One '停止位 SerialPort1.Parity = IO.Ports.Parity.None '校验位 End Sub '关闭串口连接 Private Sub closebtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles closebtn.Click Try SerialPort1.Close() '关闭串口 '让发送、接收数据按钮不能点击(失能) Button1.Enabled = False Button2.Enabled = False Button3.Enabled = False Label3.Text = SerialPort1.IsOpen If SerialPort1.IsOpen = False Then statuslabel.Text = "串口未连接" statuslabel.ForeColor = Color.Red receivebox.Text = "" receivebytes.Text = "" End If Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub '打开串口连接 Private Sub openbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles openbtn.Click Try SerialPort1.Open() '打开串口 timebox.Enabled = True '使能按钮 Button1.Enabled = True Button2.Enabled = True Button3.Enabled = True Label3.Text = SerialPort1.IsOpen If SerialPort1.IsOpen = True Then statuslabel.Text = "串口已连接" statuslabel.ForeColor = Color.Green End If Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub '手动发送数据 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click send() End Sub '触发接收事件,接收数据 Public Sub Sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Me.Invoke(New EventHandler(AddressOf Sp_Receiving)) '调用接收数据函数 End Sub '接收数据过程 Private Sub Sp_Receiving(ByVal sender As Object, ByVal e As EventArgs) ' Dim strIncoming As Byte Dim strIncoming As Integer Dim str1() As String Dim str2() As String Dim bytes() As Byte Dim i As Integer Try Threading.Thread.Sleep(100) '添加的延时 ' receivebytes.Text = Str(Val(receivebytes.Text) + SerialPort1.BytesToRead) receivebytes.Text = Str(SerialPort1.BytesToRead) If SerialPort1.BytesToRead > 0 Then ReDim bytes(SerialPort1.BytesToRead) 'strIncoming = Convert.ToByte(SerialPort1.ReadByte()) If receivecheck.Checked = True Then strIncoming = SerialPort1.ReadByte() bytes(0) = strIncoming For i = 1 To SerialPort1.BytesToRead strIncoming = SerialPort1.ReadByte() '读取缓冲区中的数据 bytes(i) = strIncoming Next ' SerialPort1.Write(sendbox.Text)'发送数据 SerialPort1.DiscardInBuffer() str1 = Split(BitConverter.ToString(bytes), "-") ReDim str2(str1.Length - 1) '去除str1中最后的字符 For i = 0 To str1.Length - 2 str2(i) = str1(i) Next receivebox.Text = receivebox.Text & Join(str2, " ") 'BitConverter.ToString(bytes) Else receivebox.Text = receivebox.Text & SerialPort1.ReadExisting() End If End If Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub Public Sub send() '发送数据过程 Dim databyte() As Byte Dim str1() As String Dim str2 As String Dim str3 As String Dim i As Integer Try If sendcheck.Checked = False Then '不按照16进制发送 'timecheck.Enabled = True If linecheck.Checked = False Then '判断是否选中分行发送 SerialPort1.Write(sendbox.Text) Else SerialPort1.WriteLine(sendbox.Text) End If Else '按照16进制发送 If InStr(sendbox.Text, " ") Then '判断是否有空格 str1 = Split(sendbox.Text) str2 = Join(str1, "") Else str2 = sendbox.Text End If If str2.Length Mod 2 = 0 Then '判断字符串字节数是否为偶数 ReDim databyte(str2.Length / 2) '重新定义数组 For i = 0 To str2.Length / 2 - 1 databyte(i) = Convert.ToByte(Mid(str2, 2 * i + 1, 2), 16) '两个字符转换为一个16进制字节 'databyte(i) = Val(Mid(str2, 2 * i + 1, 2)) Next SerialPort1.Write(databyte, 0, databyte.Length - 1) sendbytes.Text = Str(Val(sendbytes.Text) + databyte.Length - 1) Else str3 = Mid(str2, 1, (str2.Length - 1)) & "0" & Mid(str2, str2.Length) ReDim databyte(str3.Length / 2) For i = 0 To str3.Length / 2 - 1 databyte(i) = Convert.ToByte(Mid(str3, 2 * i + 1, 2), 16) Next SerialPort1.Write(databyte, 0, databyte.Length - 1) sendbytes.Text = Str(Val(sendbytes.Text) + databyte.Length - 1) End If 'databyte = System.Text.Encoding.Default.GetBytes(sendbox.Text)把每个字符转换成字节 End If Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub '更改串口设置 Private Sub portnamebox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles portnamebox.SelectedIndexChanged Try Serial_Port1() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub '清空发送区数据 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click sendbox.Text = "" End Sub '清空接收区数据 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click receivebox.Text = "" receivebytes.Text = 0 End Sub '定时发送数据 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Timer1.Interval = timebox.Text send() End Sub '选择定时发送的触发事件 Private Sub timecheck_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timecheck.CheckedChanged If timecheck.Checked = True Then If timebox.Text = "" Then MsgBox("时间间隔不能为0") timecheck.Checked = False Else send() timebox.Enabled = False End If Else timebox.Enabled = True End If End Sub End Class
然后运行,由于我电脑上没有串口,所以使用usb转串口线,这个线所用的转换芯片是ch340。
安装好驱动之后在计算机管理中查是COM3.
然后把串口的2,3针脚用杜邦线短路,因为这样的话我用电脑发送后又可以用电脑的同一个串口接收数据,方便测试。
测试效果如下:
相关文章推荐
- VB script 入门
- VB Val和CDbl的区别
- VB编程的必备技巧
- VB split的用法
- vb中split函数的用法
- 冒泡排序法---vb
- vb中的十六进制
- vb
- VB…………………………
- TVB-Gone 红外编码方法
- vba应用
- 转载:VBA中使用vlookup函数
- genymotion报错:Failed to open a session for the virtual machine,Unable to load R3 module xxxx/VBoxDD.D
- VBA——word中书签与VS的完美搭配
- vb6.0的学习心得
- 977dh用vbs通过wsh创建桌面快捷方式,快速启动,修改ie主页的恶意代码 ...
- This is usually because the "vboxsf" file system is not available.
- 使用vb.net 获取文件夹下选中文件的文件名称
- 笔记12:VB.net中的FTP操作:创建、删除、查询、下载、上传
- 截图工具