[求助]AiPi-M61-32S + RD03D UART数据获取问题

[复制链接]
查看1505 | 回复11 | 2024-3-7 10:09:55 | 显示全部楼层 |阅读模式

读取数据感觉好像不太稳定。设想的是一次读取30个数据。连续读取。

开始数据顺序正常

AA FF 03 00 OE 03 B186 10 00 68 01 00 00 00 00 00 00 00 00 00 00000000 00 00 00 55 CC

持续一段时间就变成下面这样了。

55 CC AA FF 03 00 OE 03 B186 10 00 68 01 00 00 00 00 00 00 00 00 00 00000000 00 00 00

这个状态的数据好像,好像,好像是能一直保持。。。后面打印的日志都是这样子的。不知道后面会不会越变越离谱。

有什么办法可以保证每次读取接到的数据都是正确顺序的吗。就想一次把数据拿全了。

代码大概是下面这样的。

#include "bflb_mtimer.h"
#include "board.h"
#include "bflb_uart.h"
#include "bflb_gpio.h"
#include "FreeRTOS.h"
#include "task.h"

#define DBG_TAG "MAIN"
#include "log.h"

struct bflb_device_s *rd03d;
uint8_t UART_RECEIVE_BUFFER[30];

void _rd03dTask(void* pvParameters){
    while (1)
    {
        memset(UART_RECEIVE_BUFFER, 0, sizeof(UART_RECEIVE_BUFFER));
        int len = bflb_uart_get(rd03d, UART_RECEIVE_BUFFER, 30);
        if(len > 0){
            for (size_t i = 0; i < sizeof(UART_RECEIVE_BUFFER); i++){
                printf("0x%2x", UART_RECEIVE_BUFFER[i]);
            }
            LOG_E("\r\n");
        }
        vTaskDelay(500/ portTICK_RATE_MS);
    }

}

int main(void)
{
    board_init();

    struct bflb_device_s * gpio = bflb_device_get_by_name("gpio");
    bflb_gpio_uart_init(gpio, GPIO_PIN_23, GPIO_UART_FUNC_UART1_TX);
    bflb_gpio_uart_init(gpio, GPIO_PIN_24, GPIO_UART_FUNC_UART1_RX);

    rd03d = bflb_device_get_by_name("uart1");

    struct bflb_uart_config_s conf = {
        .baudrate = 256000,
        .data_bits = UART_DATA_BITS_8,
        .stop_bits = UART_STOP_BITS_1,
        .parity = UART_PARITY_NONE,
        .flow_ctrl = UART_FLOWCTRL_NONE,
        .rx_fifo_threshold = 7,
        .tx_fifo_threshold = 7
    };
    bflb_uart_init(rd03d, &conf);

    xTaskCreate(_rd03dTask, (char*)"rd03d", 1024, NULL, 1, NULL);
    vTaskStartScheduler();

    while (1) {

    }
}
回复

使用道具 举报

WT_0213 | 2024-3-7 11:45:24 | 显示全部楼层

                               
登录/注册后可看大图


还有y值计算 为什么要减去 2^15。好像看其他帖子也有不减的。
回复 支持 反对

使用道具 举报

1084504793 | 2024-3-7 10:19:44 | 显示全部楼层
可以试试状态机,收到头后再去解析后面的数据,然后用最后几个字节的数据来保证收到的数据是对的。
回复 支持 反对

使用道具 举报

WT_0213 | 2024-3-7 10:36:51 | 显示全部楼层
1084504793 发表于 2024-3-7 10:19
可以试试状态机,收到头后再去解析后面的数据,然后用最后几个字节的数据来保证收到的数据是对的。 ...

可以用bflb_uart_getchar先读,读到55 然后读到 CC 直接取 30位。在检测取到的数据最后两位是不是 55 和 CC。数据完整性应该可以得到保证。

我想要的是,比如中断之类的。触发读取直接拿30位就是完整的。不进行这些判断。串口调试工具每次打印读出来的数据就都是完整的。
回复 支持 反对

使用道具 举报

曹县 | 2024-3-7 10:39:11 | 显示全部楼层
回复

使用道具 举报

lazy | 2024-3-7 10:48:02 | 显示全部楼层
我也不会
回复

使用道具 举报

1084504793 | 2024-3-7 10:49:55 | 显示全部楼层
WT_0213 发表于 2024-3-7 10:36
可以用bflb_uart_getchar先读,读到55 然后读到 CC 直接取 30位。在检测取到的数据最后两位是不是 55 和  ...

那就需要逻辑分析仪看看中间是否有数据的丢失了。
回复 支持 反对

使用道具 举报

爱笑 | 2024-3-7 11:13:23 | 显示全部楼层
给你抓个技术解决一下!
用心做好保姆工作
回复 支持 反对

使用道具 举报

干簧管 | 2024-3-7 13:37:48 | 显示全部楼层
串口fifo满了吧, vTaskDelay(500/ portTICK_RATE_MS);去掉或者改小呢?
回复 支持 反对

使用道具 举报

noonezero | 2024-3-8 10:50:02 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则