|
最近在嵌入式Linux下使用USB转串口(ch340),需要使用C/C++代码封装读写接口,在测试过程中,发现串口无法及时读取串口接收的数据(从硬件指示灯可以明确有数据接收,但程序无法正确输出接收的数据),根据串口特性,发现串口属性需要正确设置,包括禁用Echo等属性,具体修改见代码: uart_test.h:
#ifndef UART_TEST_H#define UART_TEST_H#include <termio.h>#include <unordered_map>#define UART_PORT "/dev/ttyUSB0" // UART portextern int uart_fd; // Global file descriptor// enum buadrateenum BuadRate{ UART_TEST_CONFIG_BAUDRATE_50 = B50, UART_TEST_CONFIG_BAUDRATE_75 = B75, UART_TEST_CONFIG_BAUDRATE_110 = B110, UART_TEST_CONFIG_BAUDRATE_134 = B134, UART_TEST_CONFIG_BAUDRATE_150 = B150, UART_TEST_CONFIG_BAUDRATE_200 = B200, UART_TEST_CONFIG_BAUDRATE_300 = B300, UART_TEST_CONFIG_BAUDRATE_600 = B600, UART_TEST_CONFIG_BAUDRATE_1200 = B1200, UART_TEST_CONFIG_BAUDRATE_1800 = B1800, UART_TEST_CONFIG_BAUDRATE_2400 = B2400, UART_TEST_CONFIG_BAUDRATE_4800 = B4800, UART_TEST_CONFIG_BAUDRATE_9600 = B9600, UART_TEST_CONFIG_BAUDRATE_19200 = B19200, UART_TEST_CONFIG_BAUDRATE_38400 = B38400, UART_TEST_CONFIG_BAUDRATE_57600 = B57600, UART_TEST_CONFIG_BAUDRATE_115200 = B115200, UART_TEST_CONFIG_BAUDRATE_230400 = B230400, UART_TEST_CONFIG_BAUDRATE_460800 = B460800, UART_TEST_CONFIG_BAUDRATE_500000 = B500000, UART_TEST_CONFIG_BAUDRATE_576000 = B576000, UART_TEST_CONFIG_BAUDRATE_921600 = B921600, UART_TEST_CONFIG_BAUDRATE_1000000 = B1000000, UART_TEST_CONFIG_BAUDRATE_1152000 = B1152000, UART_TEST_CONFIG_BAUDRATE_1500000 = B1500000, UART_TEST_CONFIG_BAUDRATE_2000000 = B2000000, UART_TEST_CONFIG_BAUDRATE_2500000 = B2500000, UART_TEST_CONFIG_BAUDRATE_3000000 = B3000000, UART_TEST_CONFIG_BAUDRATE_3500000 = B3500000, UART_TEST_CONFIG_BAUDRATE_4000000 = B4000000,};std::string BaudRateString(BuadRate baudRateMacro);// Function to initialize UART communicationbool UartInit(const char* port, bool IsNonBlocking);// Function to configure UART parameters, mainly the baud ratebool UartConfig(BuadRate baudRate);// Function to read data from UARTssize_t UartRead(void *buf, size_t count);// Function to write data to UART;ssize_t UartWrite(const void *buf, size_t count);// Function to close UART communicationvoid UartClose();#endif //UART_TEST_H
#include <iostream>#include <unordered_map>#include <cstring>#include <stdio.h>#include <termios.h>#include <sys types.h="">#include <sys stat.h="">#include <fcntl.h>#include <unistd.h>#include "uart_test.h"int uart_fd; // Global file descriptorstatic struct termios ti;std::unordered_map<buadrate, std[="" span]::string[="" span]=""> BaudRateMappings = { {UART_TEST_CONFIG_BAUDRATE_50, "50"}, {UART_TEST_CONFIG_BAUDRATE_75, "75"}, {UART_TEST_CONFIG_BAUDRATE_110, "110"}, {UART_TEST_CONFIG_BAUDRATE_134, "134"}, {UART_TEST_CONFIG_BAUDRATE_150, "150"}, {UART_TEST_CONFIG_BAUDRATE_200, "200"}, {UART_TEST_CONFIG_BAUDRATE_300, "300"}, {UART_TEST_CONFIG_BAUDRATE_600, "600"}, {UART_TEST_CONFIG_BAUDRATE_1200, "1200"}, {UART_TEST_CONFIG_BAUDRATE_1800, "1800"}, {UART_TEST_CONFIG_BAUDRATE_2400, "2400"}, {UART_TEST_CONFIG_BAUDRATE_4800, "4800"}, {UART_TEST_CONFIG_BAUDRATE_9600, "9600"}, {UART_TEST_CONFIG_BAUDRATE_19200, "19200"}, {UART_TEST_CONFIG_BAUDRATE_38400, "38400"}, {UART_TEST_CONFIG_BAUDRATE_57600, "57600"}, {UART_TEST_CONFIG_BAUDRATE_115200, "115200"}, {UART_TEST_CONFIG_BAUDRATE_230400, "230400"}, {UART_TEST_CONFIG_BAUDRATE_460800, "460800"}, {UART_TEST_CONFIG_BAUDRATE_500000, "500000"}, {UART_TEST_CONFIG_BAUDRATE_576000, "576000"}, {UART_TEST_CONFIG_BAUDRATE_921600, "921600"}, {UART_TEST_CONFIG_BAUDRATE_1000000, "1000000"}, {UART_TEST_CONFIG_BAUDRATE_1152000, "1152000"}, {UART_TEST_CONFIG_BAUDRATE_1500000, "1500000"}, {UART_TEST_CONFIG_BAUDRATE_2000000, "2000000"}, {UART_TEST_CONFIG_BAUDRATE_2500000, "2500000"}, {UART_TEST_CONFIG_BAUDRATE_3000000, "3000000"}, {UART_TEST_CONFIG_BAUDRATE_3500000, "3500000"}, {UART_TEST_CONFIG_BAUDRATE_4000000, "4000000"},};std::string BaudRateString(BuadRate baudRateMacro){ if (BaudRateMappings.count(baudRateMacro) > 0) { return BaudRateMappings[baudRateMacro]; } else { return "unknown baudrate"; }}int SetNonBlocking(int fd){ int opts; opts = fcntl(fd, F_GETFL); if(opts < 0) { printf("fcntl(fd,GETFL) failed!"); return -1; } opts = opts | O_NONBLOCK; if(fcntl(fd, F_SETFL, opts) < 0) { printf("fcntl(fd,SETFL,opts) failed!"); return -1; } return 0;}// Function to initialize UART communicationbool UartInit(const char* port, const bool IsNonBlocking){ uart_fd = open(port, O_RDWR | O_NOCTTY ); if (uart_fd == -1) { printf( "Unable to open port.\n"); return false; } tcflush(uart_fd, TCIFLUSH); printf( "UART initialized.\n"); return true;}bool UartConfig(const BuadRate baudRate){ tcgetattr(uart_fd, &ti); if(cfsetispeed(&ti, baudRate) < 0) { printf( "UART cfsetispeed failed\n"); return false; } if(cfsetospeed(&ti, baudRate) < 0) { printf( "UART cfsetospeed failed\n"); return false; } // Set no parity (8N1) ti.c_cflag &= ~PARENB; ti.c_cflag &= ~CSTOPB; ti.c_cflag &= ~CSIZE; ti.c_cflag |= CS8; ti.c_cflag &=~CRTSCTS; // Enable receiver ti.c_cflag |= CREAD | CLOCAL; ti.c_lflag &=~ICANON; ti.c_lflag &=~(ECHO | ECHOE | ECHONL); ti.c_lflag &=~ISIG; ti.c_iflag &=~(IXON | IXOFF | IXANY); ti.c_iflag &=~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL); ti.c_oflag &=~OPOST; ti.c_oflag &=~(ONLCR | OCRNL); ti.c_cc[VTIME] = 0; ti.c_cc[VMIN] = 1;// set read to block until at least 1 char is available if(tcsetattr(uart_fd, TCSANOW, &ti) < 0) { printf( "UART configure failed\n"); return false; } else { if((cfgetispeed(&ti) == baudRate) && cfgetospeed(&ti) == baudRate) { printf("UART configured with baud rate: %s\n", BaudRateString(baudRate).c_str()); return true; } else { return false; } } return true;}// Function to read data from UARTssize_t UartRead(void *buf, const size_t count){ return read(uart_fd, buf, count);}// Function to write data to UARTssize_t UartWrite(const void *buf, size_t count){ return write(uart_fd, buf, count);}void UartClose(){ close(uart_fd);}int main(){ UartInit(UART_PORT, false); UartConfig(UART_TEST_CONFIG_BAUDRATE_115200); unsigned char buf[12] = {0xaa, 0x55, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0xaa, 0x55, 0x01, 0x01}; unsigned char data; int i = 0; while (true) { ssize_t count = UartRead(&data, 1); if (count > 0) { if(i == 0) { printf("Received data: "); } printf("%02x ", data); i++; if(i == 12) { i = 0; printf("\n"); ssize_t write_num = UartWrite(buf, sizeof(buf)); if(write_num == sizeof(buf)) { printf("Write data: "); for (int j = 0; j < write_num; j++) { printf("%02x ", buf[j]); } printf("\n"); } } } }}
</buadrate,></unistd.h></fcntl.h></sys></sys></termios.h></stdio.h></cstring></unordered_map></iostream></unordered_map></termio.h> 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |