基于串行通信的智能家居上位机设计
是程序进行正常通信的保证,下面介绍几个必须熟悉的属性。
CommPort:设置并返回通讯端口号。
SetTIngs:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen:设置并返回通讯端口的状态,也可以打开和关闭端口。
Input:从接收缓冲区返回和删除字符。
InputMode:接收模式,取O值时,接收文本数据;取1时,接收二进制数据。
Output:向传输缓冲区写一个字符串。
Rthrehold:响应模式,取整数。当接收字符后,若Rthrehold属性设置为O,则不产生OnComm事件;若设置为1,则接收缓冲区收到每一个字符都会使MSComm控件产生OnComm事件。
Sthreshold:发送模式,设置O(缺省值),数据传输事件不会产生OnComm事件;设置为1,当传输缓冲区完全空时,MSComm控件产生OnComm事件。如果在传输缓冲区中的字符数小于value,CommEvent属性设置为comEvSend,并产生OnComm事件。
Handshake:通信握手模式,取值为O时,无握手;取值为1时,表示XOn/Xoff握手;取值为2时,表示Request-to\-send/clear-to-send握手;取值为3时,表示eqLlest-to-send&clear-to-send握手皆可。
3.2.2MSComm控件两种处理通讯的方式
MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
(1)事件驱动方式
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者CarrierDetect(CD)或RequestToSend(RTS)线上一个字符到达或一个变化发生时。在这些情况下,可以利用MSComm控件的OnComm事件捕获并处理这些通讯事件。OnComm事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅CommEvent属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。
(2)查询方式
查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查CommEvent属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为惟一等待接收的字符是调制解调器的"确定"响应。
3.3计算机信息发送和接收的实现
下面以智能照明系统中PC机与主控器的通信,说明计算机与单片机通信的实现方法。以下是实现的主要子程序。
页面装载程序:
通信建立后,计算机就可以与下端单片机通过设定的协议进行通信,可以测试下端模块的响应。
4MSComm控件的问题和解决办法
在实际应用中,MSComm控件对于一问一答式的通信,效果还是可以的,所以用于单模块的通信测试问题不大。但是,如果计算机作为单片系统的一个角色,要实时捕获总线上的信息并响应,存在失帧和误帧的问题,如果系统要求不高,还可以对付,而象智能照明这样要求信息持续、实时、准确的系统,利用MSComm控件处理串口通信就难以胜任了。
在智能照明系统中,采用了自编制的动态库Transdata,dll程序,作为处理串口通信的接口,误帧率和失帧率较低,能满足产品化的要求。
Transdata.dll使用说明:
(1)初始化串口并处于通讯状态<函数>
Init_OpenCom(byvalm_strasstring,byvalnbaudasInteger)asBoolean
参数说明:m_str为串口名称,如"coml""com2"等;nbaud为波特率,可为1200,2400,4800,9600等;返回值为Boolean,若为true则成功,否则失败false。
(2)关闭串口结束通讯<过程>
CloseCom()
(3)发送通讯数据<过程>
SendData(n_strasbyte,byvalncountasInteger)
参数说明:n_str为要发送byte的数组的第一个字节;如要发dimndata(11)asbyte这个数组,只需用ndata(0)作为n_str参数即可;nc-ount为要发送的字节数。
(4)接收返回的数据<函数>
GetData(byvalm_strasstring)asstring
参数说明:m_str必须为已有能容纳所要接收字串的长度空间返回接收到的字串,各个字节以"\t"隔开。
5结语
利用MSComm控件虽然可以方便快捷编制出的上位机程序,但其通信效率偏低,误帧和失帧率较高,只适用于单模块测试。对于多模块实时通信系统,宜采用其他控件或自编制更有效的收发程序。
- 单片机与PC机串行通信的实现方法 (02-25)
- 在VC++中用ActiveX控件实现与单片机的串行通信(07-31)
- 基于Small RTOS51的多任务串行通信研究(06-13)
- I2C总线多主通信研究与软件设计(07-05)
- 基于MC9S12NE64的远程故障诊断系统的设计(02-23)
- PIC单片机与触摸屏串行通信的MODBUS协议实现(08-05)