Page 1 of 1

Luckfox pico plus UART如何实现连续读取

Posted: 2025-02-20 4:20
by 柴家谱
设备:luckfox pico plus
问题描述:生理信号采集设备将8通道数据通过串口传给 Luckfox 开发板 Uart3串口,比特率设置为460800,采样率250hz,数据帧37字节,包含三字节帧头,32字节数据(每四个字节可组成一个通道数据),2字节帧尾。现在向串口连续发送数据,如何接收。目前的代码

Code: Select all

int main() {
    int serial_port_num;
    char serial_port[15];
    
    printf("please use serial port 3 ");
    serial_port_num=3;
    
    sprintf(serial_port,"/dev/ttyS%d",serial_port_num);
    int serial_fd;

    serial_fd = open(serial_port, O_RDWR | O_NOCTTY);
    if (serial_fd == -1) {
        perror("Failed to open serial port");
        return 1;
    }

    struct termios tty;
    memset(&tty, 0, sizeof(tty));

    if (tcgetattr(serial_fd, &tty) != 0) {
        perror("Error from tcgetattr");
        return 1;
    }

    cfsetospeed(&tty, B460800);
    cfsetispeed(&tty, B460800);
    printf("buadrate = 460800\n ");
    tty.c_cflag &= ~PARENB;
    tty.c_cflag &= ~CSTOPB;
    tty.c_cflag &= ~CSIZE;
    tty.c_cflag |= CS8;
    tty.c_cflag &= ~ICRNL;

    if (tcsetattr(serial_fd, TCSANOW, &tty) != 0) {
        perror("Error from tcsetattr");
        return 1;
    }

    char tx_buffer[] = "hello world!\n";
    ssize_t bytes_written = write(serial_fd, tx_buffer, sizeof(tx_buffer));
    if (bytes_written < 0) {
        perror("Error writing to serial port");
        close(serial_fd);
        return 1;
    }
    printf("\rtx_buffer: \n %s ", tx_buffer);
    double channel_data[8];
    uint8_t rx_buffer[50];
    // 添加变量用于干净退出
    int running = 1;
    
    while (running) {
        // 每次读取前清空缓冲区
	    memset(rx_buffer, 0, sizeof(rx_buffer));
	    int bytes_read = read(serial_fd, rx_buffer, sizeof(rx_buffer));
	    printf("data length%d\n",bytes_read);
	    int frameLength = sizeof(rx_buffer) / sizeof(rx_buffer[0]);

	    // 遍历每一帧中的每个字节
	    for (int i = 0; i < frameLength; i++) {
		// 以十六进制格式打印每个字节,并且以空格分隔
		printf("%02X ", rx_buffer[i]);
	    }
	    printf("\n");

	    if (bytes_read > 0) {
		parse_ExG_frame(rx_buffer, bytes_read, channel_data);
	    } else {
		printf("No data received.\n");
	    }

	    
	    // 输出解析后的通道数据
	    for (int i = 0; i < 8; i++) {
		printf("Channel %d: %f V\n", i + 1, channel_data[i]);
	    }
	    // 可选:添加小延迟以防止CPU占用过高
            usleep(10000); // 10毫秒延迟
	}
    close(serial_fd);
    return 0;
}
但是发现接收的数据丢失
数据长度错误.png
请问标准的连续读取串口数据的处理方式是不断轮询就读出来,然后考虑粘包,还是到数了就中断,怎么实现250Hz不间断地采集数据,要不要多线程啥的

Re: Luckfox pico plus UART如何实现连续读取

Posted: 2025-02-20 6:40
by Crocodile
您好,软件上能够优化的可以重新规定协议让发送的包多加校验和位或者帧分隔位, 多线程方案可以考虑一个线程专门接收一个线程专门读取,如果生理信号采集设备可以设置建议还是在发送端加延时;
硬件上能改动也需要考虑生理信号采集设备是否有更多引脚引出可以用来做流控,luckfox pico plus 上只有 UART4M1 的流控引脚有引出