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