如何从UART读取数据

时间:2016-02-11 10:56:45

标签: c function uart

我有一个通过uart连接到mcu的传感器。传感器的输出为ascii chapital R,后跟四个ascii字符编号,以回车结束。例如R1234CR

以下是从uart一次读取一个字符的代码。

我正在尝试编写一个函数,当它检测到大写R并将接下来的四个字符放在一个数组中时。

我的大部分功能都写在下面,但我正在努力解决逻辑流程。

另外如何返回数组?

由于

2 个答案:

答案 0 :(得分:0)

我想这就是你想要的..我转移了一些代码并进行了一些更改......我无法编译它因为我当然没有和真正的UART接口。希望它会工作..

我连续扫描UART接收的数据,直到获取所有数据或接收到-1。 但是我没有遇到任何回车,因为我希望您只对5个字节的数据感兴趣随意更改此代码,因为您需要..

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
#include <string.h>

int main() {
    char receivedChars[5] = {0};
    bool status = getdata(receivedChars);
}


char getchar(void) {
    int ret;    
    if ( (ret = ti_uart_read(TI_UART_0, &c)) == TI_RC_OK)
        return ((char) c);
    return -1;
}

bool getdata(char *receivedChars) {
    int count = 0;
    char retchar;
    char buffer[5] = {0};
    while(1){
        retchar = getchar(); 
        if ((retchar == 'R') && (count == 0)){
            // It means the first occurance of 'R'
            buffer[count] = 'R';
            count++;
        }else if ((count > 0) && (count < 5) &&  isdigit(retchar) != 0){
            buffer[count] = retchar;
            count++;
        }else if(retchar == -1){
            // Assumed that -1 means error in recieving the data from UART
            return false;
        }else{
            continue;
        }

        if (count == 5){
         strncpy(receivedChars, buffer, count); 
         return true;
        }
    }
}

答案 1 :(得分:-1)

您在代码中尝试做两件事

  

我试图编写一个函数,当它检测到大写字母R并将接下来的四个字符放入数组时

  

//如果字符为1-9,则将它们写入数组

两者兼顾有时是矛盾的。所以你需要决定你需要完成什么。

第一个更复杂,所以我会帮助你。

void getdata(char *receivedChars) 
{    
    static uint8_t detected, ndx;
    int retchar;
    retchar= getchar();

    if ((retchar == 'R') && (detected == 0))
    {
        detected = 1;
        ndx = 0;
    }

    if ((detected == 1) && (ndx < 4))
    {
       receivedChars[ndx] = retchar;
       ndx++;
    }

    if (retchar == '\r'){
      receivedChars[ndx] = '\0';
      ndx = 0;
      ti_uart_writebuffer(UART_0, (uint8_t *)receivedChars, sizeof(receivedChars));
    }
}

修改:将类型更改为无效,并在ti_uart_writebuffer功能中添加了getdata来电。现在应该从main函数中删除此调用。