VB 串口通信程序设计典型实例

合集下载

VB串口通信程序设计典型实例

VB串口通信程序设计典型实例

第6章V B串口通信程序设计典型实例利用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 PC或IPC 22 串口通信线(三线制) 13 Visual Basic 6.0 16.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相连。

第6章VB串口通信程序设计典型实例图6-1 PC与PC串口通信线路6.1.4 设计任务利用MSComm控件和VB API函数编写程序实现PC与PC串口通信。

任务要求,两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123”,单击“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,单击“发送字符”命令,信息返回到第一组的计算机。

vb程序实现串口通信,将接到的数据动态保存,并可以图表绘制曲线(X:时间,Y:数据)

vb程序实现串口通信,将接到的数据动态保存,并可以图表绘制曲线(X:时间,Y:数据)

vb程序实现串口通信,将接到的数据动态保存,并可以图表绘制曲线(X:时间,Y:数据)将接到的数据赋值于全局变量,通过ADO数据控件连接数据库及表,用以下代码保存数据: Private Sub Timer1_Timer()If Label1.Caption <> CStr(Time$) ThenLabel1.Caption = Time$sum_zj = sum_zj + 1Text3 = sum_zj'校准If sum_zj >= 3 Thensum_zj1 = sum_zj1 + 1sum_zj = sum_zj - 3Text4 = sum_zj1Adodc1.Recordset.AddNew '每3秒记录一组数据Adodc1.Recordset(0) = shiY AnHAdodc1.Recordset(1) = Mid(Time$, 1, 2) & Mid(Time$, 4, 2) & Mid(Time$, 7, 2) '记录time Adodc1.Recordset(2) = record_jm(0) '记录数据Adodc1.Recordset(3) = record_jm(1) '记录数据Adodc1.Recordset(4) = record_jm(2) '记录数据Adodc1.Recordset(5) = record_jm(3) '记录数据Adodc1.Recordset(6) = record_jm(4) '记录数据Adodc1.Recordset(7) = record_jm(5) '记录数据Adodc1.Recordset(8) = record_jm(6) '记录数据Adodc1.Recordset(9) = record_jm(7) '记录数据Adodc1.Recordset(10) = record_jm(8) '记录数据Adodc1.Recordset(11) = record_jm(9) '记录数据Adodc1.Recordset(12) = record_jm(10) '记录数据Adodc1.Recordset(13) = record_jm(11) '记录数据Adodc1.Recordset.UpdateEnd IfEnd IfEnd SubPrivate Sub Timer2_Timer()Picture4.DrawStyle = 0以下代码绘制实时曲线(6点):Picture4.DrawWidth = 3 ' = dashPicture4.Line (sum_z1 * 18 + 500, record_jm(0) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(2) * -150 + 7900), vbRed ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(1) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(3) * -150 + 7900), vbCyan ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(2) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(4) * -150 + 7900), vbBlack ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(3) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(5) * -150 + 7900), vbMagenta ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(4) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(6) * -150 + 7900), vbGreen ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(5) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(7) * -150 + 7900), vbBlue ', BFEnd SubPrivate Sub Timer3_Timer()If Label32 <> CStr(Time$) Then 'Label1.CaptionLabel32.Caption = Time$sum_z = sum_z + 1Text31 = sum_z'校准If sum_z >= 5 Thensum_z = sum_z - 5sum_z1 = sum_z1 + 1Text30 = sum_z1End IfEnd IfEnd Sub以下代码绘制曲线的坐标:Private Sub Form_Load()With Adodc1Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\kongtiao\cartemp.mdb;Persist Security Info=False"Adodc1.RecordSource = "select * form car_bm"End WithText1 = ""Text2 = "": Text3 = "": Text4 = "":Text5 = "": Text6 = "": Text7 = "": Text12 = ""Text8 = "": Text9 = "": Text10 = "": Text11 = ""Text13 = "": Text14 = "": Text15 = "": Text16 = ""'Load frmMaincolvb = vbBlackxx = 100yy = 150txt = "℃"wp = xp(colvb, xx, yy, txt)xx = 200yy = 350txt = "50"wp = xp(colvb, xx, yy, txt)xx = 200yy = 1850wp = xp(colvb, xx, yy, txt) yy = 3350xx = 200txt = "30"wp = xp(colvb, xx, yy, txt) xx = 200yy = 4850txt = "20"wp = xp(colvb, xx, yy, txt) xx = 200yy = 6350txt = "10"wp = xp(colvb, xx, yy, txt) 'Time坐标colvb = vbRedyy = 6500xx = 400txt = "0"wp = xp(colvb, xx, yy, txt) xx = 1480txt = "5"wp = xp(colvb, xx, yy, txt) xx = 2560txt = "10"wp = xp(colvb, xx, yy, txt) xx = 3640txt = "15"wp = xp(colvb, xx, yy, txt) xx = 4720txt = "20"wp = xp(colvb, xx, yy, txt) xx = 5800txt = "25 min"wp = xp(colvb, xx, yy, txt) xx = 6880txt = "30"wp = xp(colvb, xx, yy, txt) xx = 7960txt = "35"wp = xp(colvb, xx, yy, txt) xx = 9040txt = "40"wp = xp(colvb, xx, yy, txt)txt = "45"wp = xp(colvb, xx, yy, txt)xx = 11200txt = "50"wp = xp(colvb, xx, yy, txt)'画格Picture1.DrawWidth = 1 ' = dashPicture1.DrawStyle = 0Picture1.ForeColor = vbCyanFor i = 0 To 39Picture4.Line (450, 550 + i * 150)-(500, 550 + i * 150) NextPicture4.DrawStyle = 2For i = 0 To 8Picture4.Line (450, 400 + i * 750)-(11300, 400 + i * 750) NextFor i = 0 To 15Picture4.Line (450, 1000 + i * 300)-(500, 1000 + i * 300) NextFor i = 0 To 10Picture4.Line (500 + i * 1080, 400)-(500 + i * 1080, 6400) NextPicture4.DrawStyle = 0End Sub。

