Visual Basic 串口通讯编程

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 15

Visual Basic 串口通讯编程

对于串行口的应用,相信大家多少知道一些,例如,它可以连

接鼠标、MODEM、数码相机、打印机,等等,可以做很多很多的事

情。但是,对于串行口的理论,可能了解一二有所剩无几了。什么是

串行口?它是如何工作的?为什么用串行口?您知道吗? 一、 关于

串行口 发明计算机的人,肯定注意到了一点,那就是计算机必须与

外界进行信息的交换,所以他们为计算机设计了外设口。要与显示器

相连,于是设计了显示口;要与硬盘相连,于是设计了 IDE 口;要

与打印机相连,于是设计了打印口。那么,有没有用最少数量的线(线

多了麻烦多),就能与外界发生联系,并且能够成为通用的接口呢?

当然,这就是诞生于设计大师们手中的串......

对于串行口的应用,相信大家多少知道一些,例如,它可以

连接鼠标、MODEM、数码相机、打印机,等等,可以做很多很多的事

情。但是,对于串行口的理论,可能了解一二有所剩无几了。什么是

串行口?它是如何工作的?为什么用串行口?您知道吗?

一、 关于串行口

发明计算机的人,肯定注意到了一点,那就是计算机必须与

外界进行信息的交换,所以他们为计算机设计了外设口。要与显示器

相连,于是设计了显示口;要与硬盘相连,于是设计了 IDE 口;要与


打印机相连,于是设计了打印口。那么,有没有用最少数量的线(线

多了麻烦多),就能与外界发生联系,并且能够成为通用的接口呢?

当然,这就是诞生于设计大师们手中的串行口。串行口所需要的线的

确很少,一根公共地线无论如何也得要,然后,一根发送数据的线和

一根接收数据的线,共三根线就行了。也许您还会问,“能不能再少

些呢?两根,一根,干脆一根都不要,成吗?”当然行,红外接口不

就是一根线都没有吗?也许当时搞无线通讯的天才就是像您这么想

的,不过这已经超出了今天我们讨论的范围。

既然是通讯,那么就必须有两台设备才行。常用的串行线是

怎样制作的呢?在计算机后边,您最少会看到一个串行口(笔记本电

脑通常为一个,台式计算机通常为二个)
,采用的是梯型 DB-9 或 DB-25

插座,即采用 9 根线或 25 根线的插座,这是因为有的外设需要像数据

准备、载波检测、请求发送等联络信号(对这些信号线感兴趣的先生

/女士,可以查阅有关串行口的资料)。作为 VB 爱好者,您只要了解

其中的三根线就可以了。这三根线分别是发送数据 TXD、接收数据 RXD

和信号地 SG,对于 DB-9 既九芯串行口插口来说,它们对应于 3、2、

5;对于 25 芯串行口插口,则对应于 2、3、7。千万别搞错呀!因为

串行口通讯,往往是一个发送,一个接收,所以在制作联接线时,一

头的发送必须与另一头的接收相连,地线与地线相连。对于硬件知识

较少的朋友,可以直接到电脑配套市场采购,不方便的话也可以请有

一定电子电路基础的亲朋好友帮忙。
我们经常听到有关波特率的词,
以“猫”为例,
有 14400bps、

28800bps、36600bps、56000bps,等等。波特率代表了串行口的数据

传输速度。例如:9600 代表每秒传输约 9600 个数据位,它代表约 1000

个(1k)英文字符(每个字符占 8 位,1 个开始位,1 个停止位)。

要传输 100k 的文件,就需要 100 秒。

二、编程要求

相信许多网友都在网上聊过天,当您在一个输入框中键入一

些话时,这些话会传到聊天室的每一个人,同样,其他人的话您也会

看到。我们试着编制一段程序,实现这种功能。为适应不同速率设备

之间的连接,应当可以设定其连接速度;为避免设备冲突,应当允许

进行通讯端口的选择。另外,为拓宽用途,该程序对于接收的数据,

最好还能提供 ASCII 码显示。这样,当有两台用串口相连的设备相连

接时,您若想知道它们在发送或接收写什么的话,只要将拥有该程序

