linux与windows的通讯:
首先就是TX2的接线了,uart通讯只需要找到对应的接线端口,RXD和TXD,TX2中uart通讯口为J17(棕色为TXD,蓝色为RXD),具体接线如下图:
第一步需要设置串口参数,用于打开串口
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码即可。
注意参数设置的统一啊兄弟们