问题描述:生理信号采集设备将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;
}