的计算机串口的接收数据线与通讯者的线相连,就可以监看其过程。

例如,您可以使用该程序监测计算机与调制解调器之间的通讯。

在我们调试程序时,很难做到一个人同时占用两台计算机。

为此,我们可以使用在计算机中随处可见的跳线,直接短接串口的 2、

3 两个脚,即将串行口的 2、3 脚连接在一起,从而使发送的数据直

接被本机接收。这样,就我们就可以在一台计算机上调试程序了。在

该种状态下,本程序还有另外一个用途,即您可以将之用于查找任何
字符的 ASCII 码。其实很多情况都是如此,软件或硬件本身提供的功

能或许有限,关键的问题是如何开动脑筋、灵活运用。

三、预备知识和技巧

1、串行通讯控件 Mscomm

调入 Mscomm 控件:在“项目”菜单中打开“部件”子菜单,

在部件选择对话框中选择 “Microsoft comm Control 5.0”,

Mscomm 控件即加入到您的控件箱中.

常用属性:Commport-通讯端口号,如串口 1、串口 2。Setting-返回或

设置串口参数。InputLen-从接收缓冲区读出的字符数。

InBufferSize、OutBufferSize-输入、输出缓冲区尺寸。

InBufferCount-输入缓冲区内的字符数。

常用方法:Output、Input-将发送数据发送出去和将接收数据读出。

常用事件:OnComm-无论串行口发生什么事,都会触发该事件。

2、字符处理函数

Left:取字符串的左边 n 个字符。例如:s=Left(s,2) 即为取 s 的左

边两个字符再放回 s。

Right:与 Left 类似,取字符右边 n 个字符。


Mid:从第 m 个数开始,取 n 个数。例如:s=Mid(s,2,3)即为从 s 的

第二个数开始,取三个数放回 s。

Asc:返回第一个字符(包括汉字)的 Ascii 码。

Str:将一个数字变为字符形式

Hex:返回 Ascii 码的 16 进制数

3、错误处理的应用

我们在程序中加入这样一条语句:On Error Resume Next。当程序运

行出现错误,比如当打开串行口 1 时,该串口已被其它程序占用,程

序就会出现错误,如果开始时执行过上述语句,程序将跳过错误语句,

接着往下执行。同时,VB 置 Err 标志有效。

利用 Err 的值,我们可以判断一些与硬件相关的操作是否正确和有

效,以改变程序的进程。

四、界面

画出界面,控件上的字符是它们的名称。需要提请大家注意的是,串

口控件(即那个电话控件)在 VB 默认的控件栏中不存在,需要以下

述方式添加,在工程菜单->部件->控件选项卡中选中

Microsoft Comm Control 5.0 复选框,其它备用控件的添加也采用

相同的方式,希望大家记住,以后将不再重复。当不再需要该控件而
欲从控件栏中将其删除时,只需依上述步骤进入到控件选项卡,然后

取消对该控件的选中即可。

除 Text1 在设计时将多行显示使能属性 Multiline 设为 True,以使

Text1 能显示多行文字外,其它各控件属性将在窗口调入时进行设置。

五、程序源代码

Private Sub Form_Load()

Me.Show

'初始化,为各控件的相关属性赋值

Label1.Caption = "串口接收"

Label2.Caption = "串口发送"

Label3.Caption = "串口设置‘波特率,奇偶校验,数据位,停止

位’"

Text3.Text = "9600,n,8,1"

Text1.Text = ""

Text2.Text = ""

Text2.SetFocus
Frame1.Caption = "串口选择"

Option1.Caption = "COM1"

Option2.Caption = "COM2"

Frame2.Caption = "显示方式"

Option3.Caption = "文本"

Option3.value = True

Option4.Caption = "ASCii"

Command1.Caption = "清除接收"

Command2.Caption = "退出"

OldSet = Text3.Text

'打开串口

MSComm1.CommPort = 1

‘将通讯口设为 COM1

On Error Resume Next

‘错误监视
MSComm1.PortOpen = True

‘打开串口

‘如果没有错误,串口 1 将被确认打开,否则打开串口 2

If Not Err Then

MsgBox "COM1 口工作"

Option1.value = True

Else

Err = 0

MSComm1.CommPort = 2

