spi iic和串口的区别_嵌入式硬件通信接口协议-UART(三)快速使用串口及应用

文章首发于同名微信公众号:DigCore

欢迎关注同名微信公众号:DigCore,及时获取最新技术博文。

原文链接:https://mp.weixin.qq.com/s/wSFkqFQGlY7KuCHgOETqpg

(说明:此处的文章从微信公众号拷贝而来,图片或者排版上可能存在一定的瑕疵,欢迎点击原文链接阅读)


串口启用流程

开讲前,先找几款芯片的串口demo程序瞄一眼。

依次有STM32的V3.5标准库、nRF52832的官方demo以及51核的STC15系列单片机的官方DEMO。

61c9458f4788ed1df251473077e11f8a.png

5140f6dd9b2e6db7263a150ef6cde802.png

c48c5c0ed03c48ec713b7caff3b74a6e.png

从以上的部分demo例程来看,并结文章《嵌入式硬件通信接口协议-UART(一)协议基础》的介绍,在启用串口的时候,需要配置的那几个参数有波特率、数据位、校验位、停止位等,从demo的源码中也是能够体现出来的。

而略有不同的是,在引脚配置灵活的ARM中,需要针对引脚进行配置。

验证输入输出

完成了串口的初始化,即可对输入输出进行操作,来验证串口是否可以正常的发送和接收数据。

一般的,最直接的方式就是向输出寄存器写入数据,就可以让芯片去完成UART信号输出到对应的引脚上。

如下图依次有STM32的V3.5标准库nRF52832的官方demo以及51核的STC15系列单片机的官方DEMO

56a1e01574d0e1a1aa9e317ef4887669.png

c877594b56c2d41c0032b5bac79256ef.png

29d91aa1c72e48bd60bea16f75d45957.png

验证串口的输出,即在串口初始化成功后,对串口的输出寄存器写入数据,而芯片引脚则使用USB转TTL模块连接,USB端插入计算机的USB口,利用计算机的串口助手软件实现对数据的收发。

调试-输出

开发调试过程中,输出的内容基本上就是想查看的变量值、代码的执行位置跟踪、算法或者某些运算的结果等等。这些输出,仅用于调试阶段,而在人机调试过程中,使用计算机的串口助手软件进行交互,则输出的数据应该便于识读和判断。

C库函数printf格式输出重定向到串口输出

输出串口数据过程中,需要向寄存器逐字节传入数据的,而在传送之前必不可少的,就是将要发送的数据、字符放到同一个Buffer后,执行轮询的方式传送直到buffer内容全部被传送。

而这个“放”的过程也是需要做些计算、判断,尤其是增加必要的字符来描述输出信息,保证信息的可识读。

在C标准库printf函数就有格式输出的功能,利用这个接口更便于调试输出这个过程。

这就需要将printf函数重定向到串口输出上!实现重定向只需3步:

  1. Options for target选项卡内勾选Use MicroLIB
  2. 在串口实现的*.c文件内,将stdio.h文件和stdarg.h文件包含进来
  3. 重新定义int fputc函数的内部实现

7df18a563c1aa89d39310d0a10c925ff.png

05c0ed743d85f27c842fa08f690aa477.png

完成以上3步,即可利用printf函数来格式化输出,并且能够在串口上接收到。

ANSI C标准中有几个标准预定义宏:

__LINE__:源代码中的行号(字符串形式)

__FILE__:当前*.c源码文件的文件名(字符串形式)

__DATE__:编译日期(字符串形式)

__TIME__:编译时间(字符串形式)

__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;

__cplusplus:当编写C++程序时该标识符被定义。

有了上一步实现printf函数的重定向到串口后,基本就可以完美使用串口进行调试程序。

调试过程中可利用ANSI
C标准中的内置宏,比如LINE可以很方便跟踪代码执行到哪一行。

bb8325e7bfe9be9f32baa13339228b00.png

调试-输入

串口的接收,有轮询、中断、DMA等方式。

轮询方式,特点是消耗芯片资源,否则容易丢数据;

中断方式,特点是响应快、资源占用低;

DMA方式,各个芯片的配置不同而无法每款芯片都有该功能,所以代码兼容性可移植性较差。

一般地,对输入的数据进行分析判断时,如果是轮询的方式,则直接在收到后即判断;中断和DMA方式,都可以考虑存到buffer后再分析处理。

414ddbc39ce4b07a7b85a1a020a0cfee.png

552b335db12839ef34dcce269c11fab9.png

初见数据协议解析

如果是简单几个字符的指令,可以用上述那样简单判断,但是在稍微中等级别的工程项目中,用那样的方式都已经很不便于处理和扩展了。

比如有一串数据,并且长度不确定,将会超过10个字节、20个字节、100个字节甚至更多,那么这时候就必须使用协议解析的方式。

通常的,数据协议都会有协议头、长度、校验、数据内容等部分组成,数据将以包的形式进行收发,这时候使用解析的方式,对数据包进行解析。

这就是广泛使用的“起始式协议”。

实际的产品中有IC/ID读卡器模块的接口协议:

f8810e2267067e0de2b720625009240e.png

也有使用在PM2.5传感器上的:

e5681bc40c5040d255cc6846eeba98d3.png

这些都属于开发的模块产品,对外使用串口通信,并且数据协议采样了“起始式”的帧结构模式。


★★★★★推荐文章

《【嵌入式编程】函数返回类型设计》

《【嵌入式编程】平台大小端存储差异解决办法》

《嵌入式硬件通信接口-使用RingBuffer处理数据(二)详细设计过程》

《嵌入式硬件通信接口-使用RingBuffer处理数据(一)》

《快速开发MQTT(一)电子工程师眼中的MQTT》

《快速开发MQTT(二)初识MQTT》

《MQTT客户端搭建-最清晰的MQTT协议架构》

《MQTT服务端搭建-最快方式验证自己开发的客户端》

★★★★★相似文章

《嵌入式硬件通信接口协议-UART(五)数据包设计与解析》

《嵌入式硬件通信接口协议-UART(四)设计起止式的应用层协议》

《嵌入式硬件通信接口协议-UART(三)快速使用串口及应用》

《嵌入式硬件通信接口协议-UART(二)不同电气规范下的标准》

《嵌入式硬件通信接口协议-UART(一)协议基础》

《嵌入式硬件通信接口协议-SPI(三)模拟接口应用》

《嵌入式硬件通信接口协议-SPI(二)分层架构设计模拟接口》

《嵌入式硬件通信接口协议-SPI(一)协议基础》

《嵌入式硬件通信接口协议-IIC(一)协议基础》

★★★★★扩展阅读

《【硬件电路】AltiumDesigner18规则检查含义》

《【硬件电路】N沟道、P沟道MOS管基本原理与应用案例》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值