VB.Net 串口通信示例
该代码是通过 wuyazhe 的文章< C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。>将C# 转换成VB.net 而来。因为代码只是语法上的改动,整体框架依几乎并未改动,所以 代码讲解部分 就直接照搬了~供起步学习vb的朋友参考。
这里我使用的是vs2010开发环境。
为了使刚入门的朋友,能够理解,对进行串口通讯时的一些必要参数进行简单的讲解:
串口属性主要包括
.PortName 串口名称,COM1, COM2等。
.BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。
.Parity 奇偶校验。可以选取枚举Parity中的值
.DataBits 数据位
.StopBits 停止位,可以选取枚举StopBits中的值
.Handshake 握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值
以上参数,通过设置SerialPort 类的属性来进行。
程序简单界面如下:
代码中已经几乎完整的写了注释:
Imports System.IO.Ports
Imports System.Text.RegularExpressions
Imports System.Text
Public Class Form1
Private comm As New SerialPort()
Private builder As New StringBuilder() '避免在事件处理方法中反复的创建,定义到外面。
Private received_count As Long = 0 '接收计数
Private send_count As Long = 0 '发送计数
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'初始化下拉串口名称列表框
Dim ports As String() = SerialPort.GetPortNames()
Array.Sort(ports)
comboPortName.Items.AddRange(ports)
comboPortName.SelectedIndex = If(comboPortName.Items.Count > 0, 0, -1)
comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf("9600")
'初始化SerialPort对象
comm.NewLine = vbCr & vbLf
comm.RtsEnable = True '根据实际情况吧。
'添加事件注册
AddHandler comm.DataReceived, AddressOf comm_DataReceived
End Sub
Private Sub comm_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)
Dim n As Integer = comm.BytesToRead '先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
Dim buf(n) As Byte '声明一个临时数组存储当前来的串口数据
received_count += n '增加接收计数
comm.Read(buf, 0, n) '读取缓冲数据
builder.Clear() '清除字符串构造器的内容
'因为要访问ui资源,所以需要使用invoke方式同步ui。
Invoke(Sub()
'判断是否是显示为16禁止
If checkBoxHexView.Checked Then
'依次的拼接出16进制字符串
For Each b As Byte In buf
builder.Append(b.ToString("X2") & " ")
Next
Else
'直接按ASCII规则转换成字符串
builder.Append(Encoding.ASCII.GetString(buf))
End If
'追加的形式添加到文本框末端,并滚动到最后。
Me.txGet.AppendText(builder.ToString())
'修改接收计数
labelGetCount.Text = "Get:" & received_count.ToString()
End Sub)
End Sub
Private Sub buttonOpenClose_Click(sender As Object, e As EventArgs) Handles buttonOpenClose.Click
'根据当前串口对象,来判断操作
If comm.IsOpen Then
'打开时点击,则关闭串口
comm.Close()
Else
'关闭时点击,则设置好端口,波特率后打开
comm.PortName = comboPortName.Text
comm.BaudRate = Integer.Parse(comboBaudrate.Text)
Try
comm.Open()
Catch ex As Exception
'捕获到异常信息,创建一个新的comm对象,之前的不能用了。
comm = New SerialPort()
'现实异常信息给客户。
MessageBox.Show(ex.Message)
End Try
End If
'设置按钮的状态
buttonOpenClose.Text = If(comm.IsOpen, "Close", "Open")
buttonSend.Enabled = comm.IsOpen
End Sub
'动态的修改获取文本框是否支持自动换行。
Private Sub checkBoxNewlineGet_CheckedChanged(sender As Object, e As EventArgs)
txGet.WordWrap = checkBoxNewlineGet.Checked
End Sub
Private Sub buttonSend_Click(sender As Object, e As EventArgs) Handles buttonSend.Click
'定义一个变量,记录发送了几个字节
Dim n As Integer = 0
'16进制发送
If checkBoxHexSend.Checked Then
'我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十六进制数
Dim mc As MatchCollection = Regex.Matches(txSend.Text, "(?i)[\da-f]{2}")
Dim buf As New List(Of Byte)() '填充到这个临时列表中
'依次添加到列表中
For Each m As Match In mc
buf.Add(Byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber))
Next
'转换列表为数组后发送
comm.Write(buf.ToArray(), 0, buf.Count)
n = buf.Count '记录发送的字节数
Else
'ascii编码直接发送
'包含换行符
If checkBoxNewlineSend.Checked Then
comm.WriteLine(txSend.Text)
n = txSend.Text.Length + 2
Else
'不包含换行符
comm.Write(txSend.Text)
n = txSend.Text.Length
End If
End If
send_count += n '累加发送字节数
labelSendCount.Text = "Send:" & send_count.ToString() '更新界面
End Sub
Private Sub buttonReset_Click(sender As Object, e As EventArgs) Handles buttonReset.Click
'复位接受和发送的字节数计数器并更新界面。
send_count = 0
received_count = 0
labelGetCount.Text = "Get:0"
labelSendCount.Text = "Send:0"
End Sub
End Class
以上。 该实例源码工程下载地址:(VS2010)
http://download.csdn.net/detail/zhuguanhao/4115837
本人博客园:http://www.cnblogs.com/zhuguanhao/
原文C#讲解的很详细,附上地址:http://blog.csdn.net/wuyazhe/article/details/5598945
posted on 2012-03-06 09:50 zhuguanhao 阅读(14439) 评论(1) 编辑 收藏 举报