c通过UART读取传感器的编程逻辑

时间:2016-08-01 14:50:25

标签: c logic uart

我正在尝试通过UART从连接到mcu的传感器读取数据。通电时,传感器连续输出ASCII大写字母“R”,后跟四个ASCII字符数字,表示以毫米为单位的距离,然后是回车符(ASCII 13)。

我想知道是否有人可以帮助我弄清楚获得阅读的逻辑,例如9999作为变量称为读数。

我应该使用阻止功能还是非阻塞功能?如果数据流入,我将如何隔离字符?

1 个答案:

答案 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结尾的状态机。