Visual Basic 串口通讯编程.docx
《Visual Basic 串口通讯编程.docx》由会员分享,可在线阅读,更多相关《Visual Basic 串口通讯编程.docx(8页珍藏版)》请在冰豆网上搜索。
VisualBasic串口通讯编程
VisualBasic串口通讯编程
2006-07-1907:
34
对于串行口的应用,相信大家多少知道一些,例如,它可以连接鼠标、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”选项按钮。
然后,在“串口发送”文本框中键入字符,即可分段显示在“串口接收”栏中,并进行计数。
每次回车均另起一段、计数一次,并将其段落号加在每一段的开头。