基于C++Builder的PC机与单片机串口通信的实现

2012-10-20 08:35:54张利利李晓京胡文东
微型电脑应用 2012年9期
关键词:PC机下位通信协议

张利利,李晓京,胡文东,李 娅

0 引言

串行口是计算机与外部设备之间进行数据交换的重要介质,所以串行通信在工程中有着广泛的应用。这种通信的实现,经常要组成上位机为PC机而下位机为单片机的二级系统, 通过RS232 进行通信【1】。笔者结合某人体重心测试系统,详细介绍在C++ Builder中实现PC机与单片机串行通信的方法。

1 串行口通信

串行通信是指数据是一位一位按顺序传送的通信方式。它有两种基本的通信方式:异步通信和同步通信【2】。本系统采用的是异步通信,所以在此只对异步通信做简要介绍。

1.1 异步串行通信

异步串行通信时,每个字符作为一个独立的信息,可以随机出现在数据流中。为确保异步通信的正确性,必须找到一种方法,使通信双方在随机传送的字符内部实现同步。这种方法就是在字符格式中设置起始位和停止位,即在一个字符正式发送之前先发一个起始位,该字符结束时再发一个停止位。接收器检测到起始位便知道字符到达并开始接收字符,检测到停止位则知道字符传输已结束。由于这种通信协议是靠起始位和停止位来实现字符内部同步的,所以有时也称为起止式协议。

1.2 单片机与计算机相连

普通的单片机都是通过 RS232C串行口信号线与计算机相连。考虑到通信程序之间采用软件握手以及降低编写PC与单片机的程序的复杂性,PC与单片机之间的连接只采用了RS232接口中的3根线,即RXD,TXD,GND。因为由PC出来的是RS232电平,而单片机是典型的TTL电平,因此在PC与单片机的连接中必须要有电平转换电路,此处采用的是MAX232电平转换电路。PC数据发送是通过TXD口经过一个电平转换电路连接到单片机的RXD端,而接收数据是由RXD经过一个电平转换电路连接到单片机的TXD口,如图1所示:

图1 PC机与单片机的连接

2 通信的程序设计

本次设计中,以一个人体重心测控系统为背景,给出单片机部分和C++ Builder环境下的通信程序实例,通信协议采用全双工异步串行通信方式,通过RS232的RTS信号进行收发转换,传输数据采用16进制数据,PC机与单片机之间采用主从式通讯。

2.1 通信协议

串口通讯能有条不紊地进行,依赖于串口通讯协议的制定。串口通讯协议分为底层通讯协议和用户层协议。底层协议一般由计算机硬件提供商和设备厂家提供,而用户层协议则是指数据以何种格式发送出去,或如何从接收到的某种格式的数据中提取需要的数据等,本系统采用的用户层协议是自主定义的通信协议【3】,具体如下:

(1)波特率19200bps,1个起始位,8个数据位,1个停止位,无奇偶校验。实际通信中,PC机和下位机发送的数据,都带有一个起始字和结束字,可以增加它的抗干扰性,当下位机发送过来的数据乱了之后,上位机能立即检测出来,并将乱了的那块数据包扔掉,重新开始寻找下一个带有起始字和结束符的一组完整数据,这样就能确保数据传输的可靠性。

(2)通信采用主从式,即PC机主动发送命令给单片机,单片机根据命令进行相应的动作;所有发送的数据均采用16进制数(注:OxA1即16进制数A1)。PC机和下位机都采用定长的数据格式进行数据的发送,上位机和下位机首先只需判断起始字是否为通信协议所规定的起始字,若是,才进行下一步的操作;否则就不用对它进行任何操作。这样就确保了通信的高效性。

(3)通信数据帧格式

起始符:1个字节,标识一次发送的开始,PC机默认的A1,下位机默认的为B1;

命令:3个字节,区分不同的操作;

结束符:1个字节,标识一次发送的结束,默认的为13;

预留符:1个字节,增加程序的可扩充性。

本系统的详细命令与数据格式如下:

握手:上位机发送A12000010013

下位机回复: B1000000000000000000000013

开始测试:

无剩余能力测试时上位机发送:A12004000113,其中的01表示本次进行无剩余能力测试。

有剩余能力测试时上位机发送:A12004000213,其中的02表示本次进行有剩余能力的测试。