VB中串口通讯的实现

VB中串口通讯的实现

VB中串口通讯的实现在VB中实现串口通讯需要借助于SerialPort类,该类提供了一系列方法和属性用于串口的配置和通讯操作。

接下来,定义一个SerialPort对象和一个字节数组,用于接收和发送数据。

在窗体加载事件中初始化SerialPort对象,并设置串口的一些属性,如波特率、数据位、校验位等,根据实际需求进行配置。

还可以设置数据接收和发送的事件处理函数。

例如,下面的代码演示了如何配置串口:```vbImports System.IO.PortsPublic Class Form1Dim serialPort As New SerialPortDim receiveBuffer(255) As BytePrivate Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load'配置串口属性serialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.DataBits = 8serialPort.Parity = Parity.NoneserialPort.StopBits = StopBits.One'数据接收事件处理函数AddHandler serialPort.DataReceived, AddressOfSerialPort_DataReceived'打开串口serialPort.OpenEnd SubPrivate Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)'接收数据Dim bytesToRead As Integer = serialPort.BytesToReadDim bytesRead As Integer = serialPort.Read(receiveBuffer, 0, bytesToRead)'处理接收到的数据If bytesRead > 0 ThenDim receivedData As String =Encoding.ASCII.GetString(receiveBuffer, 0, bytesRead) '显示接收到的数据UpdateReceivedData(receivedData)End IfEnd SubPrivate Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click'发送数据Dim sendData As String = txtSendData.TextDim sendBuffer As Byte( = Encoding.ASCII.GetBytes(sendData) serialPort.Write(sendBuffer, 0, sendBuffer.Length)'清空发送框txtSendData.Text = ""End SubPrivate Sub UpdateReceivedData(data As String)'更新接收数据的显示If Me.InvokeRequired Then ' 跨线程调用控件Me.Invoke(Sub( UpdateReceivedData(data))ElselblReceivedData.Text = dataEnd IfEnd SubEnd Class```在上述代码中,我们主要关注Form1_Load事件处理函数和btnSend_Click事件处理函数。

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位数据的十六进制发送和接收,有端口,波特率等设置。

Visual Basic串口通信程序设计实例

Visual Basic串口通信程序设计实例

第6章Visual Basic串口通信程序设计典型实例利用Visual Basic开发串口通信程序既可以使用MSComm控件也可以调用Windows API 函数。

不过,只要MSComm可以被选用,它几乎总是我们推荐的选择,因为MSComm的功能和API调用一样好甚至比它还好且使用起来更加简单。

在本章提供的串口通信程序设计中,除了PC机与PC机串口通信外,PC机与单片机、PC机与智能仪表、PC机与PLC、PC机与GSM短信模块等串口通信任务的实现均采用MSComm控件。

