简单实用的串口调试方式

2016-06-06 22:47方淼荣钱光明
电脑知识与技术 2016年6期
关键词:串口模块

方淼荣++钱光明

摘要:将一个模块(如串口摄像头)与STM32单片机通过接口相连时,一个重要程序调试手段是:经单片机向模块发一系列的命令,然后检查模块产生的有关应答信息。该文以“WIFI图片自动拍摄和网络传送”这一设计实践为例,介绍了三个与串口有关的调试技巧:在中断服务子程序中实现应答信息的即收即发、设置转发缓冲区实现应答信息的先存后发、以及用延时来暂代应答信息的正确性判断。实验效果证明了这三个技巧简单、实用和有效。

关键词:串口;模块;应答信息;转发缓冲区

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)06-0234-02

1 引言

STM32单片机串口众多,如USART1~USART5[1]。这些串口不但方便了我们进行产品设计,而且非常有利于程序调试。因为可以拿出一个或几个串口连接(或通过USB转串口连接)PC机,显示程序调试中的重要信息,这样的串口下称调试用串口。

利用串口来调试,利用串口来接模块。我们将USART1作调试用串口,USART2串口接WIFI模块Gainspan GS1011,USART3串口接摄像头模块PTC08,完成基于WIFI的图片自动拍摄和网络传送[2] [3]。无论对哪一个模块,都需要一系列的命令才能完成有关操作,模块对每一个命令一般都有相应的应答信息。应答信息反映命令的执行情况,决定程序下一步的走向。因此,应答信息无疑是调试过程中非常重要的信息。实验中为了快速、初步地传出图像,基于应答信息,我们采用了以下几个简单实用的调试技巧。

2 在中断服务子程序中转发——应答信息即收即发

无论是单独调试接串口的摄像头,还是WIFI模块,当速率高至115200时,这一方法均比较有效。实验机型为STM32F103RC,系统时钟72MHz,256kB Flash,48kB SRAM。以摄像头调试为例说明之,图1是连接示意。

图中摄像头接收单片机发来的指令(可以是单片机程序发出的也可是PC机发来的),然后依据指令向单片机应答信息,这些应答信息由USART1发向PC机显示。对于这两个串口而言,发送数据时均采用查询方式,接收数据时均以中断方式进行。图2是发送数据流程(以USART1为例),图3是接收数据中断服务子程序流程(以USART2为例)。

图2中的TC意为“发送完成”。每次要发送数据之前,检查一下上次是否发完,如果已发完,TC就为“1”,即可发送一新的字节。“先检查TC后发字节”的操作会使TC清“0”。

图3中的RXNE意为“接收非空”。一旦有数据到来,RXNE将为“1”,系统运行进入该中断服务子程序,通过该子程序读入一个字节。流程中判断USART2的RXNE是否为“1”,可理解为如果是别的原因进入中断的话,需另作处理。“接收一个字节”这一读操作使RXNE清“0”。

现在再看图1。可通过图2的方式向摄像头发命令,那么,怎样将摄像头的应答信息快速及时地显示到PC机呢?只要在图3的“接收一个字节”程序框后,将图2所示的程序段加进去即可。这样就实现了:摄像头如果有应答信息发到STM32单片机的USART2口,单片机马上被中断,进入中断服务子程序,该子程序读入应答信息,随即转到单片机的USART1口,由USART1发到PC机上显示。非常有利于程序调试。

3 设置转发缓冲区——先缓存应答信息

实时编程的一个主要原则是中断服务子程序的执行过程应尽量短而快,单独调试PTC08摄像头时,图1中的单片机没接别的东西,上述“用中断服务子程序转发数据”的方法很有效。但是,如果系统并不像图1那么简单,如还接了WIFI模块等装置,或是开启了别的中断,那么,系统实时性肯定会受影响,或造成某些数据丢失。此时,可以考虑中断服务子程序保持如图3所示不变,而设置缓冲区来进行数据转发。这样的缓冲区称为转发缓冲区。

