引 言 近年来,随着城市的快速发展,中心城区的停车难问题日益凸显,停车资源没有得到有效利用是造成停车难的原因之一,而预约系统可以让用户与资源提供者进行远程交流,从而缓解这种供求矛盾。随着移动通信技术的快速发展,手机已经成为人们必备的通讯工具。将手机短信服务应用于预约系统,可以使服务更加人性化,更便于人们使用。基于 STM32 和组态王的停车场短信预约系统,让停车场真正实现智能化、人性化,使中心城区停车资源得到有效利用,对改善城区交通具有一定的积极作用。 1 系统结构设计与功能 本系统采用了ARMCor-tex-M4内核的STM32F407ZGT6作 为 主 控 芯 片 ,STM32F407ZGT6 是 意 法 半 导 体(STMicroelectronics)基于ARMCor-tex-M4内核推出的专门用于高性能、低成本、低功耗嵌入式领域的 32 位微处理器 [1]。采用SIMCOM公司的 SIM900A作为通信芯片,通过通信(GSM)模块与 STM32实现短信的发送和接受。基于FreeModbus协议的RTU模式的通信方式,通过RS232接口实现STM32单片机与组态王之间的通信,将短信内容和用户手机号码传给上位机组态王,并通过组态王对停车场进行监控,从而实现短信自动预约停车位的功能。该系统整体硬件结构设计如图 1所示。 该停车场短信预约系统的工作过程如下:当系统正常运行时,若客户需要提前预约停车位,可通过手机发送短信至系统设定的主机号码,通过GSM 网络和 SIM900A 短信收发模块接收预约短信,并通过 RS 232 接口与STM32 主机进行通信。该请求被 STM32 检测并产生一个中断,读取信息及用户号码, 并存储在寄存器中,通过FreeModbus 协议和 RS 232 接口将短信内容和用户号码传给组态王,组态王读取并记录用户号码。组态王软件通过查询停车位数据库,监测停车场车位数, 若有空余车位,则STM32 指令自动发送“预约成功”短信到客户手机上 ;若无空余车位,则发送“车位已满”短信。 停车场短信预约系统主要由四个功能模块构成,即主控模块、通信(GSM)模块、电源模块、数据传输模块 [2]。主控模块采用STM32 作为主控芯片,来控制短信的收发与数据的传输 ;GSM 模块采用SIM900A 进行无线通信 ;电源模块采用12 V 独立电源和USB 接口(COM1)相结合的供电方式; 数据传输模块由两部分组成,STM32 与GSM 模块之间通过RS232 接口(COM3)实现通信,与 PC 机之间通过USB 转RS232 接口(COM2)实现通信。远程终端是手机和装有组态王的上位机(PC),将用户发送的信息和手机号码经过处理之后,储存下来,方便信息的查询。 2 软件设计 该系统以 MDK5 软件为开发平台,通过调用库函数的方法,进行程序设计,应用串口助手和 ModbusPoll 实现程序的设计和调试。 2.1 短信收发子系统的设计 为了实现STM32 与SIM900A 模块之间的数据传输,实现短信收发,首先要对 STM32 进行初始化,然后配置系统时钟、中断控制器、输入输出的GPIO 以及相应的串口。STM32 初始化流程图如图 2 所示。参数配置时,需要对照原理图进行编写,查看芯片端口的使用情况及其作用,然后对该子系统进行配置,以保证模块能够正常运行。 SIM900A的短信功能主要分为两个部分,分别为读取短信和发送短信。接收短信的设置命令为AT+CMGR,我们将接收到的短信内容放在一个长度为 30的BUF中,再将BUF 写入到串口 3中,然后再读取串口 3中的内容,这样,短信的编号就获取完毕。获取了短信的编号之后,就能去获取短信的具体内容,而短信的内容则存放在ALPHA中,它处于响应的第三个位置,通过 SIM_AT_RESPONSE(1)函数,检查GSM 模块发送过来的数据,及时上传给电脑,就获取了短信的内容。发送短信的设置命令为 :AT+CIPSEND,首先将发送短信的电话号码存入到一个BUF中,将这个BUF 写入到串口3中,以此获取手机号码。最后将固定的短信内容写到串口3, 通过 SIM900A发送给手机用户,具体短信发送接收流程图如图 3所示[4]。 该系统若要实现自动预约的功能,则在实现短信收发功能的基础上,通过Modbus 协议使STM32 与上位机组态王进行通信,从而实现短信的自动读取和发送。短信内容是根据组态王软件对停车场车位使用情况的监控而选择发送写好的固定 FreeModbus 是一个针对嵌入式应用的免费(自由)的通 用 Modbus 协议 的 移 植。 目前,Modbus 协议 的 异 步串行传输通信方式, 对应的通信模式是 ModbusRTU 和ModbusASCII[5]。组态王内置的单片机通信协议都有这两种模式,ASCII 码协议内容较为简单,但其传输数据类型的局限性大,可用于传输数据的寄存器少,而本系统要求进行字符的发送和接收,传输的数据量较大,因此我们选择了ModbusRTU 模式对控制器 STM32 进行配置。 为了实现组态王和 STM32 单片机之间的通信,在设计中, 选择移植 FreeModbus…