6.1 PC机与PC机串口通信程序设计当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需三根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。

本设计通过两台PC机串口三线连接,介绍了利用API函数和MSComm控件设计串口通信程序的方法,包括字符与文件的发送与接收。

6.1.1 设计目的1)掌握PC机与PC机串口通信的线路连接方法。

2)利用MSComm控件和VB-API函数实现PC机与PC机串口通信的程序设计方法。

6.1.2 设计用软、硬件本设计用到的硬件和软件清单见表6-1。

6.1.3 硬件线路线路说明:在计算机通电前,按图6-1所示将2台PC机通过串口线连接起来:PC机A 串口COM1端口的TXD与PC机B串口COM1端口的RXD相连;PC机A串口COM1端口的RXD与PC机B串口COM1端口的TXD相连;PC机A串口COM1端口的GND与PC机B串口COM1端口的GND相连。

6.1.4 设计任务利用MSComm控件和Visual Basic API函数编写程序实现PC机与PC机串口通信。

图6-1 PC机与PC机串口通信线路任务要求:两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123”,单击“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,单击“发送字符”命令,信息返回到第一组的计算机。

7 串口通讯实例程序(VB)

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串口通信源程序[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 NET串口通信例子--我的回忆录

VB NET串口通信例子--我的回忆录

这是我3年前的一个例子,最近翻出来回忆一下。

串口是计算机上一种非常通用设备通信的协议。

大多数计算机包含两个基于RS232的串口,现在配电脑好像只有一个。

串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。

同时,串口通信协议也可以用于获取远程采集设备的数据。

串口通信在工控领域用途很广。

串口通信的概念非常简单,串口按位(bit)发送和接收字节。

尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

它很简单并且能够实现远距离通信。

比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

典型地,串口用于ASCII码字符的传输。

通信使用3根线完成:(1)地线,(2)发送,(3)接收。

由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。

其他线用于握手,但是不是必须的。

串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。

对于两个进行通行的端口,这些参数必须匹配: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位数据。

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

VB串口通讯实例

VB串口通讯实例

VB串口通讯实例作者:liwenzhao高精度电压表(24bit) VB源程序Dim PortValue As Integer '端口号选择1-4Dim value As Double '当前一次取值Dim value2 As Double '要显示的值Dim valueSum As Double '和Dim numCount As Double '算平均值是的计数个数Dim func As Integer '功能号标志1-4Dim valueFlag As IntegerPrivate Sub Check1_Click()'自动刷新被选中则刷新按钮无效If Check1.value ThenCommand1.Enabled = FalseElseCommand1.Enabled = TrueCommand1.SetFocusEnd IfEnd SubPrivate Sub Command1_Click()'显示Call displayEnd SubPrivate Sub Command2_Click()valueSum = 0 '清计数和numCount = 1 '清计数个数Label6.Caption = Str(numCount - 1) '显示复位value = 0value2 = 0valueFlag = 0Call displayEnd SubPrivate Sub Form_Activate()numCount = 1value = 0valueSum = 0PortValue = 1Text1.Visible = FalseLabel6.Caption = "0"Option1(0).value = TrueOption2(0).value = TrueCommand1.SetFocusLabel1.Caption = Format(value2, "0.000,000") For i = 0 To 3If Option2(i).value = True Thenfunc = i + 1End IfNext iCheck1.value = 1'Call ComPortOpenEnd SubPublic Sub ComPortOpen() '开串口With MSComm1.CommPort = PortValue '使用COM1.Settings = "9600,N,8,1" '设置通信口参数.InBufferSize = 40'设置MSComm1接收缓冲区为40字节'.OutBufferSize = 2'设置MSComm1发送缓冲区为2字节.InputMode = comInputModeBinary'设置接收数据模式为二进制形式.InputLen = 1'设置Input 一次从接收缓冲读取字节数为1'.SThreshold = 1'设置Output 一次从发送缓冲读取字节数为1.InBufferCount = 0 '清除接收缓冲区'.OutBufferCount = 0 '清除发送缓冲区'MaxW = -99'最大值赋初值'MinW = 99 '最小值赋初值'w = 0'数据个数计数器清零.RThreshold = 1On Error Resume Next'设置接收一个字节产生OnComm事件If .PortOpen = False Then'判断通信口是否打开.PortOpen = True '打开通信口If Err Then '错误处理msg = MsgBox(" 串口COM" & PortValue & " 无效!", vbOKOnly, "警告")Exit SubEnd IfEnd IfEnd With'MsgBox "端口已打开"End SubPublic Sub ComPortClose() '关串口MSComm1.PortOpen = False' MsgBox "端口已关闭"End SubPrivate Sub MSComm1_OnComm()Call reciveEnd SubPrivate Sub Option1_Click(Index As Integer)If MSComm1.PortOpen = True ThenCall ComPortCloseEnd IfPortValue = Index + 1Call ComPortOpenEnd SubPrivate Sub recive() '检测起始位并接收数据Dim Buffer As VariantDim Arr() As ByteDim inData(5) As ByteDim count As IntegerDim temp As Byte' MsgBox "OnComm"With MSComm1Select Case .CommEvent'判断MSComm1通信事件Case comEvReceive'收到Rthreshold个字节产生的接收事件Buffer = .InputArr = Buffer'读取一个接收字节' Text1.Text = Arr(0)If Arr(0) = &H1B Then.RThreshold = 0DoDoEventsLoop Until .InBufferCount >= 4For i = 1 To 4'count = .InBufferCountBuffer = .InputArr = BufferinData(i) = Arr(0)Next iIf inData(4) = &HA ThenIf (inData(1) Mod 64) >= 32 Then.RThreshold = 1Exit SubEnd IfvalueFlag = 1'0.000003814697265625temp = inData(1) Mod 16If temp <= 7 Thenvalue = inData(1) Mod 8value = value * 256 * 256value = value + Val(inData(2)) * 256 value = value + Val(inData(3))value = value * 3.814697265625E-06'Text1.Text = Format(value, "0.000,000") Elsevalue = inData(1) Mod 8value = value * 256 * 256value = value + Val(inData(2)) * 256 value = value + Val(inData(3))value = value * 3.814697265625E-06 value = 0 - valueEnd Iftemp = inData(1) Mod 128' test OFIf temp >= 64 ThenIf value < 0 Thenvalue = value - 0.000004Elsevalue = value + 0.000004End IfEnd If'检测自动刷新If Check1.value Then'valueFlag = 1Call displayEnd IfElse.RThreshold = 1Exit SubEnd If.InBufferCount = 0.RThreshold = 1End IfCase ElseEnd SelectEnd With'Text1.Text = Text1.Text + 1End SubPrivate Sub Option2_Click(Index As Integer) func = Index + 1End SubPublic Sub display() '判断功能并显示'功能选择Select Case funcCase 1 '当前值value2 = valueCase 2 '平均值If numCount > 100000 ThennumCount = 1valueSum = 0End IfIf valueFlag = 1 ThenvalueSum = valueSum + valuevalue2 = valueSum / numCountnumCount = numCount + 1valueFlag = 0Label6.Caption = Str(numCount - 1)End IfCase 3 '最大值If value > value2 Thenvalue2 = valueEnd IfCase 4 '最小值If value < value2 Thenvalue2 = valueEnd IfCase ElseEnd Select'Text1.Text = Str(valueSum)Label1.Caption = Format(value2, "0.000,000")End SubPrivate Sub Timer1_Timer()'清缓冲区' Text1.Text = MSComm1.InBufferCount If MSComm1.InBufferCount >= 80 ThenMSComm1.InBufferCount = 0End IfEnd Sub。

VB实现串口通信,计算机网络实验

VB实现串口通信,计算机网络实验

工业计算机网络实验报告实验4:计算机网络实验——VB实现串口通信一、实验目的:(1)熟悉和掌握串口通信的基本概念;(2)进一步熟悉RS-232C串口通信标准;(3)熟悉和掌握串行通信控件MSComm及其应用。

二、实验任务:(1)学会使用虚拟串行驱动程序(VSPD)虚拟串口。

(2).学会使用串口调试助手。

(3)使用VB做一个串口通信程序,要求能实现数据的收发。

三、编程实现:代码:Option ExplicitDim FS As IntegerPrivate Sub cmdExit_Click()Comm1.PortOpen = FalseEndEnd SubPrivate Sub cmdReceive_Click()txtReceive = Comm1.InputEnd SubPrivate Sub cmdSend_Click()Comm1.Output = txtSend.TextEnd SubPrivate Sub Comm1_OnComm() 'Label4.Caption = Comm1.Input End SubPrivate Sub Form_Load() Comm1.PortOpen = TrueEnd SubPrivate Sub txtReceive_Change() 'Comm1.OutputEnd Sub运行安装VPSD:用VPSD创建虚拟的端口:创建端口3,4运行两个例程,端口号分别设置为3,4:端口号3:端口号4的例程接受消息:端口号4的例程发送消息:端口为3的例程读取消息:四:实验总结通过本次试验,发现了自己在动手能力和自学能力方面的不足,我也进一步发现了自己在动手能力和自学能力方面的不足,然对本实验所涉及到的东西也算是有了不少兴趣,感觉越来越有意思然对本实验所涉及到的东西也算是有了不少兴趣,同时也对rs232串口的发送和接收信息有了进一步的了解,串口的发送和接收信息有了进一步的了解。

VB控件MSComm串口通讯实例教程

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实现计算机串口通信实例

利用VB实现计算机串口通信实例

+,,+-.,
实践与经验
的是 (’ 对 !3<65 的串口通信方式,即通过采用 标准贺氏指令, 我们可以远程呼叫其他以拨号方式 上网的普通 (’ , 从而具有相当的实用价值。
?
图 . (’ 与 (’ 间通信程序界面
(’ 与单片机间通信实例
在工业测控领域, 我们常采用 (’ 对单片机的
通信方式。通常以 (’ 机作为上位机发送指令到单 片机, 由单片机来完成现场数据采集、 电路控制等 工作, 然后数据返回 (’ 机进行高级处理。由于普 通 的 %=+?+ 串 口 方 式 数 据 传 送 距 离 短 ( .T 米 左 右) , 如果经转换电路转换成 %=ULT 等其他串行方 式, 则传输距离可达 .,,, 米左右, 从而更加实用。 本例中, (’ 机上运行界面如图 + 所示的程序, 在发送数据栏中输入一个“ 之间的整数, 并 ,V+TT” 点击“ 发送” 按钮, 单片机将接收到这个数据并显示 该数据, 然后作除 + 处理, 结果再经串口返回到 (’ 机端。例如, 当发送数据 +UU 时, 单片机电路中数 码管上显示 +UU ,同时单片机对该数作除 + 处理, 得数 .++ 返送回 (’ 机。注意, 要通过 !=’355 控 件发送或接收二进制格式的数据,必须用 /:4@:;8 类型的变量对二进制 0W86 类型的变量进行转换。
从输入寄存器传回并移除字符, 即读端口。 E6F>=: 将一个字符串写入输出寄存器, 即写 ">=F>=: 端口。
%=N;C9N2@7:设置或传回引发 "6’233 事件中
接收事件的字符数,即引起接收事件的 “ 门槛阀 值” 。

vb串口通信

vb串口通信

正在为单片机做上位机程序。

单片机连续发FF030A00000B441703069C33C0AA这样的字符串(以FF开头,AA结束,固定长度)。

请问接收程序如何写?收到的数据:FF 1 1 0 0 A4 3A 8 4B 41 8C 3B 18 0 2A 0 0 0 34 0 AA FF 1 1 0 0 A4 3A 8 4B 41 8C 3B 18 0 2A 0 0 0 34 0 AA FF 1 1 0 0 A4 3A 8 4B 41 8C 3B 18 0 2A 0 0 0 34 0 AA FF 1 1 0 0 A4 3A 8 4B 41 8C 3B 18 0 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0 FF 1 4B 41 0 0开始的时候数据接收正常,但一会就变成上面这样了。

程序设置:Private Sub Form_Load()With MSComm1.CommPort = 1.Settings = "9600,N,8,1".InBufferSize = 1024 '原来为19.RThreshold = 1 '接收1字节触发oncomm事件.InputMode = comInputModeBinary.InputLen = 1 '输入长度为19.InBufferCount = 0 '清除接收缓冲区End With'打开端口If MSComm1.PortOpen = False ThenMSComm1.PortOpen = TrueIf Err ThenMsgBox (Err.Description)Exit SubEnd IfEnd IfEnd SubPrivate Sub MSComm1_OnComm()Dim S() As ByteDim SS(1024) As ByteStatic N As LongStatic T As VariantDim intInputLen As IntegerIf (mEvent = comEvReceive) ThenS = MSComm1.Input '只要有数据就收进来,哪怕只是一个T = TimerFor i = 0 To UBound(S)'一个数据包可能产生若干个oncomm事件If Check1.Value = 1 And Len(Text1.Text)> 2000 Then Text1.Text = ""Text1.Text = Text1.Text & Right(Hex(S(i)), 3) + " "SS(N + i) = S(i) '接收数据包缓存于SS()N = N + UBound(S)Next i' MSComm1.InBufferCount = 0End IfEnd Sub请各位高手指点If MSComm1.PortOpen Then MSComm1.PortOpen = FalsemPort = 1 '假定是用COM1口' 设定传输速率等,可依照您的需求更改MSComm1.Settings = "9600,N,8,1"MSComm1.PortOpen = True'---------初始化Modem-------------MSComm1.Output = "ATZ"MSComm1.Output = "AT&F"MSComm1.Output = "ATE0"MSComm1.Output = "ATM1"MSComm1.Output = "ATQ0"MSComm1.Output = "ATV0"'--------------------------拨号-------------MSComm1.Output ="ATDT163" '拨163'---------------------------接通后MSComm1.Output ="SDFJDKSJLKFA" '发送字符串'---------------------Private Sub MSComm1_OnComm() '用串口事件捕捉数据..If MSComm1.InBufferCount Then' 通讯埠中假如有资料的话, 则读取进来InStringB = InStringB & MSComm1.Input' 如果资料中有 Chr(13) 和 Chr(10) 的话, 则显示出来If InStr(InStringB, vbCrLf) Theninstring = instring & InStringBAddText Text3, InStringB, FalseInStringB = ""End IfEnd IfEND SUB'-------------------------挂断--------MSComm1.PortOpen = False '这个挂断方法不能适用所有MODEM,我正在研究...通用办法Top回复人: jessezappy(晶晶) ( ) 信誉:98 2002-01-25 02:05:50Z 得分:0?最后借你一篇文章看,作者不是我,里面的不一定都对..'-----------------------------------------------------------VB Mscomm控件应用江苏戚墅堰机车车辆厂设计处(213011) 李秉璋--------------------------------------------------------------------------------Visual Basic 6.0(以下简称VB) 是一种功能强大、简单易学的程序设计语言。

使用VB开发串口USB通信软件

使用VB开发串口USB通信软件

使用VB开发串口USB通信软件串口和USB通信软件是一种用于在计算机和外部设备之间进行数据传输的工具。

VB语言是一种适用于Windows平台的编程语言,可以使用VB 开发串口、USB通信软件。

串口通信是一种常见的数据传输方式,它通过计算机的串口(串行通信口)与外部设备进行连接。

在VB中,可以使用SerialPort类来实现串口通信。

下面是一个使用VB编写的串口通信软件的示例代码:```vbImports System.IO.PortsPrivate WithEvents SerialPort As New SerialPortPublic Sub New'设置串口参数SerialPort.PortName = "COM1"SerialPort.BaudRate = 9600SerialPort.Parity = Parity.NoneSerialPort.DataBits = 8SerialPort.StopBits = StopBits.OneEnd SubPublic Sub Open'打开串口SerialPort.OpenEnd SubPublic Sub Close'关闭串口SerialPort.CloseEnd SubPublic Sub WriteData(ByVal data As String)'向串口写入数据SerialPort.WriteLine(data)End SubPrivate Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) HandlesSerialPort.DataReceived'串口接收到数据时触发的事件Dim data As String = SerialPort.ReadLine'处理接收到的数据Console.WriteLine("Received data: " & data)End SubEnd Class```USB通信是另一种常用的数据传输方式,它通过计算机的USB接口与外部设备进行连接。

visualbasic串口通信及编程实例

visualbasic串口通信及编程实例

visualbasic串口通信及编程实例Visual Basic串口通信及编程实例在实际的工业控制、机器人控制、智能家居等领域中,使用串口通信是一种非常广泛的方式。

Visual Basic (VB) 是一种微软公司开发的高级编程语言,它不仅易于学习,而且拥有丰富的图形界面设计和数据处理功能。

在本篇文章中,我们将深入介绍如何使用VB实现串口通信。

1. 建立串口通信首先,我们需要在VB中创建一个新的窗口(Form),然后打开工具箱,从中拖拽出一个SerialPort(串口)控件。

在控件属性中,我们需要为其指定相关的参数,例如串口名称、波特率、数据位、停止位、校验位等。

通常情况下,这些参数需要根据硬件设备的配置来进行调整。

在VB中实现串口通信的核心部分是对于SerialPort控件的事件监控。

具体来讲,当SerialPort收到一个数据包时,它会触发一个DataReceived事件。

对于这个事件,我们可以在程序中编写回调函数进行处理。

例如:Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e AsSystem.IO.Ports.SerialDataReceivedEventArgs) HandlesSerialPort1.DataReceived'在这里实现对于数据包的解析和处理End Sub2. 数据读取和发送在SerialPort控件中,有几种方法可以实现数据的读取和发送。

下面我们将介绍其中两种方法:(1) ReadExisting这个方法可以从串口中读取所有现有的数据,例如:Dim data As String = SerialPort1.ReadExisting()(2) Write这个方法可以向串口发送数据,例如:SerialPort1.Write("Hello World")注意,这个函数只能发送字符串数据。

vb串口通信编程

vb串口通信编程

vb串口通信编程一、概述串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于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时,则输出寄存器将被清空。

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

V B串口通信程序设计典型实例利用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设计用软、硬件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相连。

图6-1 PC与PC串口通信线路6.1.4 设计任务利用MSComm控件和VB API函数编写程序实现PC与PC串口通信。

任务要求,两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123”,单击“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,单击“发送字符”命令,信息返回到第一组的计算机。

实际上就是编写一个简单的双机聊天程序。

6.1.5 任务实现6.1.5.1 利用MSComm控件实现字符型数据发送与接收1.建立新工程VB使用“工程”来管理每一个应用程序要使用的所有文件,每建立一个新程序,就要新建一个工程。

一个工程由窗体、标准模块、控件及应用所需的开发环境设置等组成。

运行VB程序,出现“新建工程”对话框,选择“标准EXE”,单击“打开”命令按钮,进入VB工程集成开发环境,窗体设计器中自动出现一个名为Form1的空白窗体。

2.程序界面设计向空白窗体添加各种控件,以完成预定的各种功能。

开始一个项目的设计时,VB的工具箱中会有许多默认的控件让设计者予以选用,这些原本就出现在工具箱中的控件是内置控件,它提供了一些基本的系统设计组件给设计者,但功能比较特别的控件就不会出现在其中,如用来设计串口通信功能的控件MSComm就不在其中。

(1)添加串口通信控件MSComm。

由于VB的串行通信组件并不会主动出现在工具箱里中,当我们需要MSComm控件时,首先要把它加入到工具箱中。

让MSComm控件出现在工具箱中的步骤如下。

选择“工程”菜单下的“部件…”子菜单,在弹出的“部件”对话框中,在“控件”选项卡属性中选中“Microsoft Comm Control 6.0”复选框,单击“确定”按钮后,在工具箱中就出现了一个形似“电话”的图标,它就是MSComm控件。

工具箱中有了MSComm控件,就可以选择MSComm控可以通过VB实现与串口设备的串口通信了。

由于每个使用的MSComm控件对应着一个串行端口,如图6-2 程序窗体界面果应用程序需要访问多个串行端口,必须添加多个MSComm控件。

(2)为了实现连续的自动接收,将工具箱中的Timer控件添加到程序窗体上。

(3)添加两个文本框控件:Text1 和Text2,用于输入要发送的字符和显示要接收的字符。

(4)添加两个标签控件:Label1和Label2,作为发送和接收字符区的标签。

(5)添加一个按钮控件:Command1执行发送字符命令。

程序设计界面如图6-2所示。

3.属性设置从属性窗口设置属性时,只需从对象列表框中选择待设置属性的对象,然后从属性列表的左列选择属性,最后在属性列表的右列中输入或选择新的属性值。

程序窗体、控件对象的主要属性设置如表6-2所示。

表6-2窗体、控件对象的主要属性设置控件类型主要属性功能Form (名称) = COMForm 窗体控件BorderStyle = 3 运行时窗体固定大小Caption = PC与PC串口通信窗体标题栏显示程序名称Label(名称) = Label1 标签控件Caption = 显示接收字符区:标签文本Label(名称) = Label2 标签控件Caption = 输入发送字符区:标签文本TextBox (名称) = Textsend 文本框控件MultiLine = True 允许多行显示ScrollBars = 2-Vertical 垂直滚动条可用TextBox (名称) = TextReceive 文本框控件MultiLine = True 允许多行显示ScrollBars = 2-Vertical 垂直滚动条可用CommandButton (名称) = Cmdsend 按钮控件Caption = 发送字符手动发送字符MSComm (名称) = MSComm1 串口通信控件其他属性在程序中设置Timer (名称) = Timer1 时钟控件Enabled = True 时钟初始可用Interval = 500 设置发送周期(ms)两台计算机中VB程序界面及属性设置应完全相同,尤其MSComm控件的InputMode和Settings 属性值应相同。

4.程序代码设计程序要实现自动发送或读取,在VB程序中有两个方式可以达到,一是查询方式,利用查询事件是否发生,当发生时,去执行默认的程序代码。

可以使用计时器控件(Timer),该控件属性中的Interval可以控制计时器被启动的时间间隔,当时间间隔一到,便会执行原先放在计时器中的程序代码。

下面是利用查询方式编写的PC与PC串口通信的参考程序,代码如下所示:' 串口初始化Private Sub Form_Load()mPort = 1 ' 设置通信端口号为COM1MSComm1.Settings = "9600,n,8,1" ' 设置串口1参数MSComm1.InputMode = 0 ' 接收文本型数据MSComm1.PortOpen = True ' 打开通信端口1End Sub' 把字符通过串口发送出去Private Sub Cmdsend_Click()If Textsend.Text = "" Thenpp = MsgBox("发送的数据不能为空!", 16)Exit SubEnd IfMSComm1.Output = Trim(Textsend.Text)For i = 1 To 20000000Next iEnd Sub' 通过时钟控制来自动接收字符Private Sub Timer1_Timer()Dim buf$buf = Trim(MSComm1.Input) '将缓冲区内的数据读入buf变量中If Len(buf) <> 0 Then ' 判断缓冲区内是否存在数据TextReceive.Text = TextReceive.Text + Chr(13) + Chr(10) + buf //回车换行End IfEnd Sub' 关闭通信端口,停止程序运行Private Sub Cmdquit_Click()MSComm1.PortOpen = FalseUnload MeEnd Sub在Windows系统环境下,串口是系统资源的一部分。

应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

在Windows系统的系统函数中,均包含了支持通信中断的功能。

二是使用事件方式。

MSComm控件提供事件回应功能,可以利用此功能达到自动发送/接收的目的。

下面是利用事件方式编写的PC与PC串口通信的参考程序,界面设计与图6-2基本相同,区别是事件方式不需要时间控件。

'串口初始化Private Sub Form_Load()mPort = 1 '设置通信端口号为COM1MSComm1.Settings = "9600,n,8,1" '设置串口参数MSComm1.InputMode = 0 '接收文本型数据MSComm1.RThreshold = 1 '接收缓冲区每收到一个字符都会使MSComm 控件触发OnComm 事件MSComm1.PortOpen = True '打开通信端口1End Sub'把字符通过串口发送出去'启动定时器Private Sub Cmdsend_Click()If Textsend.Text = "" Thenpp = MsgBox("发送的数据不能为空!", 16)Exit SubEnd IfMSComm1.Output = Trim(Textsend.Text)End Sub'MSComm 的OnComm 事件程序'由CommEvent 属性值的不同,将各自的程序代码写入相关的子程序中'只要RThresold 中的设定字符数到达时便会使得CommEvent 属性值变成comEvReceive'因此接收的子程序便会被执行Private Sub MSComm1_OnComm()Dim buf$Select Case mEvent'通过取代每一个case 表达式来处理每个事件与错误Case comEvCD ' CD 线的状态发生变化Case comEvCTS ' CTS 线的状态发生变化Case comEvDSR ' DSR 线的状态发生变化Case comEvReceivebuf = Trim(MSComm1.Input) '将缓冲区内的数据读入buf变量中Case comEvSendEnd SelectTextReceive.Text = TextReceive.Text & bufEnd Sub'停止程序运行Private Sub Cmdquit_Click()Unload MeEnd Sub'关闭通信端口,Private Sub Form_Unload(Cancel As Integer)MSComm1.PortOpen = FalseEnd Sub5.运行程序程序设计、调试完毕,单击工具栏快捷按钮“启动”,运行程序。

相关文档
最新文档