天天看點

C++基于TX2——QT5的序列槽通訊算法(linux與windows通訊、linux與stm32(以大疆A闆為例)通訊)

linux與windows的通訊:

首先就是TX2的接線了,uart通訊隻需要找到對應的接線端口,RXD和TXD,TX2中uart通訊口為J17(棕色為TXD,藍色為RXD),具體接線如下圖:

C++基于TX2——QT5的序列槽通訊算法(linux與windows通訊、linux與stm32(以大疆A闆為例)通訊)
C++基于TX2——QT5的序列槽通訊算法(linux與windows通訊、linux與stm32(以大疆A闆為例)通訊)

第一步需要設定序列槽參數,用于打開序列槽

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為例):

C++基于TX2——QT5的序列槽通訊算法(linux與windows通訊、linux與stm32(以大疆A闆為例)通訊)

下面針對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碼即可。

注意參數設定的統一啊兄弟們

C++基于TX2——QT5的序列槽通訊算法(linux與windows通訊、linux與stm32(以大疆A闆為例)通訊)

繼續閱讀