UART以及串口重定向--什么是重定向?为什么要重定向?

UART以及串口重定向–什么是重定向?为什么要重定向?

异步 :发送方和接收方有各自的时钟

UART协议:每一帧数据都包含起始位,数据位,和停止位。当数据线从高电平跳变到低电平时,作为起始位,当数据线从低电平跳变到高电平时,作为停止位。空闲桢:数据线一直处于高电平;断开桢:数据线一直处于低电平

  1. 起始位:
  2. 数据位:5、6、7、8、9位
  3. 校验位(非必要):和校验,奇校验,偶校验。校验位其实是数据位的最后一位,当数据的前N-1位接收完毕时,接收方就会自动计算前N-1位然后预测第N位应该接收的是高电平还是低电平,如果实际接收到的数据和期待接收的数据不一致,则数据传输出错。
  4. 停止位:
  5. 波特率:每秒传送的bit数。接收方和发送方设置的波特率必须一致,否则接收的数据将会出错

注意:UART协议要求每次只能发送一个数据(5、6、7、8、9位),发送完后要求立刻发出结束信号,因为UART是异步通信协议,即使设置相同的波特率,时钟频率也可能会有误差。如果数据连续发送,并且在接收方和发送方时钟不一致的情况下(比如发送方每10us发送一个bit,接收方每9us接收一个bit(检测数据线的电平状态)),在大量数据流的传输时,误差就会一直堆积,导致传输出错!!!

UART控制器 :一般情况下,MCU都具有UART控制器,我们使用串口通信也是通过配置UART控制器相关的寄存器设置通信协议的细节。当然也可以通过软件模拟窗口通信协议。

接收数据的三种方式:

  • 轮询RDR寄存器
  • 设置接收中断
  • DMA传输

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f6uRfTf6-1668958989281)(C:\Users\WQL\AppData\Roaming\Typora\typora-user-images\image-20221120221855354.png)]

UART编程步骤

  1. 使能时钟
  2. 配置UART引脚模式,RT----输入模式;TX--------输出模式
  3. 配置UART,包括数据位,停止位,波特率,校验等
  4. 是否开启中断
  5. 如果开启中断,还要配置中断优先级
  6. 使能中断
  7. 编写中断服务函数

输入输出重定向

ubuntu:操作系统下的重定向

无重定向时:以在终端输入ls为例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKfS1SEl-1668958989283)(C:\Users\WQL\AppData\Roaming\Typora\typora-user-images\image-20221120230445926.png)]

当输入ls命令时,操作系统读取到"ls"这个字符串后,就会读取当前文件夹下的文件名,然后将这些信息传给显卡,然后显卡控制屏幕显示这些文件名。这是默认的输出显示方式。

重定向输出:ls > out.txt

输入该命令时,ubantu操作系统读取到”ls>out.txt“字符串后,也会读取该文件夹下的所有文件的文件名,然后将这些数据信息传给磁盘,磁盘将它保存到相应的文件中去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0dA5nYaP-1668958989284)(C:\Users\WQL\AppData\Roaming\Typora\typora-user-images\image-20221120230919731.png)]

MCU无操作系统下的重定向

printf()函数是标准C库里面的一个输入输出函数,但是MCU无操作系统,如果需要使用printf()函数,或者类printf()函数,就需要将fputc()函数重定向。因为标准的输入输出函数,是在操作系统下通过显卡输出到屏幕上的。

查阅printf()函数源码,就会发现,printf()函数最终输出的信息是通过fputs()函数实现的,fputs()实现的是输出字符串。但是我们都知道C语言是没有字符串类型的,只有字符型。所以打开fputs()源码就会发现,fputs()函数实质是通过循环调用fputc()实现字符串的输出效果。如果能使fputc()函数输出的内容放到UART的DR(TDR)寄存器,即可实现MCU将通过printf()函数输出信息到串口。如果是发送到电脑的串口,通过相关的串口助手上位机 软件即可输出信息:如果是其它MCU或者其它MCU外设(串口屏),也可以接收到信息,按自己需求使用数据即可。

简单总结就是:printf()调用 fputs(),fputs()调用fputc(),fputc()函数将数据给UART的DR寄存器即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zx9Ek9Eq-1668958989284)(C:\Users\WQL\AppData\Roaming\Typora\typora-user-images\image-20221120231743234.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FMWUtlck-1668958989285)(C:\Users\WQL\AppData\Roaming\Typora\typora-user-images\image-20221120234019352.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DcXRv78U-1668958989286)(C:\Users\WQL\AppData\Roaming\Typora\typora-user-images\image-20221120234031046.png)]

图片转存中…(img-FMWUtlck-1668958989285)]

[外链图片转存中…(img-DcXRv78U-1668958989286)]

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值