linux與windows的通訊:
首先就是TX2的接線了,uart通訊隻需要找到對應的接線端口,RXD和TXD,TX2中uart通訊口為J17(棕色為TXD,藍色為RXD),具體接線如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL1UFVPJTUE1kMRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL1ETMwUjM1ETM3AjMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
第一步需要設定序列槽參數,用于打開序列槽
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;
}
這樣序列槽通訊的基本配置就結束了,下面開始應用
- 打開linux序列槽檔案位置
fd = open_uart("/dev/ttyTHS2");
ret = set_uart_attr(fd, 115200, 8, 'N', 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碼即可。
注意參數設定的統一啊兄弟們