VB中串口通讯的实现
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(12)第五章 串口通信方法与实现2
使用 AT 指令要遵循的规则
◆每个 AT 指令字符串的最后必须加上回车 符 Chr(13),否则调制解调器将不执行传送 过来的指令。
◆除了“A/ ”和“+++”两个指令外,其他 的指令都必须加上“ AT ” 前导符。
◆AT 指令可以一个一个地发送,也可以合 成 一个字符串后再发送。用字符串发送时,总
2.事件驱动方式 事件驱动方式使用串口控件的 OnComm 事件。由于事件驱动方式会产生类似于硬件中 断的效果,所以也称为软中断接收方式。
OnComm 事件 MSComm1 控件只有一个 OnComm 事 件,在这个事件中包含了十七个通信过程中的 事件处理过程并用事件用属性CommEvent 的 十七个值来区分不同的触发事件。
If MSComm1.InBufferCount > 0 Then timel = Timer
While Timer - timel < 0.1 DoEvents
Wend Text2.Text = MSComm1.Input
End If End Sub
运行程序,在发送文本框中输入字符或汉 字,点击“发送”按钮,在“接收”文本框中 就会自动显示接收到的数据。
Case comEvSend
Case comEvEOF
End Select
End Sub
(3) 编写事件驱动方式的通信程序 ◆窗体设计:在查询方式通信窗体中,将 定时器控件及相关的代码去掉。
◆编写代码
Private Sub MSComm1_OnComm() Select Case mEvent Case comEvReceive MSComm1.RThreshold = 0 If MSComm1.InBufferCount > 0 Then timel = Timer While Timer - timel < 0.1 DoEvents Wend Text2.Text = MSComm1.Input End If MSComm1.RThreshold = 1 End Select
在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串口通信(附图教程)
界面如下:代码如下: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位数据的十六进制发送和接收,有端口,波特率等设置。
7 串口通讯实例程序(VB)
第七篇串口通讯实例程序(VB版)上一篇文档中简单了解了一下SerialPort控件。
本篇文档将利用这个控件,编写一个简单的串口收发程序。
打开VS2005。
文件| 新建| 项目。
新建一个项目,名称:SerialPortTest。
打开Form1.vb窗口。
在窗口中添加几个控件。
包括4个按钮,两个编辑框,1个状态栏,两个静态文本,简单的调整一下窗体。
如下图:将两个编辑框的Multiline属性设置为True。
然后给窗体添加一个SerialPort控件。
调整一下其属性如下:BaudRate : 9600 DataBits : 8 Parity : None PortName : COM1StopBits : One ReceivedBytesThreshold : 1添加“打开串口”按钮的单击响应函数,如下:——————————————————————————————————Private Sub BTN_COM_OPEN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_COM_OPEN.ClickIf Me.SerialPort1.IsOpen = True ThenMe.StatusBar1.Text = "串口已经连接! COM1,9600,8,1"MsgBox("当前设备已连接", MsgBoxStyle.OkOnly, "提示") ElseMe.SerialPort1.Open()If Me.SerialPort1.IsOpen = True ThenMe.StatusBar1.Text = "打开串口成功!COM1,9600,8,1"ElseMe.StatusBar1.Text = "打开串口失败!"End IfEnd IfEnd Sub ——————————————————————————————————上面这段代码,打开串口,并在状态栏上显示一些提示信息。
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 :布尔型、开关通信口。
VB串口通信程序实例
VB 串口通信程序设计典型实例利用 VB 开发串口通信程序既可以使用 MSComm 控件也可以调用 Windows API 函数实 现。
不过,只要 MSComm 控件可以被选用,我们推荐选择此控件实现,因为 MSComm 控 件的功能和 API 调用一样强,甚至比它还好且使用起来更加简单。
在本章提供的串口通信程序设计中,除了 PC 与 PC 串口通信外,PC 与单片机、PC 与 智能仪表、PC 与 PLC、PC 与 GSM 短信模块等串口通信任务的实现均采用 MSComm 控件。
6.1 PC 与 PC 串口通信程序设计当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需 3 根线 (发送线、接收线、信号地线)便可实现全双工异步串行通信。
本设计通过两台 PC 串口 3 线连接,介绍了利用 API 函数和 MSComm 控件设计串口通 信程序的方法,包括字符与文件的发送与接收。
6.1.1 PC 与 PC 串口通信程序设计目的(1)掌握 PC 与 PC 串口通信的线路连接方法。
(2)利用 MSComm 控件和 API 函数实现 PC 与 PC 串口通信的程序设计方法。
6.1.2 PC 与 PC 串口通信程序设计用软、硬件本设计用到的硬件和软件清单如表 6-1 所示。
表 6-1 序 1 2 3 号 PC 或 IPC 串口通信线(三线制) Visual Basic 6.0 设计用软、硬件 名 称 数 2 1 1 量6.1.3 PC 与 PC 串口通信程序硬件线路图线路说明,在计算机通电前,按图 6-1 所示将两台 PC 通过串口线连接起来:计算机 A 串口 COM1 端口的 TXD 与计算机 B 串口 COM1 端口的 RXD 相连, 计算机 A 串口 COM1 端 口的 RXD 与计算机 B 串口 COM1 端口的 TXD 相连, 计算机 A 串口 COM1 端口的 GND 与 计算机 B 串口 COM1 端口的 GND 相连。
串口通讯及其在VB平台下的实现
串口通讯及其在VB平台下的实现摘要:本文首先介绍串行通讯的基础知识,然后结合示例剖析在VB平台下的串口通讯的编程技巧。
随着计算机系统的普及与外围设备技术的发展,计算机与外围设备之间的通讯就显得越来越重要了。
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。
对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。
在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。
所以串行接口是微机应用系统常用的接口,而相应的应用程序也成为今年来研究的热点。
本文旨在阐述一般的穿口通讯的原理及其程序设计,希望借此能够抛砖引玉,为更深入的研究打下一定的基础。
一、串行通讯的基本原理所谓"串行通信"是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。
相比之下,由于高速率的要求,处于计算机内部的CPU与串口之间的通讯仍然采用并行的通讯方式,所以串行口的本质就是实现CPU与外围数据设备的数据格式转换(或者称为串并转换器),即当数据从外围设备输入计算机时,数据格式由位(bit)转化为字节数据;反之,当计算机发送下行数据到外围设备时,串口又将字节数据转化为位数据。
二、串口通讯的程序设计原理前面介绍了串行通讯的基本原理,那么如何在程序设计中实现它呢?事实上,这个过程并不复杂,一般有两种实现途径:其一就是使用MSCOMM控件,此控件提供很多方便操作的属性和方法,利用它们可以很方便地实现你的目的;另外一种途径就是使用Windows API,微软为开发者提供了很多相关的串行操作的编程接口,使用这些接口,可以很完成更为强大的功能。
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下实现串口通信的方法
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,先进先出)。
VB控件MSComm串口通讯实例教程
现有电子秤一台,使用串口与计算机进行通讯。
编写VB程序来访问串口,达到读取电子秤上显示的数据。
该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。
所有字符现有电子秤一台,使用串口与计算机进行通讯。
编写VB程序来访问串口,达到读取电子秤上显示的数据。
该电子秤为BE01型仪表,输出为RS-232C 标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。
所有字符均发送11位ASCII码,一个起始位。
在VB中与串口通讯需要引入控件MSComm串口通讯控件(在Microsoft Comm Control 6.0中)。
具体程序如下:控件简称:MSCDim Out(12) As Byte '接收var中的值Dim var As Variant '接收MSC.input中的数值Dim nRece As Integer '计算MSC.inputbuffer的个数Dim i As Integer, j As Integer '随即变量,计算循环************************************************************************** **Private Sub Form_Load()ClearTextWith MSC.CommPort = 1 '设置Com1为通信端口.Settings = "9600,E,7,2" '设置通信端口参数 9600赫兹、偶校验、7个数据位、2个停止位.(这里需要进一步说明的是:.Setting=”BBBB,P,D,S”。
含义是:B:Baud Rate(波特率);P:Parity(奇偶);D:Data Bit;S:Stop Bit).InBufferSize = 40 '设置缓冲区接收数据为40字节.InputLen = 1 '设置Input一次从接收缓冲读取字节数为1.RThreshold = 1 '设置接收一个字节就产生OnComm事件End WithEnd Sub************************************************************************** **Private Sub ClearText()Text3.Text = ""Text2.Text = "5"Text1.Text = ""End SubPrivate Sub Command1_Click()ClearText' nRece = 0 '计数器清零With MSC.InputMode = comInputModeBinary '设置数据接收模式为二进制形式.InBufferCount = 0 '清除接收缓冲区If Not .PortOpen Then.PortOpen = True '打开通信端口End IfEnd WithEnd SubPrivate Sub MSC_OnComm()DelayTime ‘用来延续时间ClearTextWith MSCSelect Case .CommEvent '判断通信事件Case comEvReceive: '收到Rthreshold个字节产生的接收事件SwichVar 1If Out(1) = 2 Then '判断是否为数据的开始标志.RThreshold = 0 '关闭OnComm事件接收End IfDoDoEventsLoop Until .InBufferCount >= 3 '循环等待接收缓冲区>=3个字节' nRece = nRece + 1For i = 2 To 12SwichVar iText1.Text = Text1.Text & Chr(Out(i))NextText1.Text = LTrim(Text1.Text)Text2.Text = Text2.Text & CStr(nRece).RThreshold = 1 '打开MSComm事件接收Case Else' .PortOpen = FalseEnd SelectEnd WithEnd Sub************************************************************************** **Private Sub DelayTime()Dim bDT As BooleanDim sPrevious As Single, sLast As SinglebDT = TruesPrevious = Timer (Timer可以计算从子夜到现在所经过的秒数,在Microsoft Windows中,Timer函数可以返回一秒的小数部分)Do While bDTIf Timer - sPrevious >= 0.3 Then bDT = FalseLoopbDT = True(通信传输速率为9600bps,则最快速度1.04ms发送一个字节,仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序)Private Sub SwichVar(ByVal nNum As Integer)DelayTimevar = Nullvar = MSC.InputOut(nNum) = var(0)End Sub(设置接收数据模式采用二进制形式,即 InputMode=comInputModeBinary,但用Input 属性读取数据时,不能直接赋值给 Byte 类型变量,只能通过先赋值给一个 Variant 类型变量,返回一个二进制数据的数组,再转换保存到Byte类型数变量中。
利用VB实现计算机串口通信实例
+,,+-.,
实践与经验
的是 (’ 对 !3<65 的串口通信方式,即通过采用 标准贺氏指令, 我们可以远程呼叫其他以拨号方式 上网的普通 (’ , 从而具有相当的实用价值。
?
图 . (’ 与 (’ 间通信程序界面
(’ 与单片机间通信实例
在工业测控领域, 我们常采用 (’ 对单片机的
通信方式。通常以 (’ 机作为上位机发送指令到单 片机, 由单片机来完成现场数据采集、 电路控制等 工作, 然后数据返回 (’ 机进行高级处理。由于普 通 的 %=+?+ 串 口 方 式 数 据 传 送 距 离 短 ( .T 米 左 右) , 如果经转换电路转换成 %=ULT 等其他串行方 式, 则传输距离可达 .,,, 米左右, 从而更加实用。 本例中, (’ 机上运行界面如图 + 所示的程序, 在发送数据栏中输入一个“ 之间的整数, 并 ,V+TT” 点击“ 发送” 按钮, 单片机将接收到这个数据并显示 该数据, 然后作除 + 处理, 结果再经串口返回到 (’ 机端。例如, 当发送数据 +UU 时, 单片机电路中数 码管上显示 +UU ,同时单片机对该数作除 + 处理, 得数 .++ 返送回 (’ 机。注意, 要通过 !=’355 控 件发送或接收二进制格式的数据,必须用 /:4@:;8 类型的变量对二进制 0W86 类型的变量进行转换。
从输入寄存器传回并移除字符, 即读端口。 E6F>=: 将一个字符串写入输出寄存器, 即写 ">=F>=: 端口。
%=N;C9N2@7:设置或传回引发 "6’233 事件中
接收事件的字符数,即引起接收事件的 “ 门槛阀 值” 。
基于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中串口通讯的实现一、概述串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于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实现串口通信
利用 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接口与外部设备进行连接。
VB11第五章串口通信方法与实现1
说 明: ◆当接收字符后,若 Rthreshold 属性设 置为 0(缺省值)则不产生 OnComm 事件。 ◆设置 Rthreshold 为 1, 接收缓冲区收 到每一个字符都会产生 OnComm 事件。
5. 状态控制 (13) DTREnabled; (14) RTSEnabled; (15) DSRHolding; (16) CTSHolding; (17) CDHolding。 以上五个属性均取值 True / False,用于 读取或控制串口管脚的状态。
(7) SThreshold 属性 语 法: MSComm1.SThreshold [=Value] 作 用:设置或返回发送缓冲区中允许的 最 小 字 符 数 。 该 属 性 和 MSComm 控 件 的 OnComm 事件有关联。Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。 类 型:Integer型 取 值:发送缓冲区中允许的最小字符数
(3) Handshaking 属性 语 法:
MSComm1.Handshaking [=Value] 作 用:设置或返回硬件握手协议。 类 型:Integer 取 值: 0 - 没有握手协议(默认); 1 - XON/XOFF; 2 - RTS/CTS; 3 - XON/XOFF和RTS/CTS两者皆可。
(6) OutBufferSize属性 语 法: MSComm1.OutBufferSize [= Value] 作 用: 设置或返回输出缓冲区大小。 类 型: Integer型。 取 值: 输出缓冲区的字节数,默认值为 512字节。 OutBufferSize 属 性 的 最 大 值 为 : 32767字节。 OutBufferSize属性值应根据需要选取。
VB串口通讯
1.VB编译坏境的安装与启动、熟悉;2.建立新的工程文件、并使用工具箱设计目标界面;3.使用LINE函数编写绘图功能的代码;4.使用TIMER和LINE功能实现动画设计;5.MSCOMM串口控件的初始化和编程,两台机器互连并通讯;6.利用VB编程得到的界面实现驱动器参数调试;7.利用VB编程得到的模拟示波器显示驱动器当前参数曲线;8.熟悉VB的代码调试,并完成驱动器参数调试和参数显示的功能。
最后一次课后每人交一份实验报告。
串口断口初始化Private Sub PortInitial() '中断形式的232口设置,没接受80个字符产生一次中断'On Error GoTo FinishSubWith Form9mPort = PortNumber.MSComm1.Settings = PortSet '设置通信口参数.MSComm1.InBufferSize = 1024 * 30 '设置MSComm1接收缓冲区为20K字节.MSComm1.OutBufferSize = 1024 '设置MSComm1发送缓冲区为1K字节.MSComm1.InputMode = comInputModeBinary '设置接收数据模式为二进制形式.MSComm1.InputLen = PutByte '设置Input 一次从接收缓冲读取字节数为50 .MSComm1.InBufferCount = 0 '清除接收缓冲区.MSComm1.OutBufferCount = 0 '清除发送缓冲区.MSComm1.RThreshold = ReceByte '设置接收一个字节产生OnComm事件.MSComm1.PortOpen = TrueEnd With'FinishSub:' MsgBox "请确认串行端口是否正常连接?", vbInformation, "串行端口连接问题" End Sub中断方式接收串口过来的数据并进行显示:在Private Sub MSComm1_OnComm()过程里通过232发送数据(非中断)是在Private Sub ModbusSendData(ByVal WorR As Boolean, ByVal Longth As Byte) 里Private Sub ModbusSendData(ByVal WorR As Boolean, ByVal Longth As Byte) '根据modbus协议发送数据程序Longth代表加上CRC总共长度从1 开始Dim sendbuffer() As Byte '发送缓冲区Dim ArrayModbusCheck() As Byte 'CRC校验数组Dim i As ByteDim j As ByteReDim sendbuffer(0)'设备号码ModbusSendBuffer(0) = 1 'DeviceNum'功能号码读写If WorR = True ThenModbusSendBuffer(FunctionBy) = WriteFunctionElseModbusSendBuffer(FunctionBy) = ReadFunctionEnd If'进行CRC校验'校验前赋值给函数形参数组长度下标从0----Longth-3ReDim ArrayModbusCheck(Longth - 3)j = 0For i = 0 To Longth - 3 Step 1ArrayModbusCheck(j) = ModbusSendBuffer(i)j = j + 1Next iCall CRC16(ArrayModbusCheck())ModbusSendBuffer(Longth - 2) = CRCHiCheckModbusSendBuffer(Longth - 1) = CRCLoCheck'以下是发送程序延迟1毫秒For i = 0 To Longth - 1 Step 1sendbuffer(0) = ModbusSendBuffer(i)MSComm1.Output = sendbufferDoDoEventsLoop Until MSComm1.OutBufferCount = 0delay (0.001)Next iEnd SubPrivate Sub CRC16(ByRef data() As Byte)Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器Dim CL As Byte, CH As Byte '多项式码&HA001Dim CRCLo As String, CRCHi As StringDim SaveHi As Byte, SaveLo As ByteDim i As IntegerDim Flag As IntegerCRC16Lo = &HFFCRC16Hi = &HFFCL = &H1CH = &HA0For i = 0 To UBound(data)CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或For Flag = 0 To 7SaveHi = CRC16HiSaveLo = CRC16LoCRC16Hi = CRC16Hi \ 2 '高位右移一位CRC16Lo = CRC16Lo \ 2 '低位右移一位If ((SaveHi And &H1) = &H1) Then '如果高位字节最后一位为1CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1End If '否则自动补0If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或CRC16Hi = CRC16Hi Xor CHCRC16Lo = CRC16Lo Xor CLEnd IfNext FlagNext iCRCHiCheck = CRC16LoCRCLoCheck = CRC16HiEnd SubPrivate Sub PortInitial() '中断形式的232口设置,没接受80个字符产生一次中断'On Error GoTo FinishSubWith Form9mPort = PortNumber.MSComm1.Settings = PortSet '设置通信口参数.MSComm1.InBufferSize = 1024 * 30 '设置MSComm1接收缓冲区为20K字节.MSComm1.OutBufferSize = 1024 '设置MSComm1发送缓冲区为1K字节.MSComm1.InputMode = comInputModeBinary '设置接收数据模式为二进制形式.MSComm1.InputLen = PutByte '设置Input 一次从接收缓冲读取字节数为50 .MSComm1.InBufferCount = 0 '清除接收缓冲区.MSComm1.OutBufferCount = 0 '清除发送缓冲区.MSComm1.RThreshold = ReceByte '设置接收一个字节产生OnComm事件.MSComm1.PortOpen = TrueEnd With'FinishSub:' MsgBox "请确认串行端口是否正常连接?", vbInformation, "串行端口连接问题" End SubPrivate Sub MSComm1_OnComm()Dim buffer() As ByteDim num As ByteDim sum As Single '临时数据累加变量Dim h As Byte '临时数据累加变量Dim k As Byte '临时数据累加变量Dim i As Integer '临时数据累加变量Dim j As Integer '接受位置数据个数统计,上限32767Dim TempPos As Single '速度计算临时寄存器Dim nResult As IntegerDim numbertest As LongDim ModbusBuffer() As ByteDim StartPointNum As IntegerDim LoopSign As BooleanDim nowtime As DoubleDim TempVelocity1 As SingleDim TempVelocity2 As SingleDim VelocityStartPoint As Integer '计算速度数据开始点Dim n As IntegerDim NextTimePoint As SingleDim Adjust(1 To 2) As ByteDim Reverse As ByteDim HistoryV As SingleRefreshShapeTimes = RefreshShapeTimes - 1Select Case RefreshShapeTimesCase 1 To 5Shape3.Visible = TrueCase 6 To 10Shape3.Visible = FalseCase 0RefreshShapeTimes = 10End SelectSelect Case mEventCase comEvReceiveIf ModbusSign = False Then '非modbus数据MSComm1.RThreshold = 0j = 1 'j下标从1开始For num = 1 To 10 Step 1 '缓冲区中数据字节型数据变为位置编码器绝对值MSComm1.InputLen = 1buffer = MSComm1.InputIf buffer(0) = &HFD Or buffer(0) = &HFB Thenbuffer = MSComm1.InputIf buffer(0) = &HFD Or buffer(0) = &HFB ThenReverse = buffer(0)MSComm1.InputLen = 2buffer = MSComm1.Input '1PointP(j) = buffer(1)PointP(j) = PointP(j) * 256 + buffer(0)NowEncoderValue = PointP(j)If PointP(j) > Motor_Encoder_Num ThenMSComm1.RThreshold = ReceByteGoTo FinishSubEnd Ifbuffer = MSComm1.Input '2PointPRef(j) = buffer(1)PointPRef(j) = PointPRef(j) * 256 + buffer(0)buffer = MSComm1.Input '3PointI(j) = buffer(1)PointI(j) = PointI(j) * 256 + buffer(0)j = j + 1 'PointP()下标从1到PutByte/2 ElseMSComm1.RThreshold = ReceByteGoTo FinishSubEnd IfElse 'buffer(0)<>&HFD MSComm1.RThreshold = ReceByteGoTo FinishSubEnd If 'buffer(0)=&HFDNext numElse 'modbus形式接收'不做任何事情放数据过去GoTo FinishSubEnd IfCase ElseEnd Selectj = j - 1 'j多加一次If j < 1 Then GoTo FinishSub '为发送激发响应本次响应结束h = 1sum = 0'接受缓冲区中电机位置数据个数为j'以下程序为画图接受数据处理程序For i = 1 To j Step 1'依次对缓冲区中的数据进行判断位置'PointP(j)为编码器反馈的原始数据(没加圈数)PointP(i) = PointP(i) + rmin '反馈位置数据加上历史记载圈数'If PointP(i) - Historyp < -1 * 0.8 * Motor_Encoder_Num Then '判断是否正转加一圈位置数据'rmin = rmin + Motor_Encoder_Num'PointP(i) = PointP(i) + Motor_Encoder_Num + 1'ElseIf PointP(i) - Historyp > Motor_Encoder_Num * 0.8 Then '判断是否反转减一圈位置数据'rmin = rmin - Motor_Encoder_Num'PointP(i) = PointP(i) - Motor_Encoder_Num - 1'End IfIf Reverse = &HFD And PointP(i) - Historyp < -1 * 0.2 * Motor_Encoder_Num Then '正转rmin = rmin + Motor_Encoder_NumPointP(i) = PointP(i) + Motor_Encoder_Num + 1ElseIf Reverse = &HFB And PointP(i) - Historyp > Motor_Encoder_Num * 0.2 Thenrmin = rmin - Motor_Encoder_NumPointP(i) = PointP(i) - Motor_Encoder_Num- 1End If'电流实际位置位置偏差赋值PointDataP(ArrowPoint) = PointP(i) - Initial_Position'判断电流是否正数If PointI(i) > 16384 ThenPointDataI(ArrowPoint) = PointI(i) - 65536ElsePointDataI(ArrowPoint) = PointI(i)End If'判断位置偏差是否为负数0-65535 正转正值反转负值'If PointPRef(i) - HistoryPref > 32767 Then PointPRef(i) = HistoryPrefIf Reverse = &HFD ThenIf PointPRef(i) <= 32767 ThenPointDataPRef(ArrowPoint) = PointPRef(i)ElsePointDataPRef(ArrowPoint) = PointPRef(i) - 65536End If'PointDataPRef(ArrowPoint) = -PointDataPRef(ArrowPoint)ElseIf PointPRef(i) <= 32767 ThenPointDataPRef(ArrowPoint) = PointPRef(i)ElsePointDataPRef(ArrowPoint) = PointPRef(i) - 65536End If'PointDataPRef(ArrowPoint) = -PointDataPRef(ArrowPoint)End If'HistoryPref = PointDataPRef(ArrowPoint)PointV(i) = (PointP(i) - Historyp) * Drawing_ConstIf Abs(PointV(i) - HistoryV) > 3600 Then PointV(i) = HistoryV '前后两次采样速度变化过大滤波PointDataV(ArrowPoint) = PointV(i)HistoryV = PointV(i)'*****************保存位置历史数据为判断电机转过整数圈数准备********************Historyp = PointP(i)ArrowPoint = ArrowPoint + 1 '指针移动加一后面多加一If ArrowPoint > DrawMemory ThenArrowPoint = 1 '越界从1开始PointDataP(0) = PointDataP(DrawMemory) '方便以后画图PointDataV(0) = PointDataV(DrawMemory)PointDataPRef(0) = PointDataPRef(DrawMemory)PointDataI(0) = PointDataI(DrawMemory)End IfNext i'画图程序'触发条件时间If FirstReceive = True ThenHistoryTime = TimerFirstReceive = FalseEnd IfIf (Timer - HistoryTime > RefreshTime) And (StopSign = False) Then '判断是否该显示Shape1.RefreshDrawWidth = 2axisT = 2715'定起始数组坐标TraceTime = count_limitIf ArrowPoint - TraceTime < 0 ThenStartPointNum = DrawMemory - Abs(TraceTime - ArrowPoint) - 1ElseStartPointNum = ArrowPoint - 1 - TraceTimeEnd IfHistoryTime = TimerEnd If '显示条件Text1.Text = Str(Fix(PointDataV(ArrowPoint - 1))) '转速Text5.Text = Str(PointDataP(ArrowPoint - 1)) '脉冲数MSComm1.RThreshold = ReceByteFinishSub:Exit SubEnd Sub。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB中串口通讯的实现
在VB中实现串口通讯需要借助于SerialPort类,该类提供了一系列方法和属性用于串口的配置和通讯操作。
接下来,定义一个SerialPort对象和一个字节数组,用于接收和发送数据。
在窗体加载事件中初始化SerialPort对象,并设置串口的一些属性,如波特率、数据位、校验位等,根据实际需求进行配置。
还可以设置数据接收和发送的事件处理函数。
例如,下面的代码演示了如何配置串口:
```vb
Imports System.IO.Ports
Public Class Form1
Dim serialPort As New SerialPort
Dim receiveBuffer(255) As Byte
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'配置串口属性
serialPort.PortName = "COM1"
serialPort.BaudRate = 9600
serialPort.DataBits = 8
serialPort.Parity = Parity.None
serialPort.StopBits = StopBits.One
'数据接收事件处理函数
AddHandler serialPort.DataReceived, AddressOf
SerialPort_DataReceived
'打开串口
serialPort.Open
End Sub
Private Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)
'接收数据
Dim bytesToRead As Integer = serialPort.BytesToRead
Dim bytesRead As Integer = serialPort.Read(receiveBuffer, 0, bytesToRead)
'处理接收到的数据
If bytesRead > 0 Then
Dim receivedData As String =
Encoding.ASCII.GetString(receiveBuffer, 0, bytesRead) '显示接收到的数据
UpdateReceivedData(receivedData)
End If
End Sub
Private Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click
'发送数据
Dim sendData As String = txtSendData.Text
Dim sendBuffer As Byte( = Encoding.ASCII.GetBytes(sendData) serialPort.Write(sendBuffer, 0, sendBuffer.Length)
'清空发送框
txtSendData.Text = ""
End Sub
Private Sub UpdateReceivedData(data As String)
'更新接收数据的显示
If Me.InvokeRequired Then ' 跨线程调用控件
Me.Invoke(Sub( UpdateReceivedData(data))
Else
lblReceivedData.Text = data
End If
End Sub
End Class
```
在上述代码中,我们主要关注Form1_Load事件处理函数和
btnSend_Click事件处理函数。
在Form1_Load事件中,我们初始化SerialPort对象,并设置串口的各项属性,然后通过Open方法打开串口。
在SerialPort_DataReceived事件处理函数中,我们首先确定接收到的数
据长度,并根据长度将数据读取到字节数组中。
可以根据需要进行数据的
处理,并通过UpdateReceivedData方法更新接收数据的显示。
在
btnSend_Click事件处理函数中,我们获取文本框中的数据,并将其转换
为字节数组后发送到串口。
需要注意的是,在处理串口接收数据时,当涉及到控件的操作时,要
使用委托机制避免跨线程调用控件引发异常。
上述代码中,我们通过判断InvokeRequired属性来决定是否需要跨线程调用控件。
以上就是在VB中实现串口通讯的基本步骤和代码示例。
根据实际的
需求和具体的应用场景,可以进一步扩展和优化代码,实现更复杂的串口
通讯功能。