0
点赞
收藏
分享

微信扫一扫

PX4从放弃到精通(十九):串口驱动



文章目录


  • ​​前言​​
  • ​​一、创建进程​​
  • ​​二、编写驱动​​
  • ​​三、测试​​


前言

硬件:

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);
}

}

三、测试

使用的飞控的端口如下

PX4从放弃到精通(十九):串口驱动_服务器

引脚如下:

PX4从放弃到精通(十九):串口驱动_串口_02

这里只需要接三根线,飞控的TX接USB串口模块的RX,飞控的RX接USB转串口模块的TX,同时需要共地。

PX4从放弃到精通(十九):串口驱动_linux_03

接好线后,将飞控连接至QGC地面站,将USB串口模块接至串口助手。

在QGC上启动串口进程。

在串口助手上设置波特率等参数,发送一串数据,以F开头,串口助手上会收到除F以外的其他字符。

PX4从放弃到精通(十九):串口驱动_ios_04



举报

相关推荐

0 条评论