-
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
栏目列表
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比