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:数据)将接到的数据赋值于全局变量,通过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中实现串口通讯需要借助于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串口通信(附图教程)

界面如下:代码如下: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串口通信程序设计实例

第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)

第七篇串口通讯实例程序(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]](https://img.taocdn.com/s3/m/1d28186da45177232f60a202.png)
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串口通信例子--我的回忆录

这是我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位数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.运行程序程序设计、调试完毕,单击工具栏快捷按钮“启动”,运行程序。