文章目录
- 前言
- 一、创建进程
- 二、编写驱动
- 三、测试
前言
硬件:
PIXHAWK4
USB转串口模块
软件:
Ubuntu18.04
PX4 1.11.3固件
QGC地面站
串口助手
一、创建进程
二、编写驱动
void Uart_test::run()
{
数据定义
char readbuf[10] {};
char data='0';
int ret = 0;
double result = -1.0f;
打开串口,PIXHAWK4飞控上有四个串口,对应的设备号如下:
GPS1:/dev/ttyS0
TEL1:/dev/ttyS1
TEL2:/dev/ttyS2
TEL4:/dev/ttyS3
我这里用的是TEL4,设备号为/dev/ttyS3
对应于飞控的UART&I2C B
端口
_fd = ::open((char *)"/dev/ttyS3", O_RDWR | O_NOCTTY);
if (_fd < 0) {
PX4_ERR("Error opening fd");
//return;
}
设置波特率为115200,8位数据位,无流控,1位停止位
unsigned speed = B115200;
termios uart_config{};
int termios_state{};
tcgetattr(_fd, &uart_config);
uart_config.c_oflag &= ~ONLCR;
// set baud rate
if ((termios_state = cfsetispeed(&uart_config, speed)) < 0) {
PX4_ERR("CFG: %d ISPD", termios_state);
}
if ((termios_state = cfsetospeed(&uart_config, speed)) < 0) {
PX4_ERR("CFG: %d OSPD\n", termios_state);
}
if ((termios_state = tcsetattr(_fd, TCSANOW, &uart_config)) < 0) {
PX4_ERR("baud %d ATTR", termios_state);
}
uart_config.c_cflag |= (CLOCAL | CREAD); // ignore modem controls
uart_config.c_cflag &= ~CSIZE;
uart_config.c_cflag |= CS8; // 8-bit characters
uart_config.c_cflag &= ~PARENB; // no parity bit
uart_config.c_cflag &= ~CSTOPB; // only need 1 stop bit
uart_config.c_cflag &= ~CRTSCTS; // no hardware flowcontrol
// setup for non-canonical mode
uart_config.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
uart_config.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
uart_config.c_oflag &= ~OPOST;
// fetch bytes as they become available
uart_config.c_cc[VMIN] = 1;
uart_config.c_cc[VTIME] = 1;
业务逻辑部分,串口的读取和发送,循环执行
while (!should_exit()) {
读取一个数据
ret = ::read(_fd, &data, 1);
if (ret < 0) {
PX4_ERR("read err: %d", ret);
}
else
{
如果读到一个F,则连续读十个字节并保存
if(data == 'F'){
for(int i = 0;i <10;++i){
read(_fd,&data,1);
readbuf[i] = data;
data = '0';
}
printf("readbuf:%s\n",readbuf);
}
}
将10个数据用串口发送出去
ret = ::write(_fd,&readbuf,10);
if (ret < 0) {
PX4_ERR("write err: %d", ret);
}
else
{
// PX4_INFO("write buf:%f",result);
}
memset(&readbuf,0,sizeof(char[10]));
usleep(100000);
}
}
三、测试
使用的飞控的端口如下
引脚如下:
这里只需要接三根线,飞控的TX接USB转串口模块的RX,飞控的RX接USB转串口模块的TX,同时需要共地。
接好线后,将飞控连接至QGC地面站,将USB转串口模块接至串口助手。
在QGC上启动串口进程。
在串口助手上设置波特率等参数,发送一串数据,以F开头,串口助手上会收到除F以外的其他字符。