用VB实现基于USB的虚拟串口通讯
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中利用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的串口通信在虚拟现实系统中的应用
2009年2月第2期电子测试ELECTRONIC T ESTJan.2009No.2电子测试E LECTRO NIC TE ST基于VB的串口通信在虚拟现实系统中的应用高杰,张玉(合肥电子工程学院合肥230037)摘要:在W indo wsXP的软件环境下,以3D引擎技术为基础,创建3D虚拟空间,利用影像处理系统获取现实场景中的影像并与虚拟场景合成,实现最佳的图像融合效果;利用V B中的M SCo mm控件实现工业控制计算机与动力系统、影像处理系统、灯光照明系统的串口通信,将现实世界中的速度信息通过采集处理程序传递给虚拟场景,控制场景的视角变化和位移变化,较好地保证了任意时间作用于虚拟空间的信号与现实中变送器发出的信号的同步性,最终达到对3D虚拟空间的综合控制。
关键词:串口通信;虚拟空间;速度;方向中图分类号:T P274文献标识码:AApplication of serial port comm unicatio n in thevirtual reality system based on VBGao Jie,Zhang Yu(EEI,Hefei230037)Abstract:Based on technolo gy of3D engine,the paper establishes3D virtual space,acquire actu-al image w ith imag e m anipulation system and com pose it w ith virtual screen in the softw are cir-cum stance of w indow sXP;realizes the Serial Port Comm unicatio n in com puter,motivity system, im age m anipulatio n sy stem and lig hting system by MSCom m control of VB.T ransfer actual speed to virtual screen w ith collectio n and disposing process to contr ol visual ang le and displace-m ent,guarantee iso chronous betw een virtual sig nal and actual signal and finally achieves sy n-thetical co ntro l to3D virtual space.Keywords:Serial Po rt Comm unication;virtual space;speed;dir ectio n0引言虚拟现实(Virtua-l Reality,简称VR)作为一门新兴的技术,其应用已从游戏机和主题游乐园扩展到工业、商业、医学和军事等多个领域。
用VB写的modbusrtu模式通讯源码
用VB写的modbusrtu模式通讯源码‘用VB 写的modbus rtu模式通讯源码,已在台达PLC上调试通过Private Sub CmdOpen_Click()On Error Resume NextIf (MSComm1.PortOpen) Then ‘打开/关闭串口MSComm1.PortOpen = FalseElseMSComm1.PortOpen = TrueEnd IfIf (MSComm1.PortOpen) ThenCmdOpen.Caption = "关闭串口"Shape5.FillStyle = vbFSSolidElseCmdOpen.Caption = "打开串口"Shape5.FillStyle = vbFSTransparentEnd IfIf Err ThenMsgBox Error$, 48, "错误码信息"Exit SubEnd IfEnd SubPrivate Sub Combo1_Click()/doc/df18763589.html,mPort = Combo1.ListIndex + 1End SubPrivate Sub Combo2_Click()Call SettingEnd SubPrivate Sub Combo3_Click()Call SettingEnd SubPrivate Sub Combo4_Click()Call SettingEnd SubPrivate Sub Combo5_Click()Call SettingEnd SubPrivate Sub Command1_Click()‘S hape1.FillStyle = vbFSSolidDim Y0_status As ByteDim Sendstr As StringDim i As Integer, j As IntegerSendstr = "01 01 05 00 00 10 "HexSend (Sendstr)Sleep (30)HexSend (Sendstr)End SubPrivate Function HexSend(Sendstr As String) As Integer Dim outbuf() As ByteDim Temp(0) As ByteDim crc As String, Sendstrls As StringDim sendlen As IntegerDim i As Integer, j As IntegerIf Sendstr = "" ThenMsgBox "发送数据不能为空!"HexSend = 0Exit FunctionEnd IfS endstrls = Trim(Sendstr) ‘去掉空格sendlen = Len(Sendstrls) + 1 ‘取长度j = 0ReDim outbuf(1 To sendlen \ 3) As ByteFor i = 1 To sendlen Step 3j = j + 1outbuf(j) = Val("&H" & CStr(Mid(Sendstrls, i, 2)))Next icrc = Crc16(outbuf)ReDim Preserve outbuf(1 T o (sendlen \ 3 + 2)) As Byte ‘加上CRC校验码outbuf(sendlen \ 3 + 1) = Val("&H" & CStr(Mid(crc, 1, 2)))outbuf(sendlen \ 3 + 2) = Val("&H" & CStr(Mid(crc, 3, 2)))For i = 1 To (sendlen \ 3 + 2)Temp(0) = outbuf(i)MSComm1.Output = TempNext iFor i = 1 To 2000Next iHexSend = 1End FunctionPrivate Function Setting()MSComm1.Settings = CStr(Combo2.Text) & "," & CStr(Combo3.Text) & "," & CStr(Combo4.Text) & "," & CStr(Combo5.Text) End FunctionPrivate Sub Command2_Click()‘If (MSComm1.RThreshold = 0) Then‘MSComm1.RTh reshold = 1‘Else‘MSComm1.RThreshold = 0‘End IfLabel11.Caption = "接收个数:" & CStr(ReceCount) & " " & "接收帧数:" & CStr(Framecount) End SubPrivate Sub Form_Load()Combo1.AddItem ("COM1")Combo1.AddItem ("COM2")Combo1.AddItem ("COM3")Combo1.AddItem ("COM4")Combo1.AddItem ("COM5")Combo1.ListIndex = 0Combo2.AddItem ("2400")Combo2.AddItem ("4800")Combo2.AddItem ("9600")Combo2.AddItem ("11520")Combo2.ListIndex = 0Combo3.AddItem ("E")Combo3.AddItem ("O")Combo3.AddItem ("N")Combo3.ListIndex = 2Combo4.AddItem ("6")Combo4.AddItem ("7")Combo4.AddItem ("8")Combo4.ListIndex = 2Combo5.AddItem ("1")Combo5.AddItem ("2")Combo5.ListIndex = 0ReceCount = 0End SubPrivate Function Crc16(data() As Byte) As StringDim 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 = 1 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 ‘则低位字节右移后前面补1 End If ‘否则自动补0If ((SaveLo And &H1) = &H1) Then ‘如果LSB为1,则与多项式码进行异或CRC16Hi = CRC16Hi Xor CHCRC16Lo = CRC16Lo Xor CLEnd IfNext FlagNext iIf Len(Hex(CRC16Hi)) = 1 ThenCrcHi = "0" + Hex(CRC16Hi)ElseCrcHi = Hex(CRC16Hi)End IfIf Len(Hex(CRC16Lo)) = 1 ThenCrcLo = "0" + Hex(CRC16Lo)ElseCrcLo = Hex(CRC16Lo)End IfCrc16 = CrcLo & CrcHiEnd FunctionPrivate Sub MSComm1_OnComm()Dim inpu() As ByteDim i As IntegerDim tempstr As String, Strdata As StringSelect Case /doc/df18763589.html,mEvent Case comEvReceive ‘接收事件tempstr = MSComm1.Inputinpu() = tempstrFramecount = Framecount + 1 ‘帧个数加1If (Framecount = 1) Thenframepoint(Framecount) = UBound(inpu) + 1 ‘第一帧帧尾Elseframepoint(Framecount) = framepoint(Framecount - 1) + UBound(inpu) + 1 ‘第二帧开始指针End IfFor i = 0 To UB ound(inpu) ‘将字符转换为数组If (Len(Hex(inpu(i))) = 1) ThenStrdata = Strdata & "0" & Hex(inpu(i)) & " "ElseStrdata = Strdata & Hex(inpu(i)) & " "End IfNext iFor i = ReceCount + 1 To UBound(inpu) + 1 ‘数据进入缓冲区Recebuf(i) = inpu(i - 1)NextReceCount = ReceCount + UBound(inpu) + 1TextReceive.Text = TextReceive.Text & StrdataStrdata = ""Case comEvSendEnd SelectEnd SubPrivate Function RtuCheck(data() As Byte) As IntegerDim CrcHi As Byte, CrcLo As ByteDim Checkdata() As ByteDim i As IntegerDim crc As StringCrcHi = data(UBound(data))CrcLo = data(UBound(data) - 1)ReDim Checkdata(1 To (UBound(data) - 1)) As ByteFor i = 1 To (UBound(data) - 1) ‘附值Checkdata(i) = data(i - 1)Nextcrc = Crc16(Checkdata)If (CrcLo = Val("&H" & CStr(Mid(crc, 1, 2))) And CrcHi = Val("&H" & CStr(Mid(crc, 3, 2)))) Then RtuCheck = 1ElseRtuCheck = 0End IfEnd Function。
串口通讯及其在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环境下实现计算机串行端口通信
( 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事件 ,用户程序可以捕 获该 事件进行相应处 收缓存 区。
VB6.0环境下基于USB的虚拟串口通讯实现
VB6.0环境下基于USB的虚拟串口通讯实现摘要:以ftdi公司的ft232bl芯片为核心设计并实现了基于usb 接口的计算机与单片机之间的虚拟串口通讯。
单片机采用philips 公司p89系列单片机,完成数据的存储。
计算机在windows环境下利用mscomm通讯控件实现上位机与下位机之间的数据传输。
在此提出了pc机对虚拟串口的自动识别方法,并提供了程序的源代码。
实验结果表明,用虚拟串口实现计算机与单片机之间的usb通信,具有速度快,软件实现简单等优点。
关键词:vb6.0; usb口; ft232bl;虚拟串口引言数据传输是现代通讯过程中的一个重要环节,在数据传输过程中,不仅要求数据传输的准确率要高,而且要求速度快、连接方便。
传统的rs 232串口通讯和并口通讯都存在传输速度低、扩展性差、安装麻烦等缺点,而基于usb接口的数据传输系统能够较好地解决这些问题。
目前,usb接口以其传输速率高、即插即用、支持热插拔等优点,逐步成为pc机的标准接口。
本文中的数据传输系统采用了usb接口进行上位机与下位机之间的数据通讯。
下位机采用philips 公司p89系列单片机,完成数据的存储。
上位机通过vb6.0编程,实现上位机与下位机之间的数据传输。
1数据传输系统的总体设计系统的硬件部分主要包括2部分:上位机端和下位机端。
上位机采用pc机或笔记本电脑,操作系统为windows xp,实现上位机和下位机之间的数据传输、显示、处理、存储及查询功能。
系统的下位机采用philips公司p89系列单片机,完成数据的存储。
下位机为一个手持的数据存储仪,由usb转串口数据转换模块、ttl转rs 422总线模块、中央处理模块、显示模块、存储模块、电源模块等组成。
上位机与下位机的连接利用pc机自带的usb接口,原理框图如图1所示。
图1数据传输系统原理框图把数据记录卡插入数据存储仪内,可把卡内数据转存到存储模块。
数据存储仪通过usb口与pc机连接,把所存数据传输到上位机,上位机对数据进行显示、处理及存储。
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实现USB
ULONG
i,flag=1,j;
ULONG
NumDevicesOpen_DEVICE_DESCRIPTOR usbDeviceInst;
PUSB_DEVICE_DESCRIPTOR *UsbDevices = &usbDeviceInst;
char DeviceName[256]="";
1.主机寻找 USB 设备的过程 第一个被 Windows 支持的 USB 外围设备类是人机接口设备。HID 是 HUMANINTER-FACE DEVICE 人机接口设备的英文缩写。是指直接和人进行互动 的设备。如鼠标、键盘等。运行在 WINDOWS98 或其他更高的版本的操作系统的 PC 机,系统除了提供通用的 USB 设备的底层驱动以外,还单独提供了一些 HID 设 备的完整驱动,应用程序可以很容易地与操作系统内部的 HID 通讯。这样使得符 合 HID 类的 USB 设备很容易开发与运行。也就是说,我们如果想实现一个 USB 的 HID 类设备,是不需要在 Windows 下开发自己的驱动程序的。HID 不一定要是标准 的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持 报文的格式。任何工作在该限制之内的设备都可以成为一个 HID,例如温度计、 电压计、读卡机等。
// filename 是管道名称,如 pipe01 等 int CUSBImpObject::open_file( char *filename) {
int successOpened = 0,i; int NumOpened; HANDLE h; NumOpened=OpenAllUsbDevices((LPGUID) &GUID_CLASS_I82930_BULK);
利用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接口与外部设备进行连接。
用VB6.0实现计算机间串口通信
用VB6.0实现计算机间串口通信作者:李永胜来源:《电脑知识与技术·学术交流》2008年第08期摘要:本文主要介绍利用VB6.0串行通信编程的方法,利用MSComm控件实现计算机与计算机间的串口通信。
关键词:串口通信;VB6.0;MSCOMM控件中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)08-10ppp-0c随着互联网的不断发展,计算机间的相互通信已非常普遍,只要通过计算机的串行口就可以实现。
而对于串口通信的编程软件,微软公司的Visual Basic 6.0(简称VB6.0)以其友好的开发界面、简单易用、实用性强等优点已在国内外得到广泛应用。
VB6.0提供了许多供用户选择的控件,这些控件以.OCX为文件后缀名,其中MSComm.OCX即是用于串行通信的控件。
如果需要使用该控件,可将控件添加到工具箱内,这样就可以利用该控件进行串行通信程序的设计。
下面这个例子,说明如何进行串行通信程序设计,该程序在Windows98环境下已调试通过。
在调试程序时,很难做到一个人同时占有两台计算机。
为此,可通过直接短接串口的2、3两个脚,即将串行口的2、3脚连接在一起,从而使发送的信息直接被本机接收。
这样,就可以在一台计算机上调试程序。
1 MSComm控件常用属性Commport 设置并返回通信端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen设置并返回通信端口的状态,也可以打开和关闭端口。
InBufferSize 设置并返回接收缓冲区的字符数。
Input 从接收缓冲区返回和删除字符。
InputLen设置并返回Input属性从缓冲区读取的字符数。
OutBufferSize以字符形式设置并返回传输缓冲区的大小。
Output向传输缓冲区写数据。
2 用户界面设计首先新建一个“标准EXE”工程,然后选择“工程/部件”菜单项,在“部件”对话框中选择Microsoft Comm Control6。
用VB通信控件实现串口通信
Setting:对串口通信的相关参数。包括串口通信的比特 率、奇偶校验、数据位长度、停止位等。其默认值是“9600, N,8,1”,表示串口比特率是 9600bit/s,不作奇偶校验,8 位数 据位,1 个停止位。
Portopen:设置串口状态,值为 True 时打开串口,值为 False 时关闭串口。
对 MSComm 控件设置相应的属性和事件,就可以进行串 行通信了 [2]。
(1) MSComm 的属性 由于 MSComm 控件属性很多,在这里仅介绍与实现串口 通信密切相关的重要属性。 Commport:设置通信所占用的串口号。如设成 1 (默认 值),表示对 COM1 进行操作。
本文收稿日期:2009-6-12
[2] 李长林. Visual Basci 串口通信技术与典型实例. 清华大学 出版社,2006,04.
作者简介 车飞,女 (1975-),计算机讲师,计算机应用。
-106-
3 PC 机间的串口通信
(1) 新建一个窗体,在上面放两个 Text 控件、两个 Com- mandButton 控件和两个 Label 控件。
(2) 在控件工具箱中的空白处点击鼠标右键,在弹出的 菜单中选择 “部件”,在弹出的窗口中的 控 件 列 表 中 找 到
(下转到 106 页)
- 80 -
电脑编程技巧与维护
Realize Serial Port Communication in VB Control
CHE Fei
(Siping Professional College,Siping 136002) Abstract: Through in VB Microsoft Communication Control (i.e. MSComm) attribute and the event carries on the corre- sponding programming operation, may with ease realize the serial port communication. Key words: Visual Basic; Serial Communication; MSComm Control
串口通讯及其在VB平台下的实现
串口通讯及其在VB平台下的实现(2009-07-01 20:00:40)转载分类:VB标签:杂谈随着计算机系统的普及与外围设备技术的发展,计算机与外围设备之间的通讯就显得越来越重要了。
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。
对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。
在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。
所以串行接口是微机应用系统常用的接口,而相应的应用程序也成为今年来研究的热点。
本文旨在阐述一般的穿口通讯的原理及其程序设计,希望借此能够抛砖引玉,为更深入的研究打下一定的基础。
一、串行通讯的基本原理所谓"串行通信"是指外设和计算机间使用一根数据信号线,数据在一根数据信号线上按位进行传输,每一位数据都占据一个固定的时间长度。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢。
相比之下,由于高速率的要求,处于计算机内部的CPU与串口之间的通讯仍然采用并行的通讯方式,所以串行口的本质就是实现CPU与外围数据设备的数据格式转换(或者称为串并转换器),即当数据从外围设备输入计算机时,数据格式由位(bit)转化为字节数据;反之,当计算机发送下行数据到外围设备时,串口又将字节数据转化为位数据。
二、串口通讯的程序设计原理前面介绍了串行通讯的基本原理,那么如何在程序设计中实现它呢?事实上,这个过程并不复杂,一般有两种实现途径:其一就是使用MSCOMM控件,此控件提供很多方便操作的属性和方法,利用它们可以很方便地实现你的目的;另外一种途径就是使用Windows API,微软为开发者提供了很多相关的串行操作的编程接口,使用这些接口,可以很完成更为强大的功能。
VB6.0环境下基于USB的虚拟串口通讯实现
VB6.0环境下基于USB的虚拟串口通讯实现宁辉;孙学艳;刘建;张建国【期刊名称】《现代电子技术》【年(卷),期】2012(035)006【摘要】以FTDI公司的FT232BL芯片为核心设计并实现了基于USB接口的计算机与单片机之间的虚拟串口通讯.单片机采用Philips公司P89系列单片机,完成数据的存储.计算机在Windows环境下利用MSComm通讯控件实现上位机与下位机之间的数据传输.在此提出了PC机对虚拟串口的自动识别方法,并提供了程序的源代码.实验结果表明,用虚拟串口实现计算机与单片机之间的USB通信,具有速度快,软件实现简单等优点.%The communication between SCM and USB port based computer through virtual serial port is designed and implemented by taking FT232BL of FTDI Incorperated as a kernel. The data storage is completed by Philips P89 series MCU. The data tranmission between host computer and lower computers is achieved by means of MSComm communication control in the Windows environment. The method that PC automatically identifies the virtual serial port is presented. The source code of the program is provided. The experimental result shows that the USB communication between SCM and PC implemented by virtual serial port is speedy and easy to implement by software.【总页数】4页(P45-48)【作者】宁辉;孙学艳;刘建;张建国【作者单位】北京航空工程技术研究中心,北京 100076;北京航空工程技术研究中心,北京 100076;北京航空工程技术研究中心,北京 100076;北京航空工程技术研究中心,北京 100076【正文语种】中文【中图分类】TN919-34【相关文献】1.VB6.0环境下数控机床串口通讯软件的设计 [J], 黄晓华;王伟;曹娟;王兴成2.基于VB6.0下的PEC8000模块与计算机串口通讯的应用 [J], 杨志;李国林3.基于VB6.0的PC机与单片机串口通讯的实现 [J], 魏延萍4.基于VB6.0环境下的综合查询的实现 [J], 许波勇5.基于USB的PDA与DSP的虚拟串口通讯实现 [J], 王永磊;何强;韩壮志因版权原因,仅展示原文概要,查看原文内容请购买。
使用VB开发串口、USB通信软件
寻 找EOF字符。
使用VB开发串口、USB通信软件
使用Windows的API应用程序接口
• Handshake常数。 Handshake常数如表所示。
常数
值
描述
comNone 0 无握手
comXonXoff 1 XOn/Xoff握手
使用VB开发串口、USB通信软件
使用串口通信控件
针对串口通信,微软公司专门提供了MSComm控件, 使用该控件进行串口通信设计是十分方便的,程序员不必 花时间去了解较为复杂的API函数。通过简单修改控件的 属性和使用控件提供的方法,就可以实现对串口的配置、 完成串口接收和发送数据。
使用VB开发串口、USB通信软件
使用VB开发串口、USB通信软件
使用Windows的API应用程序接口
• Settings属性的设置由4个设置组成,格式如下:
BBBB
P
D
S
各个属性值间用逗号隔开,其中BBBB为波特率,P为奇偶校验,D为数 据位数,S为停止位数。其默认值为“9600,N,8,1”。
• InputLen属性。设置并返回Input属性从接收缓冲区中读取的字符数。 InputLen 属性的默认值是0。设置InputLen为0时,使用Input将使MSComm 控件读取缓冲区中全部的内容。
4
comEvCD
5
comEvRing
6
使用VB开co发mE串v口EO、F USB通信7软件
描述 发送事件 接收事件 clear-to-send线变化 data-set ready线变化 carrier detect线变化 振铃检测 文件结束
基于VB的USB设备检测通信研究
在计算机外设接u中,并行接【1没备的榆测通 信也是一个不可缺少的部分:并行通信具有传输速度 快(50~100Kbps)、扩展电路简单、兼容性好等优点。利 用、B对并L7没备进行检测通信时.与串口设备相比,由 于vB自身的接口不能直接访问并口寄存器。也没有可 以直接供使用的井口通信控件,也就不能直接简单地对 并[n_2备进行编程。
利用wⅢ·hns系统的强大功能。可以选择HID类驱 动作为应用程序住w…一s环境下应用程序对usR设备 进行柃测的没备驱动。虽然,HID类的usB设备驱动并 1i能驱动所有的usB没备,f日足只要usB设备中的描述 符符合IIID类的描述,并使用HI【)规范中定义的数据传 输方式.HlD类是町以完成对该usB设备驱动的。对丁 不符台相应条件约束设备,一,以定义或更改其设备描述 符和传输模式以符合HID类驱动的标准。
要直接对并口设备进行读写,就必须编写对并|1寄 存器}方问的动态链接库(DIJ.):vB中对于动态链接库 的编写比较复杂,涉及刮与C++语言的混合编程,不适 宜作简单快速的设备榆测通信的接口开发。
3 USB设备规范
【J前usB主要肓两种没备规范:usBl l标准和 usB2 0标准。后者是在前者的基础r面发展起来的,速 度最快an主480Mbps的一种规范,并日.向前兼容。在 usB设备规范中存在两种结构:LsB拓扑结恂和LsB逻 辑结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB6.0环境下基于USB的虚拟串口通讯实现电路图以FTDI公司的FT232BL芯片为核心设计并实现了基于USB接口的计算机与单片机之间的虚拟串口通讯。
单片机采用Philips公司P89系列单片机,完成数据的存储。
计算机在Windows 环境下利用MSComm通讯控件实现上位机与下位机之间的数据传输。
在此提出了PC机对虚拟串口的自动识别方法,并提供了程序的源代码。
实验结果表明,用虚拟串口实现计算机与单片机之间的USB通信,具有速度快,软件实现简单等优点。
0引言
数据传输是现代通讯过程中的一个重要环节,在数据传输过程中,不仅要求数据传输的准确率要高,而且要求速度快、连接方便。
传统的RS232串口通讯和并口通讯都存在传输速度低、扩展性差、安装麻烦等缺点,而基于USB接口的数据传输系统能够较好地解决这些问题。
目前,USB接口以其传输速率高、即插即用、支持热插拔等优点,逐步成为PC机的标准接口。
本文中的数据传输系统采用了USB接口进行上位机与下位机之间的数据通讯。
下位机采用Philips公司P89系列单片机,完成数据的存储。
上位机通过VB6.0编程,实现上位机与下位机之间的数据传输。
1数据传输系统的总体设计
系统的硬件部分主要包括2部分:上位机端和下位机端。
上位机采用PC机或笔记本电脑,操作系统为Windows XP,实现上位机和下位机之间的数据传输、显示、处理、存储及查询功能。
系统的下位机采用philips公司P89系列单片机,完成数据的存储。
下位机为一个手持的数据存储仪,由USB转串口数据转换模块、TTL转RS422总线模块、中央处理模块、显示模块、存储模块、电源模块等组成。
上位机与下位机的连接利用PC机自带的USB接口,原理框图如图1所示。
图1数据传输系统原理框图
把数据记录卡插入数据存储仪内,可把卡内数据转存到存储模块。
数据存储仪通过USB
口与PC机连接,把所存数据传输到上位机,上位机对数据进行显示、处理及存储。
系统采用FTDI公司的FT232BL芯片作为USB转串口模块,可以和单片机的内置串口直接连接,使单片机通过USB口和PC机通讯。
芯片一方面可以接收从PC机发来的USB数据,并将其转换为串行I/O数据格式发送给单片机串口;另一方面可把单片机从串口发出的数据转换为USB的数据格式传回PC机。
与其他USB接口芯片相比,用FT232BL芯片进行USB 外设开发,只需熟悉单片机编程及简单的VC或VB编程,而无需考虑固件设计以及驱动程序的编写,从而能大大缩短USB外设产品的开发周期。
2硬件电路设计
2.1FT232BL芯片简介
FT232BL内部结构如图2所示,主要由USB收发器、串行接口引擎(SIE)、USB协议引擎、通用异步收发(UART)先进先出(FIFO)控制器和通用异步收发(UART)转换器等构成。
USB收发器提供USB1.1/2.0全速物理接口到USB总线;串行接口引擎主要用于完成USB数据的串/并双向转换,并按照USB2.0规范来完成USB数据流的位填充/位反填充,以及循环冗余校验码(CRC5/CRC16)的产生和检错;USB协议引擎管理来自USB设备控制端口的数据流;通用异步收发(UART)先进先出(FIFO)控制器处理收发通道缓冲与通用异步收发(UART)寄存器之间的数据传递。
图2FT232BL内部结构框图
通用异步收发器(UART)实现与单片机(如P89V51RD2)的串行接口,通过TXD,RXD,GND3根数据线分别与单片机的RXD,TXD,GND相连,完成与单片机的数据交换。
FT232BL内含2个数据缓冲区,一个是128B的发送缓冲区,另一个是384B的接收缓冲区。
它们均用于USB 数据与串行I/O数据的交换缓冲区。
另外,FT232BL还包括1个内置的3.3V稳压器,1个6MHz的振荡器、8倍频的时钟倍频器、USB锁相环和电擦除只读存储器接口。
2.2FT232BL电路设计
根据USB设计规范,USB设备有总线供电和自供电2种方式。
考虑到USB通讯功能
仅在连接PC机时使用,所以,FT232BL芯片由USB总线供电,电路其他部分通过双触点开关的一个常开触点连到USB总线电源正极上。
典型硬件电路如图3所示。
采用上电复位方式,通过输出可使单片机复位。
时钟电路采用1个6MHz无源晶振及2个27pF的陶瓷电容组成。
PWREN脚与单片机的P1.7相连,用于判断USB总线是处于挂起状态还是正常状态。
在USB接口的电源端接一个磁珠,用以减少主机与设备的干扰;电源端增加了去耦电容和旁路电容,以提高电路的抗干扰性。
在印刷电路板的设计中,2根串行数据线的走线应可能短,并且长度相等。
图3中的93C46(93C56或93C66)是一片电擦除只读存储器(E2PROM),用于存储产品的VID,PID,设备序列号及一些说明性文字等。
这需要用户自己编写,编写的应用程序由FTDI公司提供。
用户只需运行相应的VB程序,写入相应的信息即可。
该电擦除只读存储器(E2PROM)是可选的。
若没有电擦除只读存储器(E2PROM),FT232BL将使用默认的VID,PID(进程标识符),产品描述符和电源描述符,并且没有设备的序列号。
图3FT232BL电路原理图
3上位机的软件设计与编程
3.1虚拟串口驱动程序安装
当下位机连接到上位机的USB接口时,上位机会检测到新硬件,这时需要安装一个从FTDI公司网站上免费下载的虚拟串口(VCP)驱动程序。
该驱动程序适用于Windows98/2000/ME/XP等不同操作系统。
用户可以在这虚拟串口上进行应用程序的开发。
该虚拟串口可以像一个标准的物理串口那样被访问,可本质上所有针对虚拟串口的数据通信都是通过USB 总线完成的。
3.2上位机的软件编程
上位机软件采用VB6.0提供的串口通讯MSComm控件进行应用程序的编写。
MSComm控件提供了功能完善的串口数据的发送和接收功能,它有2种处理通信的方式:一种是事件驱动方式,当串口发生事件或错误时,MSComm控件会产生OnComm事件,程序可以捕获该事件进行响应处理;另一种是查询方式,在程序中查询MSComm控件的CommEvent属性的值是否发生变化,从而确定响应处理。
3.2.1虚拟串口的自动识别
一般来说,上位机操作系统为FT232BL芯片分配的虚拟COM端口是不确定的,下位机连接到同一上位机的不同USB口,其虚拟COM端口号不同,下位机连接到不同的上位机,虚拟COM端口号更是无法确定。
为了让上位机能够自动识别下位机连接的虚拟COM口,程序中采用了循环访问各COM口的方式,如果该COM口是存在的则按照通讯协议向该端口发送
“3CH”,如果该COM口不存在,则跳过,判断下一个COM口。
如果收到下位机回送的“3CH”,则说明通讯检测成功。
程序代码如下:
4系统运行结果
上位机可以从下位机中读取最多31组数据(数据组数由下位机存储器容量决定),每组数据8KB,用户可根据需要自行选择查看各组数据。
图4是数据传输系统实际运行的结果。
图4运行结果
5结语
该系统通过调试,已成功应用到项目中,运行稳定、可靠,满足了设计需求和功能,对开发类似的系统具有很好的参考价值。