在微控制器上,是否可以使用轮询来读取串行端口而不丢失传入数据?

问题描述 投票:0回答:1

在微控制器上,是否可以使用轮询来读取串行端口而不丢失传入数据?

假设我的 MCU 有一个用于 UART 的 1 字节硬件缓冲区。在 115200 波特率下,这意味着在丢失之前我有大约 70us 的时间来获取传入字节。即使在 9600 波特率下,我也只有不到 1 ms。

实现这种延迟非常困难。此外,在 RTOS 上,它确实存在使其他线程挨饿的风险(因为例如 FreeRTOS 总是运行高优先级任务而不是低优先级任务)。

了解轮询会消耗 CPU 资源。但在 CPU 可用的情况下,它也更简单。但如果发生“任何事情”,它似乎无法接收串行数据。那是对的吗?如果没有,如何轮询串行端口接收?

serial-port embedded real-time microcontroller hardware
1个回答
0
投票

例如,您可能会设计一个负责多项任务的主循环,其中一项任务是从 UART 读取单个字节并对其进行处理。假设您分析主循环并发现运行时间为 200 µs(不幸的是,大多数编译器工具链都没有提供此信息,尽管它非常有用)。您的系统无法处理每 200 µs 一次以上的字节,因此您需要选择小于 (10 位)/(200 µs) = 50000 bps 的波特率。

假设您选择 38400 bps 的标准波特率,其中字节需要 260 µs。在您的程序检查 UART 后,您知道数据缓冲区为空,并且您知道您将在 200 µs 内再次检查 UART,在此之前,有可能完成一个字节的接收,但不可能完成两个字节,所以不存在溢出的可能性。

假设您的系统有时会收到一个需要很长时间才能处理的命令,例如 2 毫秒。然后,您只需告诉用户,发送该命令后,他们必须避免在 3 毫秒内发送更多命令。

© www.soinside.com 2019 - 2024. All rights reserved.