使用VB模拟串行通信设备
VB环境下实现PC机与单片机的串行通讯
VB环境下实现PC机与单片机的串行通讯随着科技的不断发展,PC机和单片机的联系日益密切,特别是在嵌入式系统领域中,单片机已经成为了必不可少的重要组成部分。
而如何实现PC机和单片机之间的通讯,是一项必须要掌握的技能。
本篇文章主要介绍如何运用VB环境下的串口编程,实现PC机与单片机的串行通讯。
一、概述通讯技术日新月异,各种新的通讯技术层出不穷。
而在普通家庭却使用最为广泛的通讯技术,还是传统的串口通讯。
使用传统的串口通讯,可以实现PC机与单片机之间的数据交互,可靠性高,兼容性强,使用便捷。
要实现PC机与单片机之间的串行通讯,需要掌握两个技能:单片机串行通讯的编程和VB环境下串口编程。
二、单片机串行通讯的编程单片机串行通讯主要是通过寄存器和中断实现的。
单片机通过一个IO口与电脑之间建立一个简单的通讯接口,PC机通过该接口向单片机发送数据,单片机接收到数据,就可以通过该接口把数据返回给PC机。
单片机串口通讯编程的内容主要包括串口数据位、停止位、校验位、波特率等信息,这些信息需要设置在单片机的寄存器中。
同时,还要设置中断信息,以免程序在不接收数据时死等。
三、VB环境下串口编程VB环境下串口编程的关键是掌握控件的使用。
实际上,VB环境下的串口编程非常简单,只需要使用微软提供的MSComm控件就可以实现。
通过MSComm控件的事件和方法,可以轻松地实现数据的读取、发送、接收等功能。
需要注意的是,MSComm控件的BaudRate属性需要与单片机编写的程序的波特率一致,不然可能会出现通讯故障。
四、如何实现串口通讯首先需要硬件上建立好通讯接口。
通常情况下,USB串口转换器和单片机板子都会配套出售,只需要把两者插在一起即可。
其次需要编写单片机的串口通讯程序。
单片机数字口与串口的通讯,就是把串口接到单片机的数字口中,通过串口向外发送数据。
因此,编写单片机的串口通讯程序,需要设置停止位、数据位、奇偶校验位、波特率等参数。
通信软件课件-使用VB模拟-串行通信设备
服务器界面设计: Rthreshold=1 收到数就引发事件
端口打开,关闭及结束程序略
清除接收区按钮的Click事件: Text1.Text = “”
增加一个GetTickCount() API的声明:
Declare Function GetTickCount Lib “kernel32” () as Long
收到数就引发事件 接收窗为Text:
MultiLine=true ScrollBar=2(垂直)
客户端程序接收事件: OnComm事件代码: 其它程序略
客户端程序说明: 发送“%%data”取数命令 数据都收到后(!)再处理 收到数据遇“,”分行 注:服务器端程序同4-3节
程序执行结果: 影音说明
每个随机数在0-10之间
程序执行结果: 影音说明
4-6 连续状态数据接收器
客户端:将从服务器收到的数据以线条图绘出
硬件连接:
客户端界面设计: Rthreshold=1
收到数就引发事件 定时器 PictureBox: Cls 清空 定制坐标
Scale(0,10)-(20,0)
Timer事件:连续更新数据 CmdSend_Click
OnComm事件代码:见右
程序说明: 识别“%%”命令 送出成功信息
注: 用第3章的CommEvent 与事件程序作为客户端程序
程序执行结果: 影音说明
4-3 数据服务器的仿真
数据服务器:为请求声明提供数据
硬件连接:
服务器界面设计: Rthreshold=1 收到数就引发事件
有关端口打开、关闭及结束程序略
客户端程序接收事件: OnComm事件代码见右
其它程序略 绘图区(0,10)-(20,0)
串行通讯及其在VB中的实现
串行通讯及其在VB中的实现一、串行通讯的基本原理串行通讯是指外设和计算机之间使用一根数据信号线,数据在该信号线上按位进行传输,每一位数据都占据一个固定的时间长度。
串行口的本质就是实现CPU与外围数据设备的数据格式转换(或者称为串并转换器),即当数据从外围设备输入计算机时,数据格式由位(bit)转化为字节数据;反之,当计算机发送下行数据到外围设备时,串口又将字节数据转化为位数据。
串行通讯方式常采用RS-232串行通讯方式,一个完整的RS-232接口有22根线,采用标准的25芯插头座(或者9芯插头座),25芯和9芯的主要信号线相同。
串行通讯口的连接采用7根线直接连接方式,通过两对应答信号线相连,可进行全双工传输。
在Windows操作系统下,串行通讯在程序设计中实现一般有四种实现途径:①汇编嵌入技术;②利用Windows API函数;③利用面向对象的软件开发工具编写串行通信类(即第3方提供的动态链接库)来实现;④利用串行通信控件MSComm实现。
无论使用哪一种途径,其基本的操作步骤大致是一样的:首先初始化串口,比如端口号,波特率等属性,然后打开端口,通过接收缓冲区读上行数据,通过发送缓冲区写下行数据。
最后通过事件驱动反映数据的到达与发送过程。
二、串行通讯在VB中的实现Visual Basic 6.0提供的标准控件MSComm (Microsoft Communications Contro1)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
使用MSComm控件主要是通过事件来处理串行口的交互,例如,在串口接收缓冲区中有字符,CD或者RTS线上一个字符到达或一个变化发生时,可以利用MSComm 控件的OnComm事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
在实际应用中,一个MSComm控件对应一个串行端口。
用VisualBasic的Communications控件实现串行通信-2019年精选文档
ations 控件实现串行通信1.引言Visual Basic (以下简称VB )是一般程序设计人员在Windows 环境下最常用的编程语言。
在 VB 中除了可以调用 API 函数,完成串行通信的任务之外,更常用、更简便的是使用 提供的Communications 控件(以下简称Comn 控件)来完成各种 串行通信任务。
2. VB 的Comr 控件2.1 Com m 控件的添加Comm 控件并不是VB 的基本控件,刚进入 VB 环境中时,在控件工具箱上是找不到 Comn 控件的,要使用它必须另行添加,添加的方法如下:用鼠标右击VB 的控件工具箱,在弹出菜单中选择"部件…"菜单项,会出现一个"部件…"对话框,勾选其中的"MicrosoftComm Control6.0"选项,在VB 的控件工具箱中会出现一个电话2.2 Comm 控件概述 Comm 控件用于进行串行通信,既可以用来提供简单的串行端口通信功能, 也可以用来创建功能完备的、 事件驱动的高级通 信工具。
Comm 空件提供了一系列标准通信命令的使用界面。
使用它用Visua Basic 的CommunicVB 机形状的控件图标,它就是进行串行通信要使用的Comr 控 件。
可以建立与串行端口的连接,通过串行端口连接到其他通信设备(如MODEM,发出命令,交换数据以及监视和响应串行连接中发生的事件和错误。
利用它可以进行诸如拨打电话、监视串行端口的输入数据乃至创建功能完备的终端程序等功能。
2.3 Comm 空件的重要属性1)CommPor:t 设置或返回通信端口号,其取值范围为1〜99,缺省为1。
当把这个属性设置成1,表示利用COM1 端口进行串行通信。
在程序运行时也可以读取该属性, 用来了解串行端口的使用情况。
2)Settings :用字符串的形式设置或返回串行通信的帧格式。
例如将Settings设置为"9600, n, 8, 1",表示采用的串行通信波特率是9600、无奇偶校验、数据位是8 位、 1 位停止位。
用VB实现Modbus串行通讯
如何用VB实现Modbus串行通讯在一些应用中可能需要使用诸如VB来进行上位机监控程序的开发,而Modbus协议是这类应用中首选的通讯协议;Modbus协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。
这里对VB和Twido PLC间的通讯进行说明。
对于大部分应用,Twido PLC作为从站,它不需要编制通讯程序,只要把通讯口的参数设置好即可,例如下图表示此Twido通过编程口和上位机连接,其站号地址为2;波特率、数据位、校验、停止位和上位机设置保持一致。
VB程序通过利用MSComm控件很容易就能够实现。
1.通讯口初始化:MSComm1.Settings = "9600,n,8,1"mPort = 1MSComm1.SThreshold = 0If Not MSComm1.PortOpen Then MSComm1.PortOpen = True2.CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。
Function crc16_1(ByRef cmdstring() As Byte, ByVal j As Integer)Dim data As IntegerDim i As IntegerAddressreg_crc = &HFFFFFor i = 0 To jAddressreg_crc = Addressreg_crc Xor cmdstring(i)For j = 0 To 7data = Addressreg_crc And &H1If data ThenAddressreg_crc = Int(Addressreg_crc / 2)Addressreg_crc = Addressreg_crc And &H7FFFAddressreg_crc = Addressreg_crc Xor &HA001ElseAddressreg_crc = Addressreg_crc / 2Addressreg_crc = Addressreg_crc And &H7FFFEnd IfNext jNext iIf Addressreg_crc < 0 ThenAddressreg_crc = Addressreg_crc - &HFFFF0000End IfHiByte = Addressreg_crc And &HFFLoByte = (Addressreg_crc And &HFF00) / &H100End Function3.读多个字的命令(本例是从2号站读%MW10起始的4个字):Dim SendStr(7) As ByteDim RcvStr() As ByteSendStr(0) = 2 ,从站号是2SendStr(1) = &H3 ,读多个字的命令代码SendStr(2) = 0 ,起始地址高字节SendStr(3) = 10,起始地址低字节SendStr(4) = &H0,数据长度高字节SendStr(5) = 4 ,数据长度低字节Call crc16(SendStr(), 5) ,CRC计算SendStr(6) = HiByteSendStr(7) = LoByte,读命令发送后,当接收5 + SendStr(5) * 2 个字节时产生中断CmdLenth = 5 + SendStr(5) * 2MSComm1.RThreshold = CmdLenthMSComm1.Output = SendStr ,发送命令4.写多个字的命令(本例是写2号站%MW20起始的3个字):Dim WriteStr() As Bytek = 6 ,写6个字节ReDim WriteStr(8 + k)WriteStr(0) = 2 ,从站号是2WriteStr(1) = &H10 ,写多个字的命令代码WriteStr(2) = 0 ,起始地址高字节WriteStr(3) = 20 ,起始地址低字节WriteStr(4) = &H0 ,数据长度高字节<字的个数> WriteStr(5) = k / 2 ,数据长度低字节<字的个数>WriteStr(6) = k ,数据长度<字节的个数> WriteStr(7) = &H12,写的第1个字的高字节WriteStr(8) = &H34,写的第1个字的低字节WriteStr(9) = &H56,写的第2个字的高字节WriteStr(10) = &H78,写的第2个字的低字节WriteStr(11) = &H9A,写的第3个字的高字节WriteStr(12) = &HBC,写的第3个字的低字节Call crc16(WriteStr(), 6 + k)WriteStr(9 + (k / 2 - 1) * 2) = HiByteWriteStr(10 + (k / 2 - 1) * 2) = LoByteMSComm1.InBufferCount = 0MSComm1.Output = WriteStr,写命令发送后,当接收到8个字节时中断CmdLenth = 8MSComm1.RThreshold = CmdLenth5.通讯事件中断产生时的数据处理:Private Sub MSComm1_OnComm()Dim inx() As ByteSelect Case mEventCase comEvReceive ,判断为接收事件MSComm1.InputLen = CmdLenth ,接收数据的长度inx = MSComm1.Input ,接收数据MSComm1.InBufferCount = 0For k = 3 To CmdLenth - 3tmpstr = tmpstr & "/" & Hex(inx(k))NextText1.Text = tmpstr ,以十六进制显示所接收长度的数据BeepEnd SelectEnd Sub。
用VB实现串行通信的开发应用
5图FL U K 表R S 3接口与机5针串口连线示意图用VB 实现串行通信的开发应用○刘玉志李昌禧VB (V isual B a sic )具有良好的图形用户接口(GU I )并支持面向对象的程序设计,使得以前用B C ++、VC ++进行W indow s 编程的复杂性局面得到了改观。
这得益于V B 近乎无限的可扩展性,首先表现在V B 可直接使用用户自定义控件V B X 或OC X 文件;其次表现在V B 可调用动态链接库(DL L )里众多的W indo ws API 函数。
这不仅大大扩充了程序的设计能力,而且使VB 可以实现原来只有B C ++或VC ++才能完成的功能,如串口编程等。
对于VB 的通信控件的介绍,目前国内众多的V B 应用资料中较少见到,本文以使用广泛的美国生产的FLU K E45万用表(以下简称FLU KE 表)测量参数的自动记录与数据管理通信程序开发为例,介绍VB 中通信控件的特性和应用。
一、通信机制FLU K E 表接收上位机传来的某一AS CI I 码命令后就执行相应的功能,其预留的9针R S -232接口与上位P C 机的25针串口连线如图1所示。
P C 机串口的模拟地与数字地要接在一起,否则通信时可能发生错误。
主要通信命令及功能(仅与电阻测试有关)如表1所示。
V isual B a sic 的灵活性很大程度上表现为它的控件(V B X)的可扩展性,它定义了VB X 的外部标准,可以使用许多独立软件公司编写的基于VB 的VB X 控件。
M S C om m 16.V B X 、M S C om m 32.VB X 就是由C r esc ent So ftw ar e 公司为M icr osoft 开发的包含在VB 套装软件中用于开发16位和32位Windo w s 串行通信的控件。
使用前只需从T ool 子菜单的Custum C ontro ls 中把M S C om m 控件调入工具框中即可使用。
vb串口编程实例
VB串口编程实例介绍VB(Visual Basic)是一种基于对象的编程语言,可用于开发Windows应用程序。
串口编程是指通过串行通信接口与外部设备进行数据交互。
本文将介绍如何使用VB进行串口编程,以实现与外部设备的通信。
前提条件在开始编写VB串口程序之前,需要确保以下条件已满足: - 安装了Visual Studio开发环境,可以选择最新版本的Visual Studio Community免费版。
- 确保计算机上有可用的串口(如COM1、COM2等)或USB转串口适配器。
步骤1. 创建新项目打开Visual Studio,选择创建一个新的VB Windows应用程序项目。
2. 添加控件在窗体上添加以下控件: - 一个ListBox控件用于显示接收到的数据。
- 两个Button控件分别用于打开和关闭串口。
- 一个ComboBox控件用于选择串口号。
- 一个TextBox控件用于输入要发送的数据。
- 一个Button控件用于发送数据。
3. 设置串口属性在窗体代码中添加如下代码:Imports System.IO.PortsPublic Class Form1Dim serialPort As New SerialPort()Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Lo ad' 获取可用的串口号并添加到ComboBox中Dim ports As String() = SerialPort.GetPortNames()ComboBox1.Items.AddRange(ports)End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click' 打开串口TryserialPort.PortName = ComboBox1.SelectedItem.ToString()serialPort.BaudRate = 9600serialPort.Parity = Parity.NoneserialPort.DataBits = 8serialPort.StopBits = StopBits.OneserialPort.Open()Button1.Enabled = FalseButton2.Enabled = TrueCatch ex As ExceptionMessageBox.Show("无法打开串口:" + ex.Message)End TryEnd SubPrivate Sub Button2_Click(sender As Object, e As EventArgs) Handles Button 2.Click' 关闭串口TryserialPort.Close()Button1.Enabled = TrueButton2.Enabled = FalseCatch ex As ExceptionMessageBox.Show("无法关闭串口:" + ex.Message)End TryEnd SubEnd Class4. 接收数据和发送数据在窗体代码中添加如下代码:Imports System.IO.PortsPublic Class Form1Dim serialPort As New SerialPort()Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Lo ad' 获取可用的串口号并添加到ComboBox中Dim ports As String() = SerialPort.GetPortNames()ComboBox1.Items.AddRange(ports)End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button 1.Click' 打开串口' 省略部分代码...AddHandler serialPort.DataReceived, AddressOf DataReceivedHandlerserialPort.Open()Button1.Enabled = FalseButton2.Enabled = TrueEnd SubPrivate Sub Button2_Click(sender As Object, e As EventArgs) Handles Button 2.Click' 关闭串口' 省略部分代码...RemoveHandler serialPort.DataReceived, AddressOf DataReceivedHandler serialPort.Close()Button1.Enabled = TrueButton2.Enabled = FalseEnd SubPrivate Sub DataReceivedHandler(sender As Object, e As SerialDataReceivedE ventArgs)' 接收数据并显示在ListBox中Dim data As String = serialPort.ReadLine()ListBox1.Invoke(Sub() ListBox1.Items.Add(data))End SubPrivate Sub Button3_Click(sender As Object, e As EventArgs) Handles Button 3.Click' 发送数据If serialPort.IsOpen ThenDim dataToSend As String = TextBox1.TextserialPort.WriteLine(dataToSend)TextBox1.Clear()ElseMessageBox.Show("请先打开串口")End IfEnd SubEnd Class5. 运行程序点击运行按钮,程序将打开一个窗口,其中包含串口选择、打开/关闭串口、接收数据和发送数据的功能。
基于vb程序的串口通信实验2
基于vb程序的串口通信实验一:实验目的:1通过实验,了解网络通讯的原理。
2了解TCP和UDP协议的基本知识。
3使用WINSLCK控件编写简单的网络应用程序。
4了解VB的WITH语句及枚举方法。
二:实验器材:两台pc机,一根电缆线。
三:实验原理:1. 通信部分:RS-232定义了21条接口电路的功能,接口连线叫做互换电路,简称电路。
21条电路按照功能可分为五类,每个电路都有一个具体的功能。
在本实验中,我们只是用到了其PIN2:发送数据TXD;PIN3:接收数据等引脚。
2.网络协议部分:协议就是一组程序或者标准,通过它们,不同类型和配置的计算机得以通讯.目前所有的计算机网络互连协议,都是基于ISO制定的OSI标准,OSI模型把网络连接从低到高划分为7个层次,物理层是最低的一层.在这一层上,主要解决电气上的技术问题.TCP协议是一个基于连结的允许创建和维护与远程计算机的连接.连结两台计算机就可以彼此进行数据传输.UDP协议则是一个无连结的协议.3.VB 部分:在里面我们用到了WINSOCK控件.四:实验运行结果: 1.发送:2.接收:3.设置参数:4.实验程序:五.实验总结:经过本次实验,使我学到了关于VB的相关知识,虽然我对VB的编程还不是很熟练,但是我相信在今后的学习中我一定可以加强编程能力的.六.程序清单:Private Sub Command1_Click()If MSComm1.PortOpen = True ThenMSComm1.PortOpen = FalseEnd IfMSComm1.Settings = "9600,N,8,1"MSComm1.RThreshold = 1MSComm1.PortOpen = TrueMSComm1.InputLen = 0End SubPrivate Sub Command2_Click()Call CommPortCloseintCommFlag = 0End SubCall FileSendManager(0)intCommFlag = 1End IfFileError:If intCommFlag > 0 ThenintCommFlag = 1ElseMsgBoxEnd IfEnd SubPrivate Sub xSend_Click()abc = tc.TextIf MSComm1.PortOpen = True Then MSComm1.PortOpen = FalseEnd IfMSComm1.Settings = "9600,N,8,1" MSComm1.PortOpen = TrueMSComm1.Output = abcMSComm1.PortOpen = FalseEnd SubPrivate Sub Command5_Click()abc = MSComm1.Inputtt.Text = abcEnd SubPrivate Sub Form_Load()Text1 = Winsock1.LocalIPIf MSComm1.PortOpen = False Then MSComm1.PortOpen = TrueEnd Ifabc = 0blnShowFlag = TrueMain.Height = 7000Call SetComm("9600,N,8,1", 2, 4096)intOutBufferSize = 2048imtCommFlag = 0monDialog1.Flags = &H200000 Or H2monDialog1.CancelError = TrueblnFileTransFlag = FalselReceive.Text = ""intArrayCount = 0End Sub基于vb程序的串口通信实验。
在VB环境下实现计算机串行端口通信
( ct nl lg, i nn cncl i rt F xn 13 0 ) Vaao aCo ee La ig h i v sy i l o Te aUn e i u i 0 0 2
Ab ta t h s a e i u s s h t o f e l i gc mmu ia in o o u e e il o t y MS o s r c i p p r s s e e me h d o ai n o T d c t r z n c t f mp trs r r c mm o t l f , o c a p b c nr o o VB w ih ma e o h c k sc mmu i ain s c e su t n - o e , n ew e o u e s n c t u c s f l n sa d a n s a db t e n c mp t r .An emeh d i mo ee s . o i l dt t o r ay h s Ke wo d e a o y r s S r c mmu i ai n Viu l a i . MS o i l nc t o s a sc6 0 b C mm o t l c nr o
O Cm n o m事件 ,o m vn属性存 有该错误或事件 的数值码。 Cm Eet 二 、 C mm 控件介绍 MS o 这也是此控件 唯一 的事件 ) M Cm S o m控件是 V 6 B. 0中的一个 A t e cvX控件 , i 提供 了两种 ( ( ) B f ro n: 9 I u eC u t用于返 回在接收缓存 区中的字符数 。该 n 处理通信的方式 : 一种为事 件驱动方式 , 该方式相 当于一般程 如果把该属性值设置 为 0 以清除接 , 序设计中的中断方式 。 当串口发生事件 或错误 时 , S o m控 属性在设计阶段无法使用 , M Cm 件会产生 O C m n o m事件 ,用户程序可以捕 获该 事件进行相应处 收缓存 区。
用VisualBasic实现串口通信的三种方法
2. 利用通信控件的实例
Sub Form1 —load ()
form1. show ′设置 COM1
comm1. commport = 1
comm1. Setting = " 9600 ,o ,8 ,1" ′波特率 : 9600 奇校验 ,8
位数据 ,1 位停止位
comm1. Inputlen = 0
一 、利用通信控件( MSCOMM) 完成串口通信
VB 提供了通信控件 MSCOMM,文件名为 MSCOMM. VBX。 该控件可设置串行通信的数据发送和接收 ,对串口状态及串 行通信的信息格式和协议进行设置 。在通信过程中可以触发 OnComm 事件 ,在该事件过程进行数据检验处理及检错 ,还可 以通过编程访问 CommEvent 属性来了解通信的情况 ,进行收 发数据的处理 。每个通信控件对应一个串口 ,如果要访问多 个通信口 ,则要设计多个通信控件 。
利用 VB 提供的这些功能 ,我们可以有三种方法完成串 口通信 。一种是用 VB 提供的具有强大功能的通信控件 ;另一 种方法是调用 WINDOWS API 函数 ,使用 WINDOWS 提供的 通信函数编写移植性强的应用程序 ;第三是利用文件的输 入/ 输出完成 ,该方法简便易行 ,但有一定的局限性 。
EofChar As String 3 1
·6 ·
参数 As 类型 ]) As 类型 在声明中 :DECLARE 表示声明 DLL 中的函数 ,当声明是
不具有返回值的过程时用 SUB 关键字 ,而如果调用的函数具 有返回值 ,则必须用 FUNCTION 关键字将其声明为函数并在 声明语句的最后用 AS 指明函数返回值的类型 。LIB 关键字表 示当前声明的过程或函数是库名所指定的库中函数而非 VB 本身的函数 。库名 ,就是对应动态链接库的名称 ,其中通信函 数在 USER 库中 。ByVal 关键字将原参数数据类型一一对应到 VB 类型中 。
基于VB的双串口通信
基于VB的双串口通信基于VB的双串口通信实验目的:利用VB编程,实现PC机双串口互相通信,掌握利用VB 实现通信的方法.实验仪器:PC机,vb软件实验原理:如果一台计算机有两个串口,可通过串口线将两个串口连接起来:COM1端口的TXD与COM2端口的RXD相连,COM1端口的RXD与COM2端口的TXD相连,COM1端口的GND与COM2端口的GND相连,如图6-6(a)所示,这是串口通信设备之间的最简单连接(即三线连接),图中的2号接收脚与3号发送脚交叉连接是因为在直连方式时,把通信双方都当作数据终端设备看待,双方都可以发送也可以接收。
如果一台计算机只有一个串行通信端口可以使用,那么将第2脚与第3管脚短路,如图6-6(b)所示,那么第3脚的输出信号就会被传送到第2脚,用以发送到同一串行端口的输入缓冲区,程序只要再由相同的串行端口上作读取的操作,即可将数据读入,一样可以形成一个测试环境。
串口设备最简单连接程序清单: ' 串口初始化' 串口1与串口2的通信参数应一致Private Sub Form_Load()mPort = 1 ' 设置通信端口号为COM1 MSComm1.Settings = "9600,n,8,1" ' 设置串口1参数MSComm1.InputMode = 0 ' 接收文本型数据MSComm1.PortOpen = True ' 打开通信端口1mPort = 2 ' 设置通信端口号为COM2 MSComm2.Settings = "9600,n,8,1" ' 设置串口2参数MSComm2.InputMode = 0 ' 接收文本型数据MSComm2.PortOpen = True ' 打开通信端口2End Sub' 把字符通过串口发送出去' 启动定时器Private Sub Cmdsend_Click()MSComm1.Output = Trim(Textsend.Text)Timer1.Enabled = TrueEnd Sub' 接收字符Private Sub Timer1_Timer()Dim buf$Timer1.Enabled = Falsebuf = Trim(MSComm2.Input) ' 将缓冲区内的数据读入buf变量中If Len(buf) = 0 Then ' 判断缓冲区内是否存在数据 TextReceive.Text = ""ElseTextReceive.Text = bufEnd IfEnd Sub' 停止程序运行Private Sub Cmdquit_Click()Unload MeEnd Sub' 关闭通信端口,Private Sub Form_Unload(Cancel As Integer)MSComm1.PortOpen = FalseMSComm2.PortOpen = FalseEnd Sub程序运行结果:心得体会:通过这次实验,让我们了解了如何用VB实现串口通信,同时对VB有了新的认识。
利用VB实现串口通信
利用 VB 实现串口通信
工作任务一 VB 的初步学习
【学习目的】
1.熟悉 Visual Basic 的基本概念。 2.掌握 Visual Basic 常用的语句。
【技能目标】
能初步使用 Visual Basic。
【相关知识】
知识一.Visual Basic
Visual Basic(简称 VB)是微软公司推出的一种可视化的、面向对象的结构化高级程 序设计语言,是当今世界上应用最广泛的编程语言之一,它也被公认为是编程效率最高的一 种编程语言。无论是开发功能强大、性能可靠的商务软件,还是编写能处理实际问题的实用 小程序,VB 都是最快速、最简便的语言。它简单易学、容易掌握,软件界面设计非常便捷, 编程工作量较小,开发周期短,特别适合非计算机专业的工程技术人员掌握和使用。
2
计算机测控系统安装与调试
Else If <语句> Else <语句> End If
4.选择语句 用了过多的 Else 后你会感到很不方便,而且程序结构也不清晰,所以 VB 中还有选择语 句帮助解决这个问题。 VB 中的选择语句的格式是这样的: Select Case <变量名> Case <情况 1> <语句> Case <情况 2> <语句> …… Case <情况 n> <语句> Case Else <语句> End Select 其中:<变量名>可以是数值型或字符串型,而每个 Case 指定的<情况>的数据类型必须 与<变量名>的类型一致。 5.循环语句 循环结构是计算机语言里一种重要的结构,它的应用广泛,最简单的例子是累加器的作 用,更直观的例子是把某件事重复指定次数,这样就不用把要重复的语句输入多次,而通过 循环结构完成,非常方便。循环是指在指定的条件下多次重复执行一组语句。被重复执行的 一组语句称为循环体。VB 提供了 4 种结构形式的循环语句: (1)For ... Next 语句 C 语言里有一个“for”循环语句,VB 里也有“For”关键字,作用也差不多,只是 VB 的“For”语句更容易理解。它的格式是: For <循环变量>=<初赋值> To <终值> [Step <步长>] 循环体 [Exit For] Next <循环变量> <循环变量>必须为数值型。默认时,<步长>值为 1,<初赋值>小于<终值>。当开始执行 For 语句时,首先将<循环变量>初始化为<初赋值>,程序每循环一次,<循环变量>增 1,直 到<循环变量>到达<终值>时为止。 注意:在默认情况下,Step 被设为“1”,可以省略,Step 也可以设为负值,例如: Dim a=0 For I=1 To 10 a=a+I Next I 这是一个最简单的累加器的例子,把 1 到 10 累加在一起,然后赋值给“a”。下面的效
使用VB开发串口USB通信软件
使用VB开发串口USB通信软件串口和USB通信软件是一种用于在计算机和外部设备之间进行数据传输的工具。
VB语言是一种适用于Windows平台的编程语言,可以使用VB 开发串口、USB通信软件。
串口通信是一种常见的数据传输方式,它通过计算机的串口(串行通信口)与外部设备进行连接。
在VB中,可以使用SerialPort类来实现串口通信。
下面是一个使用VB编写的串口通信软件的示例代码:```vbImports System.IO.PortsPrivate WithEvents SerialPort As New SerialPortPublic Sub New'设置串口参数SerialPort.PortName = "COM1"SerialPort.BaudRate = 9600SerialPort.Parity = Parity.NoneSerialPort.DataBits = 8SerialPort.StopBits = StopBits.OneEnd SubPublic Sub Open'打开串口SerialPort.OpenEnd SubPublic Sub Close'关闭串口SerialPort.CloseEnd SubPublic Sub WriteData(ByVal data As String)'向串口写入数据SerialPort.WriteLine(data)End SubPrivate Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) HandlesSerialPort.DataReceived'串口接收到数据时触发的事件Dim data As String = SerialPort.ReadLine'处理接收到的数据Console.WriteLine("Received data: " & data)End SubEnd Class```USB通信是另一种常用的数据传输方式,它通过计算机的USB接口与外部设备进行连接。
visualbasic串口通信及编程实例
visualbasic串口通信及编程实例Visual Basic串口通信及编程实例在实际的工业控制、机器人控制、智能家居等领域中,使用串口通信是一种非常广泛的方式。
Visual Basic (VB) 是一种微软公司开发的高级编程语言,它不仅易于学习,而且拥有丰富的图形界面设计和数据处理功能。
在本篇文章中,我们将深入介绍如何使用VB实现串口通信。
1. 建立串口通信首先,我们需要在VB中创建一个新的窗口(Form),然后打开工具箱,从中拖拽出一个SerialPort(串口)控件。
在控件属性中,我们需要为其指定相关的参数,例如串口名称、波特率、数据位、停止位、校验位等。
通常情况下,这些参数需要根据硬件设备的配置来进行调整。
在VB中实现串口通信的核心部分是对于SerialPort控件的事件监控。
具体来讲,当SerialPort收到一个数据包时,它会触发一个DataReceived事件。
对于这个事件,我们可以在程序中编写回调函数进行处理。
例如:Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e AsSystem.IO.Ports.SerialDataReceivedEventArgs) HandlesSerialPort1.DataReceived'在这里实现对于数据包的解析和处理End Sub2. 数据读取和发送在SerialPort控件中,有几种方法可以实现数据的读取和发送。
下面我们将介绍其中两种方法:(1) ReadExisting这个方法可以从串口中读取所有现有的数据,例如:Dim data As String = SerialPort1.ReadExisting()(2) Write这个方法可以向串口发送数据,例如:SerialPort1.Write("Hello World")注意,这个函数只能发送字符串数据。
VB中串口通讯的实现详解说明
VB中串口通讯的实现详解说明在VB中实现串口通讯可以分为以下几个步骤:1.引用串口通讯相关的命名空间首先在项目中引用System.IO.Ports命名空间,该命名空间包含了实现串口通讯所需的类和方法。
2.创建串口对象使用SerialPort类创建一个串口实例,可以指定串口的名称、波特率、数据位、停止位、校验位等参数。
```vbDim serialPort As New SerialPortserialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.DataBits = 8serialPort.StopBits = StopBits.OneserialPort.Parity = Parity.None```3.打开串口使用Open方法打开串口,可以在Open之前先判断串口是否已经打开。
```vbIf serialPort.IsOpen Then'串口已经打开ElseserialPort.OpenEnd If```4.串口数据接收通过事件处理函数来处理串口接收到的数据。
可以使用DataReceived事件来处理数据接收,当串口接收到数据时会触发该事件。
```vbPrivate Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles serialPort.DataReceived Dim data As String = serialPort.ReadExisting'处理接收到的数据End Sub```5.串口数据发送通过串口的Write方法来发送数据。
```vbserialPort.Write("Hello World")```需要注意的是,串口通讯是一种异步操作,发送和接收数据都需要一定的时间,因此在程序中需要合理处理串口的状态。
使用VB开发串口USB通信软件
或终端的TTL器件连接,必须在EIA-RS-232C与TTL电路之间进行电平和逻辑 关系的变换。实现这种变换的方法可用分立元件,也可用集成电路芯片。目 前较为广泛地使用集成电路转换器件,如MC1488、SN75150芯片可完成TTL 电平到EIA电平的转换,而MC1489、SN75154可实现EIA电平到TTL电平的 转换。
使用Windows的API应用程序接口
• EOFEnable 属性。确定在输入过程中 MSComm 控件是否寻找文件结尾 (EOF)字符。如果找到 EOF 字符,将停止输入并激活 OnComm 事件,此 时 CommEvent 属性设置为 comEvEOF。
语法:object.EOFEnable [ = value ]
• DSRHolding属性。确定Data Set Read(DSR)线的状态。该属性在设计时 无效,在运行时为只读。
• Settings属性。设置返回波特率、奇偶校验、数据位、停止位参数。当端口 打开时,如果属性值非法,则MSComm控件产生错误380(非法属性值)。
使用Windows的API应用程序接口
误
使用Windows的API应用程序接口
• InputMode常数。InputMode常数如表所示。
常数
值
描述
comInputModeText
0
(默认)通过Input属性以文本方式取回数 据
comInputModeBinary
1
通过Input属性以二进制方式检取回数据
CD 载波侦测(Carrier Detect)
RXD 接收数据(Receive)
用VB实现Modbus RTU串行通讯工程实例
用VB实现Modbus RTU串行通讯工程实例声明:网上看到的,觉得不错,稍微整理了一下分享给大家。
用VB实现Modbus RTU串行通讯在一些应用中可能需要使用诸如VB来进行上位机监控程序的开发,而Modbus 协议是这类应用中首选的通讯协议;Modbus协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。
这里对VB和Twido PLC间的通讯进行说明。
对于大部分应用,Twido PLC作为从站,它不需要编制通讯程序,只要把通讯口的参数设置好即可,例如下图表示此Twido通过编程口和上位机连接,其站号地址为2;波特率、数据位、校验、停止位和上位机设置保持一致。
VB程序通过利用MSComm控件很容易就能够实现。
1.通讯口初始化:MSComm1.Settings = "9600,n,8,1"mPort = 1MSComm1.SThreshold = 0If Not MSComm1.PortOpen Then MSComm1.PortOpen = True2. CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。
Function crc16_1(ByRef cmdstring() As Byte, ByVal j As Integer)Dim data As IntegerDim i As IntegerAddressreg_crc = &HFFFFFor i = 0 To jAddressreg_crc = Addressreg_crc Xor cmdstring(i)For j = 0 To 7data = Addressreg_crc And &H1If data ThenAddressreg_crc = Int(Addressreg_crc / 2)Addressreg_crc = Addressreg_crc And &H7FFFAddressreg_crc = Addressreg_crc Xor &HA001ElseAddressreg_crc = Addressreg_crc / 2Addressreg_crc = Addressreg_crc And &H7FFFEnd IfNext jNext iIf Addressreg_crc < 0 ThenAddressreg_crc = Addressreg_crc - &HFFFF0000End IfHiByte = Addressreg_crc And &HFFLoByte = (Addressreg_crc And &HFF00) / &H100End Function3.读多个字的命令(本例是从2号站读%MW10起始的4个字): Dim SendStr(7) As ByteDim RcvStr() As ByteSendStr(0) = 2 ,从站号是2SendStr(1) = &H3 ,读多个字的命令代码SendStr(2) = 0 ,起始地址高字节SendStr(3) = 10,起始地址低字节SendStr(4) = &H0,数据长度高字节SendStr(5) = 4 ,数据长度低字节Call crc16(SendStr(), 5) ,CRC计算SendStr(6) = HiByteSendStr(7) = LoByte,读命令发送后,当接收 5 + SendStr(5) * 2 个字节时产生中断 CmdLenth = 5 + SendStr(5) * 2MSComm1.RThreshold = CmdLenthMSComm1.Output = SendStr ,发送命令4.写多个字的命令(本例是写2号站%MW20起始的3个字): Dim WriteStr() As Bytek = 6 ,写6个字节ReDim WriteStr(8 + k)WriteStr(0) = 2 ,从站号是2WriteStr(1) = &H10 ,写多个字的命令代码WriteStr(2) = 0 ,起始地址高字节WriteStr(3) = 20 ,起始地址低字节WriteStr(4) = &H0 ,数据长度高字节<字的个数>WriteStr(5) = k / 2 ,数据长度低字节<字的个数>WriteStr(6) = k ,数据长度<字节的个数> WriteStr(7) = &H12,写的第1个字的高字节 WriteStr(8) = &H34,写的第1个字的低字节 WriteStr(9) = &H56,写的第2个字的高字节 WriteStr(10) = &H78,写的第2个字的低字节WriteStr(11) = &H9A,写的第3个字的高字节 WriteStr(12) = &HBC,写的第3个字的低字节Call crc16(WriteStr(), 6 + k)WriteStr(9 + (k / 2 - 1) * 2) = HiByte WriteStr(10 + (k / 2 - 1) * 2) = LoByteMSComm1.InBufferCount = 0MSComm1.Output = WriteStr,写命令发送后,当接收到8个字节时中断 CmdLenth = 8MSComm1.RThreshold = CmdLenth5.通讯事件中断产生时的数据处理: Private Sub MSComm1_OnComm() Dim inx() As ByteSelect Case mEventCase comEvReceive ,判断为接收事件MSComm1.InputLen = CmdLenth ,接收数据的长度 inx = MSComm1.Input ,接收数据MSComm1.InBufferCount = 0For k = 3 To CmdLenth - 3tmpstr = tmpstr & "/" & Hex(inx(k))NextText1.Text = tmpstr ,以十六进制显示所接收长度的数据BeepEnd SelectEnd Sub。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
执行方
Private Sub shutdown(s As String) Select Case s Case "r" MsgBox "系统将要重启" Comm1.Output = "重启命令执行!" Comm1.PortOpen = False Shell "shutdown -R -t 0" '-r 是重启 等待时间为0秒 Case "s" MsgBox "系统将要关机" Comm1.PortOpen = False Comm1.Output = "关机命令执行!" Shell "shutdown -S -t 0" '-s 是关闭系统 End Select End Sub
Private Sub Form_Load() Comm1.PortOpen = True s = "" End Sub Private Sub Comm1_OnComm() Dim st As String Select Case mEvent Case comEvCD ' CD 线的状态发生变化. Case comEvCTS ' CTS 线的状态发生变化. Case comEvDSR ' DSR 线的状态发生变化. Case comEvRing ' Ring Indicator 变化. Case comEvReceive ' 收到 RThreshold # of st = Comm1.Input shutdown Trim(st) End Select End Sub
命令方
Private Sub CmdExit_Click() Comm1.PortOpen = False End End Sub Private Sub Cmdreboot_Click() Comm1.Output = "r" End Sub Private Sub Cmdshutdown_Click() Comm1.Output = "s" End Sub Private Sub Command1_Click() lblReceive.Caption = "" End Sub
Private Sub Comm1_OnComm() Dim s As String Select Case mEvent Case comEvReceive s = Comm1.Input txtreceive.Text = txtreceive.Text + s Case comEvSend End Select End Sub
Private Sub Comm1_OnComm() Select Case mEvent Case comEvCD ' CD 线的状态发生变化. Case comEvCTS ' CTS 线的状态发生变化. Case comEvDSR ' DSR 线的状态发生变化. Case comEvRing ' Ring Indicator 变化. Case comEvReceive ' 收到 RThreshold # of lblReceive.Caption = lblReceive.Caption + Comm1.Input Case comEvSend „ 传输缓冲区有 Sthreshold 个字符 End Select End Sub
程序验证
验证程序
Private Sub Command1_Click() Dim s As String Dim so As String Dim si As String s = Trim(Text1.Text) so = outchecksum(s) si = inchecksum(so) Text2.Text = si End Sub
4.3 控制服务器的模拟
控制服务器是指负责根据远方的 命令进行相应的控制操作者.
设计要求 总体思想: 由命令方将控制命令发送出去,控制服 务器(执行方)接收到命令后执行命令 并返回控制情况。
详细设计 1)命令由主控机发出: 关机指令和重启指令 2)控制服务器接收到其中任何一个指 令后进行相应的操作(关机或重启), 并返状态信息。
txtReceive.Text = txtReceive.Text + Buf
StrPos = InStr(1, Buf, "%%")
返回在某字符串中字符串的最先出现 的位置。InStr(1,”ABCD12”,”12”) 由字符串的左边第一个字符开始寻找, 原始字符串是”ABCD12”,在其中寻 找“12”这组字符串的位置,此时的 返 回值是5,也就是从原始字符串中算起 的第五个字符就可以发现字符串“12” 的位置。
第四章 使用VB模拟串行通信 设备
4.1 通信方式
EA Request Receive Acknowledge End
Data
E B
Send
4.2 数据错误检测机制
CheckSum的使用
CheckSum的基本思想
将发送双方发送和接收的字符串中的 字符一一进行相加(以对应的ASCII 码),再对255取余数。 发送方该余数转换成两个字符,并含 在原来字符串的尾端送出; 接收方收到数据后将求得的余数与字 符串末尾的两个字符作比较,相同则 没有错误,不同则有错误,可以进行 相应的操作。
4.4 数据服务器的仿真 数据服务器用于给要求者提供 数据,该数据由数据服务器负 责收集后,在按照一定的方式 发送给要求方。
目的:数据服务器给要求者提 供文字形式的数据,该数据由 服务器负责收集后,再按照文 字的形式发送给要求方。
代码分析(命令方) Private Sub CmdSend_Click() Comm1.Output = Trim(txtSend.Text) End Sub
关于Shell 文字操作系统与外部最主要的接 口就叫做shell。shell是操作系统 最外面的一层。shell管理你与操 作系统之间的交互:等待你输入, 向操作系统解释你的输入,并且 处理各种各样的操作系统的输出 结果。
关于Shell Shell基本上是一个命令解释器, 类似于DOS下的。 它接收用户命令(如ls等),然后 调用相应的应用程序。较为通用 的shell有标准的Bourne shell (sh) 和C shell (csh)。
代码实现(接收端)
Public Function inchecksum(inbuf As String) As String Dim buflen As Integer Dim buf As String Dim i As Integer Dim checksum As Long buflen = Len(inbuf) checksum = 0
代码实现(发送端)
For i = 1 To buflen buf = Mid(inbuf, i, 1) checksum = checksum + Asc(buf) Next i checksum = checksum And &HFF '字符串重组,并加上结尾字符Cr buf = IIf(Len(Hex(checksum)) = 1, "0" & Hex(checksum), Hex(checksum)) outchecksum = inbuf & buf & vbCr End Function
综合验证程序
Private Sub cmdandnoise_Click() Comm1.Output = outchecksum(Trim(txtSend.Text)) + "NOISE" End Sub Private Sub CmdSend_Click() Comm1.Output = outchecksum(Trim(txtSend.Text)) End Sub
代码分析(数据服务器方) Private Function getdata(i As Integer) As Single getdata = Sinmm1_OnComm() Dim Buf$, StrPos%, CmdStr$ , i% Select Case mEvent Case comEvReceive Buf = Trim(Comm1.Input) If Len(Buf) < 2 Then Exit Sub
代码实现(接收端)
For i = 1 To buflen - 3 buf = Mid(inbuf, i, 1) checksum = checksum + Asc(buf) Next i checksum = checksum And &HFF If checksum = Val("&H" & Mid(inbuf, buflen - 3 + 1, 2)) Then inchecksum = Mid(inbuf, 1, buflen - 3) Else inchecksum = "传输过程出现错误" End If End Function
计算字符串长度
数值归零 (CheckSum=0) ChesckSum和字符的 ASCII 码相加 函数结束
返回组合字符串 组合源字符串、 CheckSum字符串以及 结尾字符串 转换CheckSum为 字符串格式
数值和&HFF 作AND运算
所有字符都算完了吗?
代码实现(发送端)
Public Function outchecksum(inbuf As String) As String Dim buflen As Integer, buf As String Dim i As Integer Dim checksum As Long buflen = Len(inbuf) checksum = 0 '求和并取余