我正在尝试通过UART从连接到mcu的传感器读取数据。通电时,传感器连续输出ASCII大写字母“R”,后跟四个ASCII字符数字,表示以毫米为单位的距离,然后是回车符(ASCII 13)。
我想知道是否有人可以帮助我弄清楚获得阅读的逻辑,例如9999作为变量称为读数。
我应该使用阻止功能还是非阻塞功能?如果数据流入,我将如何隔离字符?
答案 0 :(得分:0)
首先,我会选择阻止版本。我想你可能会在开始时期待丢失的字符,因为传感器可能会在您实际读取数据之前开始流式字符。因此,如果UART变满,你可能需要它。所以示例代码是:
#define CR (13)
uart_t my_uart; // You need to setup this
uart_status_t status;
uint8_t c;
int status;
char distance[255] = { 0 }; // Whatever, large enough
int seen_r = 0; // You have not yet seen 'R'
int offset = 0;
while ((status = uart_read(my_uart, &c, &status)) == 0)
{
if (seen_r)
{
if (c == CR)
{
printf("Distance: %s\n", distance);
seen_r = 0;
memset(distance, 0, sizeof(distance));
}
if (offset < sizeof(distance)-1)
{
distance[offset++] = (char)c;
}
else
{
printf("Unexpected size, reset!\n");
seen_r = 0;
memset(distance, 0, sizeof(distance));
}
}
else
{
if (c != 'R') continue;
seen_r = 1;
}
}
当然这是未经测试的代码,但它可能会给你一些提示。
基本上,您有一个以'R'
开头并以CR
结尾的状态机。