MSComm1.PortOpen = True

‘打开串口 2,如果仍然有错误,则两个口都不能打开,这时应退出

程序。

If Err Then MsgBox "COM1、COM2 都不能打开,程序终止": End

MsgBox "COM2 口工作"

Option2.value = True
End If

‘接收数据

Dim aaa, i%, s$, s1$, s2$

aaa = False

‘下面的循环是死循环,程序不断的检测输入缓冲区内是否有接收到

的字符,如果有,即进行处理。

Do While aaa = False

DoEvents

‘该语句使程序可以在此处响应其它事件。如果没有该语句,程序就

真成了死循环,一个运行的程序无法让其停止,是很可怕的。这是所

有程序编制人员时刻注意的问题,也可以算编程的规律之一。

If MSComm1.InBufferCount > 0 Then

Timer1.Enabled = False

‘关闭定时器

s = MSComm1.Input

‘取串行口数据
s1 = "": s2 = ""

If Option3 Then

‘如果显示方式为文本,则将接收到的字符串累加到 JSStr 变量中

JSStr = JSStr + s

Else

‘如果显示方式为 ASCii,则对每个字符进行转换

For i = 1 To Len(s)

s2 = Right("0000" + Hex(Asc(Mid(s, i, 1))), 4)

‘取出第 i 个字符,转换成 ASCii 码,再转换成 16 进制,并整理成

四位字符。例如数字 1 的 ASCii 码为 31,则转换成 0031,汉字“科”

的转换结果为“BFC6”

If Left(s2, 2) = "00" Then

s2 = Right(s2, 2)

Else

s2 = Left(s2, 2) + Space(1) + Right(s2, 2)


End If

‘字符取两位字符,汉字取两个两位字符

s1 = s1 + s2 + Space(1)

Next i

JSStr = JSStr + s1

End If

End If

Timer1.Enabled = True

‘定时器开始工作

Loop

End Sub

‘发送数据:当在发送文本框进行回车操作时,将文本内容送出。

Private Sub Text2_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then
‘13 为回车符

KeyAscii = 0

‘清按键,使本次按键失效

MSComm1.Output = Text2.Text

‘发送数据

Text2 = ""

End If

End Sub

‘修改参数,通过修改 Text3 的内容,可以修改波特率等参数

Private Sub Text3_KeyPress(KeyAscii As Integer)

If KeyAscii <> 13 Then Exit Sub

KeyAscii = 0

Err = 0

On Error Resume Next

MSComm1.PortOpen = False
MSComm1.Settings = Text3.Text

MSComm1.PortOpen = True

If Err Then

Err = 0

MSComm1.PortOpen = False

MSComm1.Settings = OldSet

MSComm1.PortOpen = True

Text3 = OldSet

End If

OldSet = Text3.Text

On Error GoTo 0

End Sub

‘滚动显示

Private Sub Timer1_Timer()

Static js%
Dim i%, s$

If JSStr <> "" Then

js = js + 1

For i = 0 To 8

ss(i) = ss(i + 1)

Next i

ss(9) = Chr(13) + Chr(10) + Trim(Str(js)) + ":\" + JSStr

For i = 1 To 9

s = s + ss(i)

Next i

Text1.Text = Right(s, Len(s) - 2)

JSStr = ""

End If

End Sub

六、执行程序
两个计算机连接完毕(或短接 2、3 脚),均执行该程序,显示初始

界面,提示目前默认工作的端口号。单击确定按钮,然后对波特率、

奇偶校验、数据位、停止位进行必要的设置,如果您使用过 Modem,

这当然是小菜一碟,如果您不太熟悉也没有关系,只需简单地将波特

率修改一下即可。然后选择欲使用的端口,默认值为 COM1,如果不

巧该端口正在被其它设备所占用,可选择 COM2 进行通讯。如果欲在

接收方显示您键入的字符,则选中“文本”选项按钮,若欲显示其

ASCII 码,则必须选中“ASCII”选项按钮。然后,在“串口发送”

文本框中键入字符,即可分段显示在“串口接收”栏中,并进行计数。

每次回车均另起一段、计数一次,并将其段落号加在每一段的开头。

You might also like