下位机根据第3、4个字节确定要发送多少组数据给PC机,根据第5个字节确定要采集那些数据发送给PC机。

结束测试:上位机连续3次发送命令A12000000413,其中的04表示结束本次测试。

2.2 上位机的通信程序设计

上位机的通信程序作为整个系统中的主机,肩负着系统数据分析、指令下达,同时提供信息系统管理功能的多重任务。因此我们选择具有多任务的操作方式、良好的用户界面和强大的数据库管理功能的C++ Builder作为上位机的开发软件。在C++ Builder中实现串口通信的方法有多种,利用MSComm ActiveX控件(它的支持文件:MSComm32.OCX,需注册) ,可以非常方便地创建串行通信应用程序,但其程序执行效率不够高,并且无法应用串行通信的一些底层功能。还可利用一种以Microsoft Communications Control(version 6)为基础的串口类CSerialPort,该串口类将API和ActiveX控件结合起来,以API编程的灵活性弥补了C++Builder中串口控件的不足。

下面就详细介绍如何利用串口通信类CSerialPort来实现PC机与单片机的通信。 它的工作流程及在本系统的应用如下:

上位机程序工作流程如下:首先设置好串口参数,再开启串口监测工作线程,串口监测工作线程监测到串口接收到的数据、流控制事件或其他串口事件后,就以消息方式通知主程序,激发消息处理函数来进行数据处理,这是对接收数据而言;发送数据可以直接发送。

1)首先在应用程序的工程中添加该类,同时要包含该类的定义文件“SerialPort.h”,手工添加#include “SerialPort.h”;

2) 自动搜索PC机上有效的串行端口。一般的PC机最多可扩展到128个串口,但是最常用的是前面10个串口,所以本系统只搜索前面10个串口号。首先声明一个指向CSerialPort类的指针CSerialPort *Comm,然后利用InitPort函数对1-10号串口逐一进行初始化。如果初始化成功则为当前PC机上的有效串口,并将该串口号保存在变量中。

3)打开通信端口,进行数据的传输:

4)关闭通信端口,释放系统资源。在完成串行通信操作后,应该将串行通信端口的资源归还给操作系统;

2.3 下位机的通信程序设计

STC系列单片机具有采集速度快,带有8路的10位的A/D转换,价格便宜等优点。所以本系统采用的单片机为STC12C5412AD ,振荡频率为22.1184MHz,串口工作于方式1,定时/计数器1用作波特率发生器,PCON 中的SMOD位为0,发送的波特率为19200。下位机端通信程序采用C51编程语言在KeilC51环境下开发的,通信流程,如图2所示:

图2 单片机通信流程图

3 结束语

利用C++ Builder作为软件开发平台,通过API函数实现PC机与单片机之间的串口通信,该系统经过调试,运行稳定可靠,已成功应用到人体重心测试系统中。本方法实现简单,通用性好,只要稍加改动就能应用到其他的系统中。

[1]汤勃,徐立伟,饶润生.基于VB的PC机与单片机串行通信程序设计.[j]武汉理工大学学报.2002年 26卷第4期.534~536.

[2]李朝青.PC机与单片机数据通信技术.[M]北京航空航天大学出版社.1999.

[3]黄良沛,黄昕,阳小燕.Delphi环境中利用MSCOMM实现PLC与上位机的串口通信.[j]计算机应用与软件.2005年第22卷第4期.125~127.

猜你喜欢
PC机下位通信协议
发射机房监控系统之下位机
科技与创新(2018年1期)2018-12-23 06:46:14
基于PC机与单片机的多机通信技术及抗干扰方法
基于Z-Stack通信协议栈的红外地温采集电路设计
基于三菱FXPLC的感应淬火机床与PC机的串行通信实现
VC.NET下实现dsPIC单片机与PC机的通信
电子制作(2017年23期)2017-02-02 07:16:47
景洪电厂监控系统下位机数据传输网络改造
基于DMX512通信协议的多路转发器设计与研究
围观党“下位”,吐槽帝“登基”
北京纪事(2016年5期)2016-05-07 13:17:02
基于NS-3的PLC多频通信协议仿真平台设计与实现
电测与仪表(2016年2期)2016-04-12 00:24:52
CAN总线并发通信时下位机应用软件设计