2021-10-08

uart通信如何接收数据?有没有遇到通信过程中有些比特位丢失的情况?

  1. 根据原理图找到复用功能位uart接收的引脚,将该引脚复用为uart功能引脚,之后编写uart的接收中断服务函数
  2. 没有出现过数据位丢失的情况,因为首先在发送方面,uart中断服务函数中保证了字节能够发送出去;其次在接收方面,开发板上没有硬件FIFO,所以串口每接收到一个字节就触发一次uart中断,在中断服务函数中对该字节进行处理,而不会出现过多字节存储在硬件FIFO中使之溢出导致字节丢失的情况。

知识点

  • 串口丢数据一般有三种情况,第一种是发送端发送的数据不对(数据没发完整),第二种是信道也就是串口线或者连接口不行,无法承受很高的波特率,第三种就是接收端由于某种原因丢数据。
  • linux中串口接收数据的处理流程:
    在这里插入图片描述
    应用层通过select和read来及时的读取串口的数据,而读取的数据其实是内存里的FIFO缓冲区的数据。串并转换模块将来自于RXD传输线上的数据转换成对应的一段数据,比如8位数据位一位停止位无校验位的情况下,就是转换成9bit的数据。然后将其中传输的数据部分写入到模块自带的硬件FIFO中(有了硬件FIFO,cpu就不用每接收到一个字节触发一次中断了)。当硬件FIFO达到设定的阈值时触发串口中断,串口中断处理程序通过配置DMA来搬运存在硬FIFO里的数据到内存里开辟的软FIFO里。应用层通过read()等接口读取内存中FIFO的数据。
    接收端发生了丢失串口数据的情况,由上图可知有两种情况。第一可能是内存中的软FIFO由于是定长的,应用层读取频次太低导致该FIFO溢出从而导致数据丢失。第二种可能就是该串口模块自身的硬件FIFO(也是定长的)溢出导致数据丢失。
  • STM32中,数据没发送完整的解决方法是 等待数据发送发送完毕,通过代码 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) 可保证数据被发送出去(该代码不一定适用于你的开发板,不能生搬硬套,需根据芯片型号和使用的uart接口来修改,我使用的是STM32ZGT6的UART1)

自己写的软件iic的通信速率是多少?是怎么测出来的?

  1. 大概270kbit/s;
  2. 采用的是定时器计时,在启动iic之前将定时器里的计数寄存器清零,计时器开始计时后启动iic,并在iic关闭后结束计时,计算所需时间,再除以通过iic传输的有效比特位,得到的便是传输1个比特位所需的时间,再取倒数就能得到大致的通信速率。
    知识点
  • 时钟频率(Hz)与数据传输速率(bit/s)两者是相同的概念。因为一个SCL时钟周期只能传输1bit数据(并且只能在SCL的低电平期间进行SDA数据电平的变化),假如SCL的时钟频率为100KHz,那么1s中就能产生100K个SCL时钟周期,也就是说1s中可以传输100Kbit的数据。此时,可以看出时钟频率100KHz与数据传输率100Kbit/s就是一样的了。
  • IIC传输位速率在标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s
  • 在建立通信的时候主机需要发送开始信号,紧接着主机需要发出从器件的设备地 址(7bit+1bit),从设备的物理地址是 7bit,但是由于只有一根数据线,就需要说清楚数据的 传输方向,数据的传输方向通过从设备的地址最低位进行表示(最低位是 0,表示写操作, 最低位是 1,表示读操作),IIC 总线提供了应答机制,也就是说从机收到了 1 个字节的数据 之后,会在第九个脉冲发送给主机一个应答信号(1bit),如果主机收到从机的应答信号,则 主机可以继续发送数据,反之,如果主机没有收到从机发送的应答信号,那主机就不应该继续发送数据,而是应该主动发出一个停止信号,表示停止通信。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值