VB三种读取串口数据的方式
VB.NET串口控件的使用和说明来自安的博客
串口控件的使用和说明来自安的博客上位机软件,尤其是串口监听软件是我们常用到的工具。
这里我讲解一下使用时,串口控件的使用和串口的配置。
一、认识串口控件,名称SerialPort,调用方式如下图所示。
二、串口常用参数说明:名称说明BaseStream获取SerialPort对象的基础Stream对象。
BaudRate获取或设置串行波特率。
BreakState获取或设置中断信号状态。
BytesToRead获取接收缓冲区中数据的字节数。
BytesToWrite获取发送缓冲区中数据的字节数。
CDHolding获取端口的载波检测行的状态。
Container 获取 IContainer,它包含 Component。
(从Component 继承。
)CtsHolding获取“可以发送”行的状态。
DataBits获取或设置每个字节的标准数据位长度。
DiscardNull获取或设置一个值,该值指示 Null 字节在端口和接收缓冲区之间传输时是否被忽略。
DsrHolding获取数据设置就绪 (DSR) 信号的状态。
DtrEnable获取或设置一个值,该值在串行通信过程中启用数据终端就绪 (DTR) 信号。
Encoding获取或设置传输前后文本转换的字节编码。
Handshake获取或设置串行端口数据传输的握手协议。
IsOpen获取一个值,该值指示 SerialPort 对象的打开或关闭状态。
NewLine获取或设置用于解释ReadLine和WriteLine方法调用结束的值。
Parity获取或设置奇偶校验检查协议。
ParityReplace获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节。
PortName获取或设置通信端口,包括但不限于所有可用的 COM 端口。
ReadBufferSize获取或设置 SerialPort 输入缓冲区的大小。
ReadTimeout获取或设置读取操作未完成时发生超时之前的毫秒数。
vb串口通讯usb通讯,很有用哦
OnComm:通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及错误进行处理。通过对CommEvent 属性的判断可知当前的通信错误和事件,分别对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。如:CommEvent = MSCOMM—EV—SEND 表示发送事件。这些信息可从VB 提供的常量文件CONSTANT. TXT中查出。
完成发送数据后的一系列操作。如:对刚发送的数据进行处理,当串口是和MODEM通信时,发送完数据后可进行拆除线路联接、挂机等操作。
RThreshold :设置并返回不触发OnComm事件时接收缓冲区被允许的最多字符数。当缓冲区的字符多于设置的值时,则触发OnComm 事件,并把CommEvent 设为MSCOMM—EV—RECEIVE,当RThreshold = 0 则禁止接收触发OnComm 事件,当RThreshold = 1 则接收缓冲区有一个或更多字符时就触发OnComm事件。利用这一属性,就可完成对串口接收数据的处理。
comm1. OutBufferSize = 512 ′设置发送缓冲区为512 字节 comm1. InBufferSize = 512 ′设置接收缓冲区为512 字节
comm1. SThreshold = 0 ′禁止发送事件
comm1. RThreshold = 1 ′每一个字符到接收缓冲区都触发接收事件 ′设置COM2
(2)属性
CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。 Setting :设置通信的信息格式,为字符型。顺序为:波特率、校验、数据位、停止位。
PortOpen :布尔型、开关通信口。
InputLen :从接收缓冲区读取字符个数。
VB串口
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Micro soft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的A ctiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnCo mm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSC omm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
2.MSComm控件的常用属性MSComm1.Settings:=’9600,n,8,1’; //设置波特率 ,校验位,数据位,停止位Settings属性:设置串口的波特率 ,校验位,数据位,停止位, ’9600,n,8,1’表示波特率为9600,无奇偶校验,数据位为8为,1位停止位MSComm1.InBufferSize:=1024; // 接受缓冲区大小InBufferSize 属性:接收缓冲区的大小,默认值为1024,也可以自己设定,比如, MSComm1.InBufferSi ze:=2000,则接收缓冲区的大小为2000字节MSComm1.OutBufferSize:=1024; // 发送缓冲区大小OutBufferSize属性:发送缓冲区的大小,默认值为1024,也可以自己设定。
vb串口数据采集及曲线动态显示
串口数据采集及曲线动态显示这个程序主要用到了串口通信和曲线画图一.主要控件Msomm控件一个,两个timer控件,textbox控件,combo控件,picture控件,command 控件二.实现的功能能1.串口采集数据2.用曲线动态显示数据3. 显示时间4.鼠标点击读数(确定所点击位置的横纵坐标)三.界面四.程序Dim T As VariantDim c As VariantDim Y As IntegerPrivate Declare Sub Sleep Lib "kernel32 " (ByVal dwMilliseconds As Long) 'API,用sleep实现延时'延时函数Function delay(number)Call Sleep(number)DoEventsEnd FunctionPrivate Sub Combo1_Click() '选择端口If Combo1.Text = "COM1" ThenmPort = 1ElseIf Combo1.Text = "COM2" ThenElseIf Combo1.Text = "COM3" ThenmPort = 3ElseIf Combo1.Text = "COM4" ThenmPort = 4ElsemPort = 5End IfEnd SubPrivate Sub Command3_Click() '停止采集Timer2.Enabled = FalseMSComm1.PortOpen = FalseCommand2.Caption = "打开串口"End SubPrivate Sub Form_Load() '初始化MSComm1.Settings = "9600,N,8,1"MSComm1.InputMode = 0MSComm1.RThreshold = 1MSComm1.SThreshold = 0MSComm1.InBufferSize = 1024MSComm1.OutBufferSize = 512MSComm1.InBufferCount = 0MSComm1.OutBufferCount = 0Combo1.AddItem "COM1"Combo1.AddItem "COM2"Combo1.AddItem "COM3"Combo1.AddItem "COM4"Combo1.AddItem "COM5"Picture1.Scale (-100, 100)-(100, -100)Command1.Caption = "采集数据"Command2.Caption = "打开串口"Timer1.Interval = 1000Timer2.Interval = 1000Timer2.Enabled = FalseEnd SubPrivate Sub Command2_Click()If Command2.Caption = "打开串口" ThenMSComm1.PortOpen = TrueCommand2.Caption = "关闭串口"ElseIf Command2.Caption = "关闭串口" ThenCommand2.Caption = "打开串口"End IfEnd SubPrivate Sub MSComm1_OnComm() '触发事件If MSComm1.InBufferCount > 0 ThenText4.Text = MSComm1.Inputc = Val(Text4.Text)delay (20)End IfEnd SubPrivate Sub draw()Picture1.FontSize = "15" '设置字体大小Picture1.DrawWidth = 1Picture1.ForeColor = QBColor(12)Picture1.ClsPicture1.Line (-88, -88)-(-88, 88) '纵坐标Picture1.Line (-89, 86)-(-88, 88) '纵坐标箭头及y值Picture1.Line (-87, 86)-(-88, 88)Picture1.PSet (-86, 88)Picture1.Print "y"Picture1.Line (-88, 0)-(88, 0) '横坐标Picture1.Line (86, 1)-(88, 0) '横坐标箭头及x值Picture1.Line (86, -2)-(88, 0)Picture1.PSet (88, -1)Picture1.Print "x"Picture1.DrawWidth = 4Picture1.FontSize = 8For Y = -80 To 80 Step 10Picture1.PSet (-88, Y)Picture1.Print (Y)Next YT = -88Timer2.Enabled = TrueEnd SubPrivate Sub Picture1_MouseDOWN(Button As Integer, Shift As Integer, B As Single, A As Single) '"光标线读数"Text1.Text = BText2.Text = AEnd SubPrivate Sub Command1_Click() '开始采集Call drawEnd SubPrivate Sub Timer2_Timer() '画图Picture1.DrawWidth = 1Picture1.PSet (T, c), vbGreenT = T + 0.5If T > 88 ThenCall drawEnd IfEnd SubPrivate Sub Timer1_Timer() '显示时间Text3.Text = CStr(Time$())End Sub。
VB.Net串口通信用法
串口通信用法 串口通信用法对于初次使用 的SerialPort 编写串口通信的朋友,这些是很必要的知识,也是编写串口通信程序前的知识准备。
1、使用 SerialPort 设置串口属性进行串口通讯时,需要设置一些相关参数,可以通过设置SerialPort 类的属性来进行。
串口属性主要包括.PortName 串口名称,COM1, COM2等。
.BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。
.Parity 奇偶校验。
可以选取枚举Parity中的值.DataBits 数据位.StopBits 停止位,可以选取枚举StopBits中的值.Handshake 握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值对其中几个关键术语解释:a,波特率:这是一个衡量通信速度的参数。
它表示每秒钟传送的bit的个数。
例如300波特表示每秒钟发送300个bit。
当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。
这意味着串口通信在数据线上的采样率为4800Hz。
通常电话线的波特率为14400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:这是衡量通信中实际数据位的参数。
当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。
如何设置取决于你想传送的信息。
比如,标准的ASCII码是0~127(7位)。
扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。
由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
c,停止位:用于表示单个包的最后一位。
VB串口数据接收方式
1、在OnComm 事件中接收数据:这种方式能充分MSCOMM控件的特性。
OnComm 事件还可以检查和处理通讯错误;可以通过检查CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。
Private Sub MSComm_OnComm ()Select Case mEvent' 错误Case comEventBreak ' 收到Break。
Case comEventCDTO ' CD (RLSD) 超时。
Case comEventCTSTO ' CTS Timeout。
Case comEventDSRTO ' DSR Timeout。
Case comEventFrame ' Framing ErrorCase comEventOverrun '数据丢失。
Case comEventRxOver'接收缓冲区溢出。
Case comEventRxParity' Parity 错误。
Case comEventTxFull '传输缓冲区已满。
Case comEventDCB '获取DCB] 时意外错误' 事件Case comEvCD ' CD 线状态变化。
Case comEvCTS ' CTS 线状态变化。
Case comEvDSR ' DSR 线状态变化。
Case comEvRing ' Ring Indicator 变化。
Case comEvReceive ' 收到RThreshold # of chars.Case comEvSend ' 传输缓冲区有Sthreshold 个字符'Case comEvEof ' 输入数据流中发现EOF 字符End SelectEnd Sub2.轮循法采集数据:A、定时器轮循法对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。
简单的VB串口通讯入门
我的VB串口读写入门首先需要的是在VB中增加一个microsoft comm control 6.0的控件。
步骤就是:工程(project)->部件(components)->点击,出现对话框下拉垂直滑动杆,找到“microsoft comm control 6.0”点击前面的矩形框,确定。
先介绍一下必须熟悉几个属性:CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。
也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
然后给大家一个读串口的小例程:Private Sub Form_Load()mPort = 1 '选择com1Mscomm1.Settings = "9600,N,8,1" '设置波特率为9600,没有奇偶校验,8位数据位,1位结束位Mscomm1.InputLen = 0 '读取全部的输入缓冲区If Mscomm1.PortOpen = False Then Mscomm1.PortOpen = True '端口打开Mscomm1.RThreshold = 2Mscomm1.SThreshold = 2End SubPrivate Sub Mscomm1_OnComm() '所有的通讯事件都可以激发MSComm1控件的OnComm 事件Select Case mEventCase comEvReceive'此处的代码可以进行当串口的接受缓冲区里有RThreshold个字符的处理Text4 = Text4 & Mscomm1.InputCase comEvSend'此处的代码可以进行当串口的发送缓冲区里有SThreshold个字符的处理End SelectEnd SubUnload 事件是当窗体从屏幕上删除时发生。
VB串口通信数据采集
VB串口通信数据采集2009-05-12 18:40前两天受人之托写的一个程序,发上来共享,从中可以看到串口通信的常用处理方式,希望对大家有所帮助。
一、系统需求:使用三线制串口,利用vb与dsp通信,采集数据并存储为文本文件。
二、通信协议1. RS232串行通信的波特率设为9600,8位数据位,一位停止位,无校验位。
2. 每组数据包含T1(16位)和T2(16位),将每个数据分成2个8位的数据,先是低8位,然后是高8位。
数据为无符号整型。
先发T1,然后发T2,然后是下一组T1、T2。
T1以头数据0x0A(16进制,10进制位10)为头字节,然后是T1的低8位,T1的高8位。
T2以头数据0xA0(16进制,10进制位160)为头字节,然后是T2的低8位,T2的高8位。
发送时序举例:0x0A, t1低8位,t1高8位,0xA0, t2低8位,t2高8位……将收到的数据T1、T2的高低8位合并,转换成10进制数,以每行T1 T2的形式存储到txt文本文件中。
三、要点说明0. 如果通信协议没有考虑周全就着手开始做,可能会经受无比的痛苦1. 文本框textbox的大小限制为32k,不符合大量数据的需要,因此使用richtextbox2. 换行符为Chr(&HD) + Chr(&HA)3. 需要用状态栏给出必要的信息4. 保存文件的默认名字为当前日期5. 收到comm事件后,需要关闭com事件接收,避免再次触发事件Dim av As VariantDim datacount As LongPrivate Sub cmdClear_Click()txtData.Text = ""End SubPrivate Sub cmdStop_Click()'关闭端口If MSComm.PortOpen = True ThenMSComm.InBufferCount = 0 '清空缓冲区MSComm.PortOpen = FalseEnd IfcmdReceive.Enabled = TruelblStatus.Caption = "停止接收,空闲"End SubPrivate Sub cmdReceive_Click()'串口设置With MSComm.CommPort = 1.Settings = "9600,N,8,1".RThreshold = 1 '接收1字节触发oncomm事件.InputMode = comInputModeBinary.InputLen = 1 '输入长度为1.InBufferCount = 0 '清除接收缓冲区End With'打开端口If MSComm.PortOpen = False ThenMSComm.PortOpen = TrueIf Err ThenMsgBox (Err.Description)Exit SubEnd IfEnd IflblStatus.Caption = "打开端口,等待接收" datacount = 0cmdReceive.Enabled = FalseEnd SubPrivate Sub cmdSave_Click()Dim outfn As StringMsgBox ("接收了" + CStr(datacount) + "组数据") lblStatus.Caption = "接收完成,请选择输出文件"cmdReceive.Enabled = True'选择输出文件CommonDialog1.FileName = CStr(Date) + ".txt"CommonDialog1.Filter = "Text Files|*.txt"CommonDialog1.Flags = CommonDialog1.Flags Or cdlOFNOverwritePrompt CommonDialog1.CancelError = TrueOn Error GoTo errhandlerCommonDialog1.ShowSaveoutfn = CommonDialog1.FileNameOpen outfn For Output As #1Print #1, txtData.TextClose #1'txtData.SaveFile outfnlblStatus.Caption = "输出完成,空闲"errhandler:Exit SubEnd SubPrivate Sub Form_Load()lblStatus.Caption = "空闲"End SubPrivate Sub Form_Unload(Cancel As Integer)'关闭端口If MSComm.PortOpen = True ThenMSComm.InBufferCount = 0 '清空缓冲区MSComm.PortOpen = FalseEnd IfEnd SubPrivate Sub MSComm_OnComm()Dim T1, T2 As LongSelect Case mEventCase comEvReceive '收到Rthreshold个字节产生的接收事件MSComm.RThreshold = 0 '关闭OnComm事件接收lblStatus.Caption = "接收"av = MSComm.Input '读取一个接收字节dataframe(1) = av(0) '转换为字节If dataframe(1) = &HA Then '接收到T1DoDoEventsLoop Until MSComm.InBufferCount >= 2 '循环等待接收缓冲区>=2个字节av = MSComm.Inputdataframe(2) = av(0)av = MSComm.Inputdataframe(3) = av(0) '接收T1T1 = dataframe(2) + CLng(dataframe(3)) * 256 '计算T1End IfDoDoEventsLoop Until MSComm.InBufferCount >= 1 '循环等待接收缓冲区>=1个字节av = MSComm.Input '读取一个接收字节dataframe(4) = av(0) '转换为字节'接收到T2If dataframe(4) = &HA0 Then'MSComm.RThreshold = 0 '关闭OnComm事件接收'循环等待接收缓冲区>=2个字节DoDoEventsLoop Until MSComm.InBufferCount >= 2av = MSComm.Inputdataframe(5) = av(0)av = MSComm.Inputdataframe(6) = av(0) '接收T2T2 = dataframe(5) + CLng(dataframe(6)) * 256 '计算T2'显示T1 T2 entertxtData.Text = txtData.Text + CStr(T1) + " " + CStr(T2) + Chr(&HD) + Chr(&HA)datacount = datacount + 1 '数据组数+1End IfMSComm.RThreshold = 1 '打开OnComm事件接收Case ElseEnd SelectEnd Sub。
利用VB如何进行串口读写
利用VB如何进行串口读写在VB中,可以使用SerialPort类来进行串口读写操作。
以下是使用VB进行串口读写的一般步骤:1. 引用System.IO.Ports命名空间:在代码文件的顶部,添加Imports System.IO.Ports命名空间,以便可以使用SerialPort类。
2. 创建SerialPort对象:在代码中创建SerialPort对象,并设置串口的各种属性,如端口名称、波特率、数据位、校验位、停止位等。
例如:```vbDim serialPort As New SerialPortserialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.Parity = Parity.NoneserialPort.DataBits = 8serialPort.StopBits = StopBits.One```3. 打开串口:使用serialPort.Open(方法打开串口,并检查串口是否成功打开。
例如:```vbTryserialPort.OpenIf serialPort.IsOpen ThenMessageBox.Show("串口已打开")End IfCatch ex As ExceptionMessageBox.Show("串口打开失败:" & ex.Message)End Try```4. 读取串口数据:使用serialPort.DataReceived事件来处理接收到的数据。
例如:```vbPrivate Sub serialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles serialPort.DataReceived Dim receivedData As String = serialPort.ReadExisting'处理接收到的数据End Sub```5. 写入串口数据:使用serialPort.Write(方法向串口写入数据。
串口通讯及其在VB平台下的实现
串口通讯及其在VB平台下的实现摘要:本文首先介绍串行通讯的基础知识,然后结合示例剖析在VB平台下的串口通讯的编程技巧。
随着计算机系统的普及与外围设备技术的发展,计算机与外围设备之间的通讯就显得越来越重要了。
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。
对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。
在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。
所以串行接口是微机应用系统常用的接口,而相应的应用程序也成为今年来研究的热点。
本文旨在阐述一般的穿口通讯的原理及其程序设计,希望借此能够抛砖引玉,为更深入的研究打下一定的基础。
一、串行通讯的基本原理所谓"串行通信"是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。
相比之下,由于高速率的要求,处于计算机内部的CPU与串口之间的通讯仍然采用并行的通讯方式,所以串行口的本质就是实现CPU与外围数据设备的数据格式转换(或者称为串并转换器),即当数据从外围设备输入计算机时,数据格式由位(bit)转化为字节数据;反之,当计算机发送下行数据到外围设备时,串口又将字节数据转化为位数据。
二、串口通讯的程序设计原理前面介绍了串行通讯的基本原理,那么如何在程序设计中实现它呢?事实上,这个过程并不复杂,一般有两种实现途径:其一就是使用MSCOMM控件,此控件提供很多方便操作的属性和方法,利用它们可以很方便地实现你的目的;另外一种途径就是使用Windows API,微软为开发者提供了很多相关的串行操作的编程接口,使用这些接口,可以很完成更为强大的功能。
VB下实现串口通信的方法
VB下实现串口通信的方法1 VB下实现串口通信的方法1.1 通信控件MSComm简介VB下的串行端口通信是通过其提供的控件Microsoft Comm control(简称MSComm)实现的。
该控件屏蔽了通信过程中的底层操作,程序员只需设置并监视MSComm控件的属性和事件,结合其它VB提供的控件就可完成对串口的初始化和数据的发送接收。
本系统中用到的主要MSComm控件属性如下:①、Commport:设置并返回通信端口代码。
默认值为1,最大值为16,需要使用超过16个通信端口时,要采用其他方式操控通信端口(如PcommPro软件)。
例如将串口2设为通信端口:mPort=2。
②、Setting:设置初始化参数。
其格式为“****,P,D,S”,其中****为波特率(baud),P为校验方式,D为数据位数,S为停止位。
默认值为“9600,N,8,1”,意为“串口通信速度为9600Baud,无校验,每次数据为8个Bit,停止位为1个Bit”。
波特率可为110,300,600,1200,2400,9600,14400,19200,28800,38400(保留)等等。
校验位默认为None(无校验),若传输距离长,可增加校验位,可选M为符号校验,E为偶校验,O为奇校验,S为空白校验。
停止位的设定值可为:1(默认值),1.5,2。
此处的设置要和单片机侧的设置保持一致,否则不能实现正常的通信。
例如我们采用的初始化参数为“2400,N,8,1”,则单片机侧的设置相应项为:定时器1的初值为E6并且SMOD(串行口波特率加倍位)为1(对应2400Bit),串口控制寄存器SCON为40(10位异步收发,对应8Bit数据位,1Bit停止位)。
③、PortOpen:设置或返回通信端口状态。
④、Input:从缓冲区返回并删除字符。
将串行输入寄存器的数据读出,并清除寄存器中已读取的数据。
寄存器的特性是FIFO(First In First Out,先进先出)。
VB2005串口通讯 (2)
VB2005串口通讯VB2005自带了一个串口通讯的控件SerialPort,该控件类似于VB6.0的串口Mscomm,但又有一定区别。
下面是对它们的一个比较:1.串口的打开/关闭VB6.0串口打开是MSComm1.PortOpen =True,VB2005则直接调用SerialPort1.OpenVB6.0串口关闭是MSComm1.PortOpen= False,VB2005则直接调用SerialPort1.Close2.参数的设置对比VB串口设置可以单独设置,也可以通过其Setting属性设置如:MSComm1.Settings = "9600,n,8,2"而VB2005的串口属性只能分别设置,如:端口:SerialPort1.PortName波特率:SerialPort1.BaudRate数据位长度:SerialPort1.DataBit奇偶校验:SerialPort1.Parity停止位:SerialPort1.StopBits3.向串行端口输出缓冲区写数据VB6.0向串口写数据是MSComm1.Output方法,其传递的是字符串或数据的起始地址VB2005向串口写数据是通过SerialPort1.Write方法,该方法有三种方式:(1).直接输出字符串,该方式只有一个参数,string,如:SerialPort1.Write SendString这里面SendString是一个字符串(2).以字节方式输出,这种方式有三个参数:第一个参数是要输出的字节数据的起始地址第二个参数是从字节数据的第几个开始第三个参数是要发送的字节个数例如:SerialPort1.Write (SendByte,1,10)就是指把字节数组的SendByte的第1到第10个字节发送到输出缓冲区(3).以字符方式输出,这种方式也有三个参数:第一个参数是要输出的字符数据的起始地址第二个参数是从字符数据的第几个开始第三个参数是要发送的字符个数例如:SerialPort1.Write (SendChar,1,10)就是指把字符数组的SendByte的第1到第10个字符发送到输出缓冲区4.从串行端口输入缓冲区读数据VB6.0从串口读数据是MSComm1.Input方法,其返回的是字符串或一个一维数据 VB2005从串口读数据是通过SerialPort1.Read方法,该方法有二种方式:(1).以字节方式读出,这种方式有三个参数:第一个参数buffer,是将输入写入到其中的字节数组第二个参数offset,缓冲区数组中开始读出的偏移量,对于从头读的数据,应将其设为1第三个参数count,要读取的字节数,如果读当前缓冲区所有数据,则可用其属性SerialPort1.BytesToRead作为参数传递这里面SerialPort1.BytesToRead就是所接收的个数例如:SerialPort1.Read (ReadByte,1,10)就是指把缓冲区的第1到第10个字节读到ReadByte字节数组中(2).以字节方式读出,这种方式有三个参数:第一个参数buffer,是将输入写入到其中的字符数组第二个参数offset,缓冲区数组中开始读出的偏移量,对于从头读的数据,应将其设为1第三个参数count,要读取的字节数,如果读当前缓冲区所有数据,则可用其属性SerialPort1.BytesToRead作为参数传递这里面SerialPort1.BytesToRead就是所接收的个数例如:SerialPort1.Read (ReadChar,1,10)就是指把缓冲区的第1到第10个字节读到ReadChar字符数组中5.相关属性(1).SerialPort1.DtrEnable 该值在串行通信过程中启用数据终端就绪 (DTR) 信号在通讯时,请把该值置为1,否则读入的数据会丢失(原因尚未搞明白,可能跟硬件有关系吧)(2).SerialPort1.RtsEnable 该值指示在串行通信中是否启用请求发送 (RTS) 信号当然,还有其它属性,这里只对常用几个参数作了对比,其它参数请自行参考相关说明.1。
用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.net利用SerialPort进行读取串口操作
利⽤SerialPort进⾏读取串⼝操作Imports SystemImports System.IO.PortsPublic Class Form1Private 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 StringFor Each port In portsportnamebox.Items.Add(port) '向combobox中添加项Next port'初始化界⾯baudratebox.SelectedIndex() = 2portnamebox.SelectedIndex() = 0Serial_Port1() '初始化串⼝Label3.Text = SerialPort1.IsOpenstatuslabel.Text = "串⼝未连接"statuslabel.ForeColor = Color.Redsendbox.Text = "123"' baudratebox.Text = baudratebox.Items(0) 注释和不注释的地⽅可以替换'portnamebox.Text = portnamebox.Items(0)End SubPrivate Sub Serial_Port1() '设置串⼝参数SerialPort1.BaudRate = Val(baudratebox.Text) '波特率SerialPort1.PortName = portnamebox.Text '串⼝名称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 TrySerialPort1.Close() '关闭串⼝Label3.Text = SerialPort1.IsOpenIf SerialPort1.IsOpen = False Thenstatuslabel.Text = "串⼝未连接"statuslabel.ForeColor = Color.Redreceivebox.Text = ""receivebytes.Text = ""End IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'打开串⼝连接Private Sub openbtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles openbtn.Click TrySerialPort1.Open() '打开串⼝Label3.Text = SerialPort1.IsOpenIf SerialPort1.IsOpen = True Thenstatuslabel.Text = "串⼝已连接"statuslabel.ForeColor = Color.GreenEnd IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'发送数据Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TrySerialPort1.Write(sendbox.Text)Catch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd Sub'触发接收事件Public Sub Sp_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceivedMe.Invoke(New EventHandler(AddressOf Sp_Receiving)) '调⽤接收数据函数End Sub'接收数据Private Sub Sp_Receiving(ByVal sender As Object, ByVal e As EventArgs)Dim strIncoming As StringTryreceivebytes.Text = Str(Val(receivebytes.Text) + SerialPort1.BytesToRead)If SerialPort1.BytesToRead > 0 ThenThreading.Thread.Sleep(100) '添加的延时strIncoming = SerialPort1.ReadExisting.ToString '读取缓冲区中的数据SerialPort1.DiscardInBuffer()receivebox.Text = strIncomingEnd IfCatch ex As ExceptionMessageBox.Show(ex.Message)End TryEnd SubEnd Class。
利用VB如何进行串口读写
利用VB如何进行串口读写今天说下利用VB如何进行串口读写。
首先需要的是在VB中增加一个microsoft comm control 6.0的控件。
步骤就是:工程->部件->点击microsoft comm control 6.0->确定。
先介绍一下必须熟悉几个属性:CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。
也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
然后利用给大家一个读串口的小例程:Private Sub Form_Load()mPort = 1 '选择com1Mcom.Settings = "115200,N,8,1" '设置波特率为115.2kpbs,没有奇偶校验,8位数据位,1位结束位Mcom.InputLen = 0 '读取全部的输入缓冲区If Mcom.PortOpen = False Then Mcom.PortOpen = True '端口打开Mcom.RThreshold = 2Mcom.SThreshold = 2End SubPrivate Sub Mcom_OnComm() '所有的通讯事件都可以激发MSComm1控件的OnComm事件Select Case mEventCase comEvReceive'此处的代码可以进行当串口的接受缓冲区里有RThreshold个字符的处理Text4 = Text4 & Mcom.InputCase comEvSend'此处的代码可以进行当串口的发送缓冲区里有SThreshold个字符的处理End SelectEnd SubPrivate Sub Form_Unload(Cancel As Integer)If Mcom.PortOpen = True Then Mcom.PortOpen = FalseEnd Sub利用上面的小程序,我们就可以通过读到外设给串口发出的数据了。
用VB进行串口实时数据采集
用VB进行串口实时数据采集VB-界面速成通道/ChenLL 发表于2007-08-10, 20:28用VB进行串口实时数据采集本文介绍VB6.0利用MSComm通信控件,开发微机通过串口对工业仪表进行实时数据采集的编程技术。
给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动后用于其他数据采集或实时控制程序中。
----一台工业专用实时检测仪表,接高精度位移传感器,用于测量微小形变或微量位移,仪表测量精度为0.01毫米,测量范围最大值为50毫米。
该仪表带有一个9针的RS-232C 串口,能与微机进行串口数据通信,实时传送检测数据,通过微机软件处理可实现工业实时监控。
----该仪表的串口数据通信协议是:数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。
仪表每秒发送50帧检测数据,每帧数据由4个字节组成。
第一个字节定义为二进制常数0F0H,是每帧数据开始的标志字节;后面连续2个字节为数据字节,采用压缩的BCD码编码方式,高位在前,低位在后,即一个字节表示两位十进制数,则两个字节表示四位十进制数,小数点采用固定形式,定义在两字节中间;第四个字节为符号字节,该字节第八位为1,即:1 x x x x x x x 则为负数;第八位为0,即:0 x x x x x x x 则为正数。
----例如:0F0H 26H 87H 80H 0F0H 34H 62H 00H 表示-26.87 34. 62。
----通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序。
----为了实现实时监测功能,接收数据的读取要尽可能的快速,则设置MSComm1的属性如下:RThreshold = 1接收缓冲区收到一个字节产生OnComm事件InputLen = 1 每次读取一个字节----仪表每秒发送50帧数据,微机收到一帧完整数据至少需要20 ms时间,然后再进行数据处理。
VB与串口通信
1 1 0
发 送 端
0
接 收 端
1 1 0 1
5-1
通信
数据 数据 数据 数据 2 串 通信 串 通信 通信 制 0 1 数据 用
数据 1 集 通信 通 数据信 5-2
5.1 串行接口简介
串行接口一般包括 RS232/422/485,其技术简单成熟,性能可靠,价格低廉;所要求的 软/硬件开发环境都很低,广泛应用于计算机及相关领域,如调制解调器(Modem) 、串行打 印机、各种监控模块、PLC、摄像头云台、数控机床、单片机及相关智能设备,甚至路由器 也不例外(通过串口设置参数) 。 在计算机测控系统中,主控机一般采用 PC 或 IPC,通过串口与测控模块相连,测控模 块再连接相应的传感器和执行器,如此形成一个简单的双层结构的计算机测控系统。这种结 构主要用于单独的中小型企业或部门,如果属于综合型企业或部门,如电力系统监控,高速 公路监控和收费系统,则可以此为基础结构进行扩充,用集线器将众多双层监控系统连接起 来,再用交换机将若干集线器连接起来,统一接上路由器,从而与 Internet 互联,如此即可 形成一个庞大的计算机测控网络。由此可见,尽管现代计算机的新接口层出不穷,各种网络 应用也日新月异,其规模也越来越大,但是,其基础结构却有不少是串行通信系统,串行通 信也成了其中的核心技术。
送,按照数据流的方向可分成 3 种传送模式:单工、半双工和全双工。 (1)单工形式。 单工形式的数据传送是单向的。通信双方中,一方固定为发送端,另一方则固定为接收 端。信息只能沿一个方向传送,使用一根传输线。如图 5-3 所示。
接 发 送 器 器 收
ቤተ መጻሕፍቲ ባይዱ
vb串口通信编程
vb串口通信编程一、概述串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。
提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。
实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串口通讯,甚至其实现方法和C、汇编相比,要更加快捷方便。
下面,笔者就介绍一下在VB中实现串口通讯的方法。
在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。
我们只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。
下面,笔者就简要地介绍一下MSComm控件的使用方法。
二、MSComm控件的主要属性、事件1、MSComm的属性由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。
Commport:设置通讯所占用的串口号。
如设成1(默认值),表示对Com1进行操作。
Setting:对串口通讯的相关参数。
包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。
其默认值是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。
Portopen:设置串口状态,值为True时打开串口,值为False时关闭串口。
Input:从输入寄存器读取数据,返回值为从串口读取的数据内容,同时输入寄存器将被清空。
Ouput:发送数据到输出寄存器。
InBufferCount:设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。
InputMode:设置从输入寄存器中读取数据的形式。
若值为0,则表示以文本形式读取;值为1,则表示以二进制形式读取。
OutBufferCount:设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空。
VB串口数据接收方式
1、在OnComm 事件中接收数据:这种方式能充分MSCOMM控件的特性。
OnComm 事件还可以检查和处理通讯错误;可以通过检查CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。
Private Sub MSComm_OnComm ()Select Case mEvent' 错误Case comEventBreak ' 收到Break。
Case comEventCDTO ' CD (RLSD) 超时。
Case comEventCTSTO ' CTS Timeout。
Case comEventDSRTO ' DSR Timeout。
Case comEventFrame ' Framing ErrorCase comEventOverrun '数据丢失。
Case comEventRxOver'接收缓冲区溢出。
Case comEventRxParity' Parity 错误。
Case comEventTxFull '传输缓冲区已满。
Case comEventDCB '获取DCB] 时意外错误' 事件Case comEvCD ' CD 线状态变化。
Case comEvCTS ' CTS 线状态变化。
Case comEvDSR ' DSR 线状态变化。
Case comEvRing ' Ring Indicator 变化。
Case comEvReceive ' 收到RThreshold # of chars.Case comEvSend ' 传输缓冲区有Sthreshold 个字符'Case comEvEof ' 输入数据流中发现EOF 字符End SelectEnd Sub2.轮循法采集数据:A、定时器轮循法对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB三种读取串口数据的方式
3三种读取串口数据的方式
vb提供的这个通信控件“隐藏”了大部分串口通信的底层运行过程,程序员只需编写
少量的代码就可以完成软件的开发过程。
在通信数据量不大,通信要求不是很高的情况下
建议采取此方式。
(1)settings属性:以字符串的形式设置并回到波特率、奇偶校验位、数据位、暂停位。
这个属性很关键,针对相同的终端设备须要根据设备的具体情况展开调整(比如说日本的设
备不同于美国的设备,通常可以使用奇校验)。
(2)inputmode属性:设置接收数据的类型,0为文本格式,1为二进制格式。
(3)input
属性:读取并删除接收缓冲区中的数据流。
(4)output属性:向发送缓冲区传送一数据流。
(6)handshaking属性:设置和回到击掌协议,即为计算机内部cpu与串口之间的通讯协议,确保在缓冲区负载时数据不能遗失。
这个属性在确保数据传输的正确性方面存有非常
大的促进作用,共计四个选项,分别则表示:①并无流控制;②软件流控制;③硬件流控制;④
软硬件流控制。
使用硬件流控时,建议串口之间和电缆积极支持硬件击掌,在自己制作串口
通信线时,有关硬件击掌的线rts、cts、dsr、dtr必须相连接恰当。
在正确设置这些属性的基础上,剩下的就是打开串口,通过串口发送及接受数据了。
本
文后续章节利用一个实例详细讲解了这些属性的设置及具体代码。
3.2轻易调用win32api通信函数
直接调用windowsapi函数,可以清楚地理解串口通信的机制,根据需要灵活地配置串
口的各种参数和属性,而且直接调用低层api函数,通信效率比较高,但付出的代价就是程
序较复杂,编程周期长,适合于大型通信程序及通讯质量要求较高的场合。
在32位的windows系统中,串口通信就是做为文件处置的,串口操作方式通常为关上、停用、加载、载入等操作方式,适当的windowsapi函数如下:[4]
(1)createfile()函数:实现串口的初始化并打开串口,返回串口句柄资源以供后续进
程调用。
(2)closefile()函数:停用串口,串口不为共享资源,应用程序以独霸方式采用,通信完
结应立即停用。
(3)readfile()函数:从串口输入缓冲区读取数据流。
dll(dynamiclinklibrary)动态链接库就是一种可以被vb语言调用的程序模块。
dll
中
包含的可执行代码不能单独执行,而应由windows应用程序调用执行。
一般数据采集
卡的供应商都会提供该采集卡的dll库函数,使用这些dll库函数,可以做到程序代码共享,减少程序的编写工作量。
用户不需要知道这些代码的实现细节,只需要了解调用函数的参
数和函数处理后的返回值。
sio_open:关上端口;sio_close:停用端口。
sio_ioctl:设置端口参数,例如波特率等。
sio_read:从端口接收数据;sio_write向端口发送数据。
sio_iqueue:得到接收缓冲区中的数据长度。
sio_oqueue:获得发送缓冲区中的数据长度。
4串口通讯的错误及处理
5串口通讯实例
具体实现步骤如下:
(3)程序已经开始后在一定情况设置timer1.enabled属性值为true转化成
timer1_time事件,可以在紧固的时间间隔下继续执行timer1_timer过程中的代码程序,顺利完成数据采集。
在timer1_timer过程中嵌入如下代码:
上述语句是将读取指令发送到串口输出缓冲区(注意每个命令字符串后都要加上回车
和换行符chr(13)+chr(10)),再由系统将其自动发送给通过rs232通信线与计算机端口连
接的wt230数字功率计,功率计在接收到命令字符串后,经过自身的单片机处理,就自动地
把它测到的电压、电流、功率数据以固定的格式和字符形式通过rs232通信线传回至计算机,计算机程序从输入缓冲区读取这些字符数据并利用vb字符处理函数(如val,instr)进
行处理就得到了所要的数据,下面是具体的程序代码。
dimbytinput()asbyte‘特别注意必须将bytinput定义为不定短数组
dimstrtemasstringdimiasinteger
fori=0toubound(bytinput)
strtem=strtem+chr(bytinput(i))‘字节数组中的ascii码值转换成相应next的字
符得到的strtem字符就形象的展示了电流、电压和功率值。
对于wt230而言,它的数据结
构是这样的,每个数据之间由逗号字符“,”隔开,每个数据以用科学计数法表示,且每个数
据以字符“e”分为前半部分和后半部分,前半部分为具体的数据(整数形式),后半部分为
此数据的指数,指数的底为10。
比如获得strtem的值“23423e-2,00241e-3,05645e-2”这就则表示电压值234.23v,
电流值为0.241a,功率为56.45w。
6结论
串口通讯的硬件投资少,软件编程简单,在低速少量数据传输方面的应用极其广泛的应用。
本文详细介绍了串口通讯的基本内容及其具体实现方式,读者可以根据具体情况进行选择。
以上代码是实现串口通信的核心部分,经过笔者在多个数据采集系统开发中的应用,具有较强的实用价值。