仍以图1、图2和图3为例,所谓设置转发缓冲区,就是在接收数据中断服务子程序中,只将摄像头通过USART2发给STM32单片机的应答信息先缓存起来,随即退出该子程序,以后在适当的时候再通过USART1发向PC机显示。这一缓冲区采用循环结构,即如果放满了,再从头开始,那么,新数据会把老数据覆盖掉。缓冲区会耗费宝贵的内存,但如果设得太小,丢失的信息会过多。对于程序的调试信息,显示稍微慢一点也没关系。摄像头的应答信息,个别的没有显示出来,但关键信息显示成功的话,也是可以接受的。如PTC08初始化时,应答信息除了“0x76 0x00 0x26 0x00”外还有一些版本信息,只要前者能正确在PC机上显示,我们就基本认为初始化是成功的,版本信息在送往PC机的过程中丢了一些关系也不大。

实验中采用过256~1024字节的转发缓冲区。下面以256字节为例来加以说明:

定义作为转发缓冲区的数组R2Buff[256];

设一个循环计数变量R2num,用于指示R2Buff[ ]接收的字节数;

设一个指针TRpointer1,用于指示USART1发向PC机的字节数。

在USART2的接收数据中断服务子程序中,接收的字节存入R2Buff[ ],每存一个,R2num加1,加到256时R2num清“0”。

主程序在适当的时候安排向PC机转发数据的指令,每转发一个,TRpointer1加1,加到256时TRpointer1清“0”。

图4是转发缓冲区及其指示变量示意图。初始化时TRpointer1和R2num均指向R2Buff[0]。如果TRpointer1小于R2num,说明有新数据要发送;如果TRpointer1等于R2num,看作没有新数据,无需发送。如果R2num的值从小到大赶上了TRpointer1,说明发送慢了,丢失了部分该显示的应答信息。

4 简化应答信息的正确性判断——用延时来暂代

为了方便连接和编程,USART串口是很多功能模块配备的接口之一,如上面谈到的Gainspan GS1011和PTC08模块。为了完成某类操作(下面以拍一张JPG照片为例),STM32单片机往往需要向这样的一个模块发几个命令,对应每一个命令,模块一般都有一串应答信息。较正规的编程方式是:向模块发一个命令,等待模块对该命令的应答,判断该应答信息是否正确,如果正确的话可继续发下一命令,……直至完成该类操作(如读到一张完整的JPG图片)。

调试过程中,为了快速得到结果,有时没有必要对每一个命令的应答信息做出正确与否的判断,直接用延时子程序延时一定时间即可,因而可节省部分编程时间。因为一般模块产品都已经过较完备的设计,应答信息一般都是正确的,所以在调试阶段,这样用“延时”暂时代替“应答信息的判断”往往简单而可行。

例如,发往PTC08的拍照命令是“0x56 0x00 0x36 0x01 0x00”,PTC08返回的应答信息是“0x76 0x00 0x36 0x00 0x00”,如果正确收到了这样的应答信息,便可接着发下一个命令—“读图片长度”。调试中我们暂不去编程判断这一串应答信息,而是在发出拍照命令后,简单地延时0.5秒,也收到了满意的效果,后续命令均得以正确执行,可以完整收到JPG照片。当然,这种方法在最终设计中最好不用。延时短了模块没准备好导致无法继续下去,延时长了将影响响应速度。另外,模块发出应答信息的时间随自身的状态也可能会有所改变。不过,调试过程中这仍然是一个好的手段。

5 结束语

STM32单片机提供了许多串口,方便了产品开发的同时,调试过程也可极大地受益。用别的接口连接模块时,采用类似的思路应该也是可以的。不过,一般最好还是通过串口(或USB转串口)连接PC机来显示应答信息。如果直接用STM32单片机的USB接口与PC机的USB接口相连,程序结构将复杂许多。

参考文献:

[1] RM0008: STM32F101xx, STM32F102xx、STM32F103xx、STM32F105xx 和STM32F107xx,ARM内核32位高性能微控制器. http://www.st.com/

[2] GainSpan. GS1011M_Datasheet_rev_1_6. 2013.

[3] PTC08 串口摄像头使用说明书. 谱泰通信科技,Revision 1.06. 2012. http://www.putal.com.cn/.

猜你喜欢
串口模块
28通道收发处理模块设计
“选修3—3”模块的复习备考
浅谈AB PLC串口跟RFID传感器的通讯应用
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
三个必修模块 教学各有侧重
串口技术的实物调试和虚拟仿真联合教学模式
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
基于并行控制的FPGA多串口拓展实现
IR推出易用的μHVIC系列构建模块,有效简化设计