几乎所有的开发板都会支持串口输出调试,但不是每次我们都有那么好运能直接看到串口输出。我自己也遇到过几次串口无输出或输出乱码的问题,这里总结一下。
1.无输出:一般可能是管脚接错了,把接收脚和发射脚掉转有可能会解决问题;另外一个可能是串口的校验位和流控制设置有误。如果确定不是接错也不是设置问题,则可能需要查设计图并检测输出波形。
2.输出乱码:很大可能是波特率设置错了;另外有可能是输出电压不够,因为开发板输出的串口信号电压一般比较低,如果开发板本身没有增强输出模块,则需要自己接一块增压的小板了。
如果问题仍未解决,则需要用信号分析仪器对输出脚的输出波形进行分析了。以我手上这个开发板为例,串口输出是57600bps,8位数据,1位停止位,无校验流控。系统启动通过定时扫描输出调试信息,例如我在等待用户按键时输出了“..huz_5WaitKey..”的信息,通过串口终端可看到以下内容:
把信号分析仪的输入线接到串口的输出管脚,可看到波形输出,拍照并分析如下:
如图经分析可知,串口空闲状态是高电平(看资料介绍理论上在单片机TTL端才是高电平,在电脑RS232端应该是低电平,应该是我当时为了方便分析而把输入信号的正负极掉换了),有数据时会先发一个低电平的起始位,然后是8位数据,最后是一个高电平的停止位,如此循环输出。
其中8位数据是低位在前高位在后,要反过来看才是真正的数据。例如第一个数据帧,收到数据是01110100,反过来是00101110,即46(0x2E),为点号“.”的ASCII码。上图显示数据为
01110100 01110100 00010110 10101110 01011110 11111010
反转过来就是
00101110 00101110 01101000 01110101 01111010 01011111
即:
2E 2E 68 75 7A 5F
译成明文就是:
..huz_
显然是符合我们预期的输出开头的。
另外,图中纵向一格电压为5V,可大概量知输出波形的电压范围为正负5.1V(RS232规定信号电压好像是3V到15V)。横向一格为100us,六帧数据共用时约10.5格即10.5*100us=1050us,每帧数据为10位(8位加起始和停止位),故每一位的所用的时间为1050us/6帧/10位每帧=17.5us,换算成波特率就是1b/17.5us=1b/0.0000175s=571423bps,跟约定的57600比较,误差约为0.79%属于正常范围(一般误差在3%以内是可以接受的)。
由此可见,通过波形分析,我们完全能判断输出的信号是否正常,电压是否足够,波特率是否在允许范围内,输出信息是否正确,对诊断串口故障非常有帮助。