前言:VB串口通信的方法一般有两种:一是通过Windows的通信API进行通信;另一种是通过VB的标准控件MSComm来实现。这篇文章要讲的是上位机如何通过VB的串口控件MSComm和下位机进行串口通信的过程。 以下是给VB初学者推荐的两本书籍:
《Visual+Basic+6.0基础教程》《Visual_Basic与RS-232串行通信控制》其中,《Visual+Basic+6.0基础教程》中主要讲解了VB6.0的基本语法和操作,而《Visual_Basic与RS-232串行通信控制》详细的讲解了VB串口通信的操作,虽然我们现在大多数用的是USB接口,但本书还是提供了非常不错的实例,便于我们触类旁通。下面的串口通信基础教程是建立于读者已经具备初级VB语法知识和操作的假设之上。
鉴于上面推荐的《Visual_Basic与RS-232串行通信控制》一书中很详细的讲解了关于使用MSComm控件进行串口通信的各种实例,这里就挑一些基础的操作进行分析,笔者更倾向于把《Visual_Basic与RS-232串行通信控制》当作一本手册用于随时查询。 1.添加MSComm控件 VB精简版找不到串口控件,VB完整版可以。所以在安装完VB完整版后,打开->新建标准EXE工程,点击 工程->部件->MicroSoft Comm Control 6.0 (SP6),就可以看见同老式电话座机一样的串口控件出现在工具箱中。
2.关于MSComm控件的属性 该控件的属性有很多,这里只介绍最基础的常用属性。
CommPort属性: 用于设置或者返回通信连接端口号码,该控件仅限于16个端口,从1开始递增,值为1~16。
Settings属性: 以字符串的形式设置初始化参数,格式为"BBBB,P,D,S",其中BBBB表示联机速率,P表示奇偶校验位检查方式,D表示数据位数,S表示停止位数,默认是"9600,N,8,1"。 例如:MSComm1.settings = “9600,N,8,1”。
PortOpen属性: 用于返回或设置通信端口连接状态,值为True和False。在使用串口前,必须先打开该端口,不然会报错;在串口使用完毕后,必须关闭该串口,不然等到VB程序窗口关闭结束时,会将端口一起关闭。
InputMode属性: 用于设置和返回Input取回的数据类型,可设置的数值是ComInputModeText(值:0,以字符方式从缓冲区中读入数据),ComInputModeBinary(值:1,以字节方式从缓冲区读入数据)。 例如:MSComm1.InputMode = 1,表示以二进制字节方式读入数据。
Input属性: 用于从缓冲区读取对方输入的数据,读取成功后,从缓冲区删除已经成功读取的数据。 例如:Buffer = MSComm1.Input 。
Output属性: 将要发送的数据送入发送缓冲区,一般的数据均是在被送到缓冲区后立即送出,当控件设有发送阈值属性(SThreshold)时,会生成事件。
RThreshold属性: 用于设置引发接收事件的字符数,当接收缓冲区达到所设置的接收事件时,会引发OnComm事件中的接收事件。此属性默认值为0,意思时此时无论缓冲区中有多少字符都不触发事件。所以想要触发接收事件时,必须改动它的默认值。例如:MSComm1.RThreshold = 20 。
SThreshold属性: 该属性默认值为0,此时数据传输事件不会发生OnComm中的数据传输事件,如果在传输缓冲区的字符数少于该数值时,会产生OnComm的发送事件。 例如:MSComm1.SThreshold = 20 ,当缓冲区的字符数为19时,CommEvent属性会被设置为comEvSend,触发OnComm事件。
InBufferCount属性:用于返回在接收缓冲区中的字符数,该属性在设计阶段无法使用,在运行阶段可以把它设为0来清空接收缓冲区。 例如:Count = MSComm1.InBufferCount ,返缓冲区的已接收到的字符数。
CommEvent属性: 在通信错误或者事件发生时都会生成OnComm事件,CommEvent存有该错误或者事件的数值码。 下面展示了两个常用的通信事件常数码: ComEvSend: 1 传输缓冲区的字符数比SThreshold少 ComEvReceive : 2 缓冲区中接受到RThreshold个数字符,该事件将持续生成直到用Input属性从接收缓冲区中删除数据。 (注:这里其实还有一个Handshaking属性,用于指定双方的握手协议,实现流量管制,但笔者做的实验是上位机PC和下位机MCU之间,按照自己预设的数据帧进行通信,不存在大量的突发数据传输,所以这是选择了它默认值没有握手协议,因此省略不提。)