![5f28596fd86e209a0de1f6680ea6c25c.png](https://i-blog.csdnimg.cn/blog_migrate/b7a9996f9a0f039362e9b008ab6b2257.jpeg)
最近在做一个agv的控制板开发时发现,中断优先级的不同设置方式会对接收的数据产生影响。思考了一阵后发现会不会是接收数据超时导致接收到的数据出现错误,所以就有了以下思考。
由于我们用的串口比特率偏高,导致接收一个byte的超时时间应该是比较短的。
下面假设串口传输没有使用奇偶校检位,发送一个byte相当于10个bit(1位起始位+8个数据位+1位结束位)的情况。
| Baudrate | result |
|-------------|---------------------------------|
| 115200bps | 1/11520 = 0.000086805556 |
| 19200bps | 1/1920 = 0.000520833333 |
| 9600bps | 1/960 = 0.001041666667 |
当波特率为115200时1个byte的超时时间为 0.000086805556s, 即 0.086805556ms, 一秒最多传输11 519个byte.
当波特率为 19200时1个byte的超时时间为 0.000520833333s,即 0.520833333ms, 一秒最多传输1919个byte.
当波特率为 9600时1个byte的超时时间为 0.001041666667s,即 1.041666667ms, 一秒最多传输959个byte.
如果其他中断优先级比串口高,并且留给串口中断触发的时间不足时,接收到的数据就很容易出现错误。
以下是建议:
- 使用能达到数据传输速率的较低波特率能有效避免错误的发生。
2. 在中断执行函数中尽可能不执行太多的操作,只执行必要操作。
3. 还有要考虑的是降低串口的时钟频率是否能减轻系统的负载。