Professional Documents
Culture Documents
Visual Basic 串口通讯编程
Visual Basic 串口通讯编程
对于串行口的应用,相信大家多少知道一些,例如,它可以连
接鼠标、MODEM、数码相机、打印机,等等,可以做很多很多的事
情。但是,对于串行口的理论,可能了解一二有所剩无几了。什么是
串行口?它是如何工作的?为什么用串行口?您知道吗? 一、 关于
串行口 发明计算机的人,肯定注意到了一点,那就是计算机必须与
外界进行信息的交换,所以他们为计算机设计了外设口。要与显示器
与打印机相连,于是设计了打印口。那么,有没有用最少数量的线(线
多了麻烦多),就能与外界发生联系,并且能够成为通用的接口呢?
当然,这就是诞生于设计大师们手中的串......
对于串行口的应用,相信大家多少知道一些,例如,它可以
连接鼠标、MODEM、数码相机、打印机,等等,可以做很多很多的事
情。但是,对于串行口的理论,可能了解一二有所剩无几了。什么是
串行口?它是如何工作的?为什么用串行口?您知道吗?
一、 关于串行口
发明计算机的人,肯定注意到了一点,那就是计算机必须与
外界进行信息的交换,所以他们为计算机设计了外设口。要与显示器
多了麻烦多),就能与外界发生联系,并且能够成为通用的接口呢?
当然,这就是诞生于设计大师们手中的串行口。串行口所需要的线的
确很少,一根公共地线无论如何也得要,然后,一根发送数据的线和
一根接收数据的线,共三根线就行了。也许您还会问,“能不能再少
些呢?两根,一根,干脆一根都不要,成吗?”当然行,红外接口不
就是一根线都没有吗?也许当时搞无线通讯的天才就是像您这么想
的,不过这已经超出了今天我们讨论的范围。
既然是通讯,那么就必须有两台设备才行。常用的串行线是
怎样制作的呢?在计算机后边,您最少会看到一个串行口(笔记本电
脑通常为一个,台式计算机通常为二个)
,采用的是梯型 DB-9 或 DB-25
准备、载波检测、请求发送等联络信号(对这些信号线感兴趣的先生
/女士,可以查阅有关串行口的资料)。作为 VB 爱好者,您只要了解
串行口通讯,往往是一个发送,一个接收,所以在制作联接线时,一
头的发送必须与另一头的接收相连,地线与地线相连。对于硬件知识
较少的朋友,可以直接到电脑配套市场采购,不方便的话也可以请有
一定电子电路基础的亲朋好友帮忙。
我们经常听到有关波特率的词,
以“猫”为例,
有 14400bps、
28800bps、36600bps、56000bps,等等。波特率代表了串行口的数据
二、编程要求
相信许多网友都在网上聊过天,当您在一个输入框中键入一
些话时,这些话会传到聊天室的每一个人,同样,其他人的话您也会
看到。我们试着编制一段程序,实现这种功能。为适应不同速率设备
之间的连接,应当可以设定其连接速度;为避免设备冲突,应当允许
进行通讯端口的选择。另外,为拓宽用途,该程序对于接收的数据,
接时,您若想知道它们在发送或接收写什么的话,只要将拥有该程序
的计算机串口的接收数据线与通讯者的线相连,就可以监看其过程。
例如,您可以使用该程序监测计算机与调制解调器之间的通讯。
在我们调试程序时,很难做到一个人同时占用两台计算机。
为此,我们可以使用在计算机中随处可见的跳线,直接短接串口的 2、
接被本机接收。这样,就我们就可以在一台计算机上调试程序了。在
该种状态下,本程序还有另外一个用途,即您可以将之用于查找任何
字符的 ASCII 码。其实很多情况都是如此,软件或硬件本身提供的功
能或许有限,关键的问题是如何开动脑筋、灵活运用。
三、预备知识和技巧
1、串行通讯控件 Mscomm
调入 Mscomm 控件:在“项目”菜单中打开“部件”子菜单,
Mscomm 控件即加入到您的控件箱中.
设置串口参数。InputLen-从接收缓冲区读出的字符数。
InBufferSize、OutBufferSize-输入、输出缓冲区尺寸。
InBufferCount-输入缓冲区内的字符数。
常用方法:Output、Input-将发送数据发送出去和将接收数据读出。
常用事件:OnComm-无论串行口发生什么事,都会触发该事件。
2、字符处理函数
边两个字符再放回 s。
第二个数开始,取三个数放回 s。
Asc:返回第一个字符(包括汉字)的 Ascii 码。
Str:将一个数字变为字符形式
3、错误处理的应用
行出现错误,比如当打开串行口 1 时,该串口已被其它程序占用,程
序就会出现错误,如果开始时执行过上述语句,程序将跳过错误语句,
利用 Err 的值,我们可以判断一些与硬件相关的操作是否正确和有
效,以改变程序的进程。
四、界面
画出界面,控件上的字符是它们的名称。需要提请大家注意的是,串
口控件(即那个电话控件)在 VB 默认的控件栏中不存在,需要以下
述方式添加,在工程菜单->部件->控件选项卡中选中
相同的方式,希望大家记住,以后将不再重复。当不再需要该控件而
欲从控件栏中将其删除时,只需依上述步骤进入到控件选项卡,然后
取消对该控件的选中即可。
Text1 能显示多行文字外,其它各控件属性将在窗口调入时进行设置。
五、程序源代码
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
‘错误监视
MSComm1.PortOpen = True
‘打开串口
‘如果没有错误,串口 1 将被确认打开,否则打开串口 2
Option1.value = True
Else
Err = 0
MSComm1.CommPort = 2
MSComm1.PortOpen = True
‘打开串口 2,如果仍然有错误,则两个口都不能打开,这时应退出
程序。
Option2.value = True
End If
‘接收数据
aaa = False
‘下面的循环是死循环,程序不断的检测输入缓冲区内是否有接收到
的字符,如果有,即进行处理。
DoEvents
‘该语句使程序可以在此处响应其它事件。如果没有该语句,程序就
真成了死循环,一个运行的程序无法让其停止,是很可怕的。这是所
有程序编制人员时刻注意的问题,也可以算编程的规律之一。
Timer1.Enabled = False
‘关闭定时器
s = MSComm1.Input
‘取串行口数据
s1 = "": s2 = ""
If Option3 Then
JSStr = JSStr + s
Else
‘如果显示方式为 ASCii,则对每个字符进行转换
For i = 1 To Len(s)
的转换结果为“BFC6”
s2 = Right(s2, 2)
Else
‘字符取两位字符,汉字取两个两位字符
s1 = s1 + s2 + Space(1)
Next i
JSStr = JSStr + s1
End If
End If
Timer1.Enabled = True
‘定时器开始工作
Loop
End Sub
‘发送数据:当在发送文本框进行回车操作时,将文本内容送出。
If KeyAscii = 13 Then
‘13 为回车符
KeyAscii = 0
‘清按键,使本次按键失效
MSComm1.Output = Text2.Text
‘发送数据
Text2 = ""
End If
End Sub
KeyAscii = 0
Err = 0
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
‘滚动显示
Static js%
Dim i%, s$
js = js + 1
For i = 0 To 8
ss(i) = ss(i + 1)
Next i
For i = 1 To 9
s = s + ss(i)
Next i
JSStr = ""
End If
End Sub
六、执行程序
两个计算机连接完毕(或短接 2、3 脚),均执行该程序,显示初始
界面,提示目前默认工作的端口号。单击确定按钮,然后对波特率、
奇偶校验、数据位、停止位进行必要的设置,如果您使用过 Modem,
这当然是小菜一碟,如果您不太熟悉也没有关系,只需简单地将波特
率修改一下即可。然后选择欲使用的端口,默认值为 COM1,如果不
接收方显示您键入的字符,则选中“文本”选项按钮,若欲显示其
ASCII 码,则必须选中“ASCII”选项按钮。然后,在“串口发送”
文本框中键入字符,即可分段显示在“串口接收”栏中,并进行计数。
每次回车均另起一段、计数一次,并将其段落号加在每一段的开头。