VB中串口通讯的实现

合集下载

在VB中利用API进行串口通信

在VB中利用API进行串口通信

在VB中利用API进行串口通信一般来说,在VB中编写串口通讯程序,首先考虑到是使用MSComm控件,可是该控件不能设置超时,而且对许多内部的参数进行了隐藏,从而不能满足有些具体的工作。

而使用API进行串口通信,大多是使用VC,很少见到完整的VB代码,为此,我编写了这个模块。

同时,由于串口通信是基于字节流的,为方便程序设计,还编写了三个简单的辅助函数,并写了一个详细的测试代码。

Option ExplicitOption Base 0Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As LongPrivate Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As LongPrivate Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Const GENERIC_READ = &H80000000Private Const GENERIC_WRITE = &H40000000Private Const OPEN_EXISTING = 3Private Const INVALID_HANDLE_VALUE = -1Private Declare Function GetCommState Lib "kernel32" (ByVal nCid As Long, lpDCB As DCB) As LongPrivate Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB As DCB) As LongPrivate Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As LongPrivate Declare Function SetupComm Lib "kernel32" (ByVal hFile As Long, ByVal dwInQueue As Long, ByVal dwOutQueue As Long) As LongPrivate Declare Function PurgeComm Lib "kernel32" (ByVal hFile As Long, ByVal dwFlags As Long) As LongPrivate Const PURGE_TXABORT = &H1 ' Kill the pending/current writes to the comm port.Private Const PURGE_RXABORT = &H2 ' Kill the pending/current reads to the comm port.Private Const PURGE_TXCLEAR = &H4 ' Kill the transmit queue if there. Private Const PURGE_RXCLEAR = &H8 ' Kill the typeahead buffer if there. Private Type DCBDCBlength As LongBaudRate As LongfBitFields As Long 'See Comments in Win32API.TxtwReserved As IntegerXonLim As IntegerXoffLim As IntegerByteSize As ByteParity As ByteStopBits As ByteXonChar As ByteXoffChar As ByteErrorChar As ByteEOFChar As ByteEvtChar As BytewReserved1 As Integer 'Reserved; Do Not UseEnd TypePrivate Type COMMTIMEOUTSReadIntervalTimeout As LongReadTotalTimeoutMultiplier As LongReadTotalTimeoutConstant As LongWriteTotalTimeoutMultiplier As LongWriteTotalTimeoutConstant As LongEnd TypePrivate Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef saArray() As Any) As Long'串口操作演示Sub Main()Dim hComm As LongDim szTest As String'打开串口1hComm = OpenComm(1)If hComm <> 0 Then'设置串口通讯参数SetCommParam hComm'设置串口超时SetCommTimeOut hComm, 2, 3'向串口写入字符串123szTest = "123"WriteComm hComm, StringToBytes(szTest)'读串口szTest = BytesToString(ReadComm(hComm))Debug.Print szTest'关闭串口CloseComm hCommEnd IfEnd Sub'打开串口Function OpenComm(ByVal lComPort As Long) As LongDim hComm As LonghComm = CreateFile("COM" & lComPort, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)If hComm = INVALID_HANDLE_VALUE ThenOpenComm = 0ElseOpenComm = hCommEnd IfEnd Function'关闭串口Sub CloseComm(hComm As Long)CloseHandle hCommhComm = 0End Sub'读串口Function ReadComm(ByVal hComm As Long) As Byte()Dim dwBytesRead As LongDim BytesBuffer() As ByteReDim BytesBuffer(4095)ReadFile hComm, BytesBuffer(0), UBound(BytesBuffer) + 1, dwBytesRead, 0 If dwBytesRead > 0 ThenReDim Preserve BytesBuffer(dwBytesRead)ReadComm = BytesBufferEnd IfEnd Function'写串口Function WriteComm(ByVal hComm As Long, BytesBuffer() As Byte) As LongDim dwBytesWriteIf SafeArrayGetDim(BytesBuffer) = 0 Then Exit FunctionWriteFile hComm, BytesBuffer(0), UBound(BytesBuffer) + 1, dwBytesWrite, 0 WriteComm = dwBytesWriteEnd Function'设置串口通讯参数Function SetCommParam(ByVal hComm As Long, Optional ByVal lBaudRate As Long = 9600, _Optional ByVal cByteSize As Byte = 8, Optional ByVal cStopBits As Byte = 0, _Optional ByVal cParity As Byte = 0, Optional ByVal cEOFChar As Long = 26) As BooleanDim dc As DCBIf hComm = 0 Then Exit FunctionIf GetCommState(hComm, dc) Thendc.BaudRate = lBaudRatedc.ByteSize = cByteSizedc.StopBits = cStopBitsdc.Parity = cParitydc.EOFChar = cEOFCharSetCommParam = CBool(SetCommState(hComm, dc))End IfEnd Function'设置串口超时Function SetCommTimeOut(ByVal hComm As Long, Optional ByVal dwReadTimeOut As Long = 2, _Optional ByVal dwWriteTimeOut As Long = 3) As BooleanDim ct As COMMTIMEOUTSIf hComm = 0 Then Exit Functionct.ReadIntervalTimeout = dwReadTimeOut '读操作时,字符间超时ct.ReadTotalTimeoutMultiplier = dwReadTimeOut '读操作时,每字节超时ct.ReadTotalTimeoutConstant = dwReadTimeOut '读操作时,固定超时(总超时=每字节超时*字节数+固定超时)ct.WriteTotalTimeoutMultiplier = dwWriteTimeOut '写操作时,每字节超时ct.WriteTotalTimeoutConstant = dwWriteTimeOut '写操作时,固定超时(总超时=每字节超时*字节数+固定超时)SetCommTimeOut = CBool(SetCommTimeouts(hComm, ct))End Function'设置串口读写缓冲区大小Function SetCommBuffer(ByVal hComm As Long, Optional ByVal dwBytesRead As Long = 1024, _Optional ByVal dwBytesWrite As Long = 512) As BooleanIf hComm = 0 Then Exit FunctionSetCommBuffer = CBool(SetupComm(hComm, dwBytesRead, dwBytesWrite))End Function'清空串口缓冲区Sub ClearComm(ByVal hComm As Long, Optional ByVal InBuffer As Boolean = True, Optional ByVal OutBuffer As Boolean = True)If hComm = 0 Then Exit SubIf InBuffer And OutBuffer Then '清空输入输出缓冲区PurgeComm hComm, PURGE_TXABORT Or PURGE_RXABORT Or PURGE_TXCLEAR Or PURGE_RXCLEARElseIf InBuffer Then '清空输入缓冲区PurgeComm hComm, PURGE_RXABORT Or PURGE_RXCLEARElseIf OutBuffer Then '清空输出缓冲区PurgeComm hComm, PURGE_TXABORT Or PURGE_TXCLEAREnd IfEnd Sub'辅助函数:BSTR字符串转换为CHAR字符串Function StringToBytes(ByVal szText As String) As Byte()If Len(szText) > 0 ThenStringToBytes = StrConv(szText, vbFromUnicode)End IfEnd Function'辅助函数:CHAR字符串转换为BSTR字符串Function BytesToString(bytesText() As Byte) As StringIf SafeArrayGetDim(bytesText) <> 0 ThenBytesToString = StrConv(bytesText, vbUnicode)End IfEnd Function'辅助函数:获得CHAR字符串长度Function Byteslen(bytesText() As Byte) As LongIf SafeArrayGetDim(bytesText) <> 0 Then Byteslen = UBound(bytesText) + 1 End IfEnd Function。

