『7x24小时有问必答』
最近在嵌入式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 port

extern 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
uart_test.c:

#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");                }            }        }    }}
与串口调试助手联调,测试数据如下:

sscom32周期性发送数据:

</buadrate,></unistd.h></fcntl.h></sys></sys></termios.h></stdio.h></cstring></unordered_map></iostream></unordered_map></termio.h>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

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

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码