C++基于TX2——QT5的串口通讯算法(linux与windows通讯、linux与stm32(以大疆A板为例)通讯)

本文详细介绍了如何在Linux下配置UART串口与STM32进行通讯,包括设置串口参数、打开串口以及发送数据。在发送数据时,由于STM32需要ASCII码,因此需将数据转换为相应的ASCII值。通过示例代码展示了如何发送特定字符,并解释了如何验证通讯成功的现象。
摘要由CSDN通过智能技术生成

linux与windows的通讯:
首先就是TX2的接线了,uart通讯只需要找到对应的接线端口,RXD和TXD,TX2中uart通讯口为J17(棕色为TXD,蓝色为RXD),具体接线如下图:
uart通讯口
通讯接口

第一步需要设置串口参数,用于打开串口

int set_uart_attr(int fd, int nSpeed, int nBits, char nEvent, int nStop)
{
    struct termios newtio, oldtio;
    /*保存测试现有串口参数设置*/
    if (tcgetattr(fd, &oldtio) != 0)
    {
        perror("SetupSerial 1");
        return -1;
    }
    bzero(&newtio, sizeof(newtio));
    /*设置字符大小*/
    newtio.c_cflag |= CLOCAL | CREAD;
    newtio.c_cflag &= ~CSIZE;
    /*设置数据位*/
    nBits=8;
    newtio.c_cflag |= CS8;

    /*设置奇偶校验位*/
    nEvent='N';//无奇偶校验位
    newtio.c_cflag &= ~PARENB;

    /*设置波特率*/
    nSpeed=115200;
    cfsetispeed(&newtio, B115200);
    cfsetospeed(&newtio, B115200);

    /*设置停止位*/
     nStop == 1;
     newtio.c_cflag &= ~CSTOPB;

    /*设置等待时间和最小接收字符*/
    newtio.c_cc[VTIME] = 0;
    newtio.c_cc[VMIN]  = 0;

    /*处理未接收字符*/
    tcflush(fd, TCIFLUSH);

    /*激活新配置*/
    if ((tcsetattr(fd, TCSANOW, &newtio)) != 0)
    {
        perror("com set error");
        return -1;
    }
    printf("set done!\n");
    return 0;
}

其次就可以打开串口了

int open_uart(const char* device_name)
{
    int fd;

    fd = open(device_name, O_RDWR | O_NOCTTY | O_NDELAY);
    if (-1 == fd)
    {
        perror("Can't Open Serial Port");
        return (-1);
    }

    /*恢复串口为阻塞状态*/
    if (fcntl(fd, F_SETFL, 0) < 0)
    {
        printf("fcntl failed!\n");
    }
    else
    {
        printf("fcntl=%d\n", fcntl(fd, F_SETFL, 0));
    }

    /*测试是否为终端设备*/
    if (isatty(fd) == 0)
    {
        printf("standard input is not a terminal device\n");
    }
    else
    {
        printf("isatty success!\n");
    }

    printf("fd-open=%d\n", fd);
    return fd;
}

这样串口通讯的基本配置就结束了,下面开始应用

  1. 打开linux串口文件位置
fd = open_uart("/dev/ttyTHS2");
ret = set_uart_attr(fd, 115200, 8, 'N', 1);
  1. 发送数据()
buff[0] = xxx;
buff[1] = xxx;
int ret = write(fd, buff, strlen(buff));

这个只是发送程序,需要读数据的以此写一个read就可以.
运行结果如下(我以发送1 2为例):

运行结果
下面针对linux对stm32的通讯:
linux与stm32的通讯其实和对windows的通讯很相似,不过windows是可以接收字符的,所以发送的时候可以 以字符的形式直接发送想发送的数据,而stm32开发板(以大疆A版为例)不同,它必须接受的是该字符的ASCLL码,比如发送1,就应该发送的是49 \r \n,开发板接收到的是他的16进制数:33 0D 0A,接着开发板会将其转换成ASCLL码,最终识别出该数据为1,用程序表达如下:

buff[0] = 49;
buff[1] = '\r';
buff[2] = '\n';
int ret = write(fd, buff, strlen(buff));

我们用现象来检验是否发送成功,例如A板接收到1就亮第一个灯,接收到2就亮第二个灯,以此类推,现象表明,笔者试验成功。所以linux对stm32的通讯只需要将发送部分修改为对应数据的的ASCLL码即可。

注意参数设置的统一啊兄弟们
上号!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值