VB串口通信(附图教程)

VB串口通信(附图教程)

界面如下:代码如下:Private Sub Form_Load()If MSComm1.PortOpen = True Then MSComm1.PortOpen = False ElseEnd IfCombo1.AddItem "COM1"Combo1.AddItem "COM2"Combo1.AddItem "COM3"Combo1.AddItem "COM4"Combo1.AddItem "COM5"Combo1.AddItem "COM6"Combo1.AddItem "COM7"Combo1.AddItem "COM8"Combo1.AddItem "COM9"Combo1.AddItem "COM10" Combo1.AddItem "COM11" Combo1.AddItem "COM12"Combo1.AddItem "COM13"Combo1.AddItem "COM14"Combo1.AddItem "COM15"Combo1.AddItem "COM16"Combo1.ListIndex = 2Combo2.AddItem "256000"Combo2.AddItem "128000"Combo2.AddItem "115200"Combo2.AddItem "57600"Combo2.AddItem "38400"Combo2.AddItem "28800"Combo2.AddItem "19200"Combo2.AddItem "14400"Combo2.AddItem "12800"Combo2.AddItem "11520"Combo2.AddItem "9600"Combo2.AddItem "4800"Combo2.AddItem "2400"Combo2.AddItem "1200"Combo2.AddItem "600"Combo3.AddItem "无None"Combo3.AddItem "奇Odd"Combo3.AddItem "偶Even"Combo4.AddItem "4"Combo4.AddItem "5"Combo4.AddItem "6"Combo4.AddItem "7"Combo4.AddItem "8"Combo5.AddItem "1"Combo5.AddItem "2"mPort = Combo1.ListIndex + 1 MSComm1.Settings = "9600,n,8,1"ComOpen.Caption = "打开串口"Shape1.FillColor = &HFFFFC0End SubPrivate Sub ComOpen_Click()On Error GoTo uerror '发现错误跳转到错误处理If ComOpen.Caption = "关闭串口" ThenMSComm1.PortOpen = FalseComOpen.Caption = "打开串口" '按钮文字改变Shape1.FillColor = &HFFFFC0 '灯颜色改变ElseMSComm1.PortOpen = TrueComOpen.Caption = "关闭串口"Shape1.FillColor = &HFFEnd IfExit Subuerror:msg$ = "无效端口号" '错误显示Title$ = "串口调试助手"X = MsgBox(msg$, 48, Title$) '48标示显示警告图标End SubPrivate Sub MSComm1_OnComm()Dim BytReceived() As ByteDim strBuff As StringDim i As IntegerSelect Case mEvent '事件发生Case 2ClsMSComm1.InputLen = 0 '读入缓冲区全部内容strBuff = MSComm1.Input '读入到缓冲区Label10.Caption = Label10.Caption + Len(strBuff) '接收计数If MSComm1.InputMode = comInputModeBinary ThenBytReceived() = strBuff '如果是二进制接收模式则进行数据处理,否则直接显示字符串For i = 0 To UBound(BytReceived)If Len(Hex(BytReceived(i))) = 1 ThenstrData = strData & "0" & Hex(BytReceived(i)) & " " '如果只有一个字符,则前补0,如F显示0F,最后补空格Else '方便显示观察如:00 0F FEstrData = strData & Hex(BytReceived(i)) & " "End IfNextTextReceive = TextReceive & strDatastrData = ""ElseTextReceive = TextReceive & strBuffEnd IfEnd SelectEnd SubPrivate Sub ComSend1_Click() '手动发送Dim Temp(0) As ByteDim strBuff As StringIf Option1.Value = True Then '如果显示16进制发送则进行16进制处理,这里只发送一个Temp(0) = "&H" & TextSendMSComm1.Output = Temp '发送一个16进制ElsestrBuff = TextSendEnd IfIf MSComm1.PortOpen = False ThenMsgBox "请打开串口"End IfOn Error GoTo uerrorMSComm1.Output = strBuffLabel11.Caption = Label11.Caption + Len(strBuff) '发送计数uerror:End SubPrivate Sub ComSend2_Click()If ComSend2.Caption = "自动发送" ThenComSend2.Caption = "关闭自动发送"Timer1.Interval = TextTime.TextTimer1.Enabled = TrueElseComSend2.Caption = "自动发送"Timer1.Enabled = FalseEnd IfEnd SubPrivate Sub ComClean1_Click()TextSend.Text = "" '清空发送窗口End SubPrivate Sub Option3_Click()MSComm1.InputMode = comInputModeBinary '选择接收方式End SubPrivate Sub Option4_Click()MSComm1.InputMode = comInputModeText '选择接收方式End SubPrivate Sub Timer1_Timer()Call ComSend1_Click '定时调用手动发送End SubPrivate Sub Timer2_Timer()If Combo3 = "无None" ThenMSComm1.Settings = Str(Combo2) + "N" + Str(Combo4) + Str(Combo5) ElseIf Combo3 = "奇Odd" ThenMSComm1.Settings = Str(Combo2) + "O" + Str(Combo4) + Str(Combo5) ElseIf Combo3 = "偶Even" ThenMSComm1.Settings = Str(Combo2) + "E" + Str(Combo4) + Str(Combo5) End IfEnd SubPrivate Sub Combo1_Click()If MSComm1.PortOpen = True Then '如果串口打开先关闭后再进行其他操作MSComm1.PortOpen = FalseEnd IfmPort = Combo1.ListIndex + 1 '读取com口号End SubPrivate Sub ComClean3_Click()Label10.Caption = 0Label11.Caption = 0End SubPrivate Sub ComClean2_Click()TextReceive.Text = "" '接收窗口End Sub功能上:实现了字符串的发送和接收,8位数据的十六进制发送和接收,有端口,波特率等设置。

VB实现串口通讯

VB实现串口通讯

VB实现串口通讯目前,Visual Basic (简称VB)已成为WINDOWS 系统开发的主要语言,以其高效、简单易学及功能强大的特点越来越为广大程序设计人员及用户所青睐。

VB 支持面向对象的程序设计,具有结构化的事件驱动编程模式并可以使用无限扩增的控件。

在VB 应用程序中可以方便地调用WINDOWS API函数,使得编程效率提高,应用功能增强。

利用VB 提供的这些功能,我们可以有三种方法完成串口通信。

一种是用VB 提供的具有强大功能的通信控件;另一种方法是调用WINDOWS API 函数,使用WINDOWS 提供的通信函数编写移植性强的应用程序;第三是利用文件的输入/ 输出完成,该方法简便易行,但有一定的局限性。

一、利用通信控件(MSCOMM)完成串口通信VB 提供了通信控件MSCOMM,文件名为MSCOMM. VBX。

该控件可设置串行通信的数据发送和接收,对串口状态及串行通信的信息格式和协议进行设置。

在通信过程中可以触发OnComm事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent 属性来了解通信的情况,进行收发数据的处理。

每个通信控件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。

1、通信控件的事件及基本属性(1)事件OnComm:通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及错误进行处理。

通过对CommEvent 属性的判断可知当前的通信错误和事件,分别对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。

如:CommEvent = MSCOMM—EV—SEND 表示发送事件。

这些信息可从VB 提供的常量文件CONSTANT. TXT中查出。

(2)属性CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。

Setting :设置通信的信息格式,为字符型。

顺序为:波特率、校验、数据位、停止位。

PortOpen :布尔型、开关通信口。

基于VB6.0的多方式串口通信实现

基于VB6.0的多方式串口通信实现

串口通信 由于具有通信线路简单 、 使用灵活方 便、 数据传输可靠等优点, 在工业监控 、 数据采集和 实时控制等场合得 到了广泛 的应用 。采用 V 6 O B. 提供的 M Cln S o I控件 , ' n 能很方便地实现所需的串口 通信功能。
口 芯片进行 编程 , 可以使 串 口具 有不 同的工作 方 式、 不同的波特率 和不同的数据位数等[l 1 。
( o g da em IE P A SI, aj 20 0 ) Ps r utT a 1 C , L U T) N m ta e n 10 7 ( eam n o R d o nnctn IE,L U  ̄’N nn 200 ) D pr et f ai C r ui i , P A S , aj g 107 t o m ao C i
条 9 R 22电缆 的两 个接头在正常情况 针 S3
下, 都是一一对应 的 , 但如果是使用单 串 口或 双串
口直接连接测试时 , 就必须将电缆 的某些针对 接, 才能满足串口通信的要求 。单 串口测试 时 , 需将 2
针 和 3 收发针 ) 针( 对接 ; 对于双 串 口直接连 接测 试, 则需将两个端 口的 2 针和 3 ( 针 收发针) 相互
中 圈分 类 号 :o P o r m u lro e S r l n n n c l n P o r m e VB 0 t r g a M l n d e i  ̄ a Co n u ia i r g a o
H uZ ilI Ga u ya o h l ) ja oY a u ̄) S a n i N n) e r
A l
;e a cm ui tnpvr a r d印Pi tni m n e sbcueo ss p o m n ao iut ,fx l Srl o m nc i rga hs o i ao m ba la o ayfl eas ft i l cm ui tnc ciy l i e ci n id i m e ci r r eb

VB串口通信源程序[1]

VB串口通信源程序[1]

Private Sub Form_Load()'设置打开端口If OpenPort(3) = False ThenMsgBox "串口打开失败!"End IfEnd SubPrivate Sub Command1_Click()Dim sBuf(2) As BytesBuf(0) = &H55sBuf(1) = &H31sBuf(2) = &HFFIf SendByte(sBuf) = False ThenEnd IfEnd Sub'收到数据产生MSComm事件Private Sub MSComm1_OnComm()Dim i As IntegerDim rBuf() As ByterBuf = MSComm1.InputFor i = 0 To UBound(rBuf)Debug.Print rBuf(i)Next iEnd Sub'串口初始化Private Function OpenPort(PortNum As Integer) As BooleanOn Error GoTo ErrExit '出错转移到ErrExit处理With Me.MSComm1.CommPort = PortNum '端口号.Settings = "9600,n,8,1" '波特率=9600bps;n(无奇偶校验)e(偶校验)o(奇校验);8位数据位;1位停止位.InputMode = 1 '采用二进制数据传输.NullDiscard = False 'NULL字符从端口传送到接受缓冲区.DTREnable = False 'DTR线无效.EOFEnable = False '不寻找EOF符.RTSEnable = False 'RTS线无效.InBufferCount = 0 '清空接受缓冲区.OutBufferCount = 0 '清空传输缓冲区.SThreshold = 0 '不产生MSComm事件.RThreshold = 1 '产生MSComm事件.InputLen = 0 '当输入占用时,告诉控件读入整个缓冲区。

VB串口编程基础及实现

VB串口编程基础及实现

i e o t es ra r g a d af m e i l o mmi gt e r es e i c p o a mi g r h p r n o y t t p cf r g m h o h i r n . Ke wo d : e i l o t Co y r s S r r ; mm u i ai n; i k; r g a aP nc t o L n P o mmi g r n
to W ih t e e ba i he re o f fl t e i lp o a i n. t h s sc t o i st ul l he s ra r g mmi g s il nd m a e t s a tto r ve a betr i r n k ls a k ho e pr c i ne sha te i
念, 每种单片机通信协议都会标 注波特率 、 数据位 、 停止位 、奇偶校验位和编码方式。这些参数定义如 下:
Ab t c : mp t rs ra o t r g a s r t Co u e e i l r o r mmi g h sb e d l s d i e c m mu i a i n s f r , u h a a p p n a e n wi e y u e n t o h n c t o wa e s c s o t t lp o e f x v d oa d c n r l ec An n d sr s e ae e o e c mmu i ai n o u o t n a ea — e e h n , a , i e n o to , t . d ma y i u t e lt d t r m t o n i r o n c t r t ma i r l o a o

串口通讯及其在VB平台下的实现

串口通讯及其在VB平台下的实现

串口通讯及其在VB平台下的实现摘要:本文首先介绍串行通讯的基础知识,然后结合示例剖析在VB平台下的串口通讯的编程技巧。

随着计算机系统的普及与外围设备技术的发展,计算机与外围设备之间的通讯就显得越来越重要了。

由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。

对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。

在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。

所以串行接口是微机应用系统常用的接口,而相应的应用程序也成为今年来研究的热点。

本文旨在阐述一般的穿口通讯的原理及其程序设计,希望借此能够抛砖引玉,为更深入的研究打下一定的基础。

一、串行通讯的基本原理所谓"串行通信"是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。

这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。

相比之下,由于高速率的要求,处于计算机内部的CPU与串口之间的通讯仍然采用并行的通讯方式,所以串行口的本质就是实现CPU与外围数据设备的数据格式转换(或者称为串并转换器),即当数据从外围设备输入计算机时,数据格式由位(bit)转化为字节数据;反之,当计算机发送下行数据到外围设备时,串口又将字节数据转化为位数据。

二、串口通讯的程序设计原理前面介绍了串行通讯的基本原理,那么如何在程序设计中实现它呢?事实上,这个过程并不复杂,一般有两种实现途径:其一就是使用MSCOMM控件,此控件提供很多方便操作的属性和方法,利用它们可以很方便地实现你的目的;另外一种途径就是使用Windows API,微软为开发者提供了很多相关的串行操作的编程接口,使用这些接口,可以很完成更为强大的功能。

vb串口编程实例

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. 运行程序点击运行按钮,程序将打开一个窗口,其中包含串口选择、打开/关闭串口、接收数据和发送数据的功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VB中串口通讯的实现
一、概述
串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。

实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串甚至其实现方法和C、汇编相比,要更加快捷方便。

下面,笔者就介绍一下在VB中实现串口通讯的方法。

在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。

我们只要此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。

下面,笔者就简要地介绍一下
MSComm控件的使用方法。

二、MSComm控件的主要属性、事件
1、MSComm的属性
由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。

Commport:设置通讯所占用的串口号。

如设成1(默认值),表示对Com1进行操作。

Setting:对串口通讯的相关参数。

包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。

其默认值0,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。

Portopen:设置串口状态,值为True时打开串口,值为False时关闭串口。

Input:从输入寄存器读取数据,返回值为从串口读取的数据内容,同时输入寄存器将被清空。

Ouput:发送数据到输出寄存器。

InBufferCount:设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。

InputMode:设置从输入寄存器中读取数据的形式。

若值为0,则表示以文本形式读取;值为1,则表示以二式读取。

OutBufferCount:设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空。

RThreshold:设置在MSComm控件设置CommEvent属性为comEvReceive并产生OnComm事件之前要接受的字
CommEvent属性:返回最近的通讯事件或错误。

通过对它具体属性值的查询,我们就可以获得通讯事件和通的完整信息。

当其值是comEvReceive时表示接收到数据。

2、MSComm的事件
除了公共事件之外,MSComm只有一个OnComm事件。

当CommEvent属性值变化时将发生OnComm事件,指示发通讯事件或错误。

当我们设置Rtheshold属性值为0时,将使得捕获comEvReceive事件无效。

三、串口通讯编程实例
在完成了对MSComm控件的简要介绍之后,笔者就以实际程序为例,介绍一下串口通讯的具体实现方法。

1、PC机间的串口通讯
(1)、实现方法:
A、新建一个窗体,在上面放两个Text控件、两个CommandButton控件和两个Label控件(如图1.bmp所示
具体见下表:
控件类型名称 Caption属性作用
∙2009-06-12 11:32
∙回复
∙举报 |

∙东软村长
初级粉丝1
∙2009-06-12 11:32 ∙回复
∙举报 |
∙东软村长
∙初级粉丝1 Case comEvReceive '...有接受事件发生
Text2.Text = MSComm1.Input '...接受显示数据
MSComm1.InBufferCount = 0 '...清空输入寄存器
End Select
End Sub
2、PC机与单片机之间的通讯
PC机与单片机之间的通讯被广泛的用于工业、医疗测控等领域之中。

在应用中,我应器”,负责数据采集、响应计算机发出的指令对电路进行控制,有时也进行一些简算机处理。

本程序将实现在PC机上输入一个0-255之间的整数,将此数据发送到单片示管上显示,再将此数除以2,将得数返回给PC机。

(运行效果如图 3.BMP所示)其
A、同PC机间通讯的实现方法A-B。

B、连接电脑和单片机。

注意!由于PC机端的RS232电平与单片机端TTL的并不
C、在VB中输入以下代码:
Private Sub Mscomm1_Oncomm()
'...通讯事件发生
Dim indata As Variant
Dim bte(0) As Byte
Select Case mEvent
Case comEvReceive '...有接受事件发生
indata = MSComm1.Input
'...注意!要通过MSComm控件发送或接收二进制数据必须用Variant类型的变量对二'...制Byte类型的变量进行转换!
bte(0) = AscB(indata)
Text2.Text = bte(0)
MSComm1.InBufferCount = 0 '...清空输入寄存器
End Select
End Sub
Private Sub Command1_Click()
'...发送数据
Dim Num As Integer
Dim outbte(0) As Byte
Num = Val(Text1.Text)
outbte(0) = CByte(Num)
MSComm1.OutBufferCount = 0 '...清空输出寄存器
MSComm1.Output = outbte(0) '...发送数据
End Sub
Private Sub Command2_Click()
'...退出
Unload Me
End Sub
Private Sub Form_Load()
'...初始化
mPort = 1 '...使用Com1口
MSComm1.Settings = "9600,n,8,1" '...设置通讯参数
MSComm1.PortOpen = True '...打开串口
End Sub
D、单片机工作方式置于1,比特率设为9600bit/s。

在单片机上,我们只得使用
口数据的收发工作。

源代码如下:
PUSH PSW ;将程序状态字压入堆栈
PUSH ACC ;将累加器压入堆栈
∙2009-06-12 11:32
∙回复
∙举报 |
∙东软村长
∙初级粉丝1 CLR EA ;关闭系统中断
CLR RI ;清除中断标志位
MOV A,SBUF ;从接收寄存器中读取数据MOV 70H,A ;分解数据百、十、个位并显示MOV B,#100
DIV AB
MOV 52H,A ;分解百位,送入存储器52H MOV A,B
MOV B,#10
DIV AB
MOV 51H,A ;分解十位,送入存储器51H MOV 50H,B ;分解个位,送入存储器50H MOV A,70H
MOV B,#2
DIV AB ;将接受的数据除以2
MOV SBUF,A ;将得数发送到输出寄存器ACALL DL1 ;延时保证数据完整发送ACALL DL1
CLR RI ;清除中断标志位
SETB EA ;打开系统中断
POP ACC ;累加器出栈
POP PSW ;程序状态字出栈
RETI ;中断程序返回
3、编程环境
以上程序在Windows 2000 Professional,Visual Basic 6.0企业版,AT89C52四、总结
从以上程序可以看出,在VB中利用MSComm控件,可以快速开发出串口通讯程序。

相关文档
最新文档