ArduPilot之开源代码UARTs and the Console使用

2023-05-16

ArduPilot之开源代码UARTs and the Console使用

  • 1. 源由
  • 2. UART定义
    • 2.1 HAL_Empty
    • 2.2 HAL_ChibiOS
    • 2.3 HAL_ESP32
    • 2.4 HAL_Linux
    • 2.5 HAL_SITL
  • 3. 配置参数
    • 3.1 SERIALx_BAUD
    • 3.2 SERIALx_PROTOCOL
    • 3.3 SERIALx_OPTIONS
    • 3.4 SERIAL_PASSx
    • 3.5 SERIAL_PASSTIMO
  • 4. UART常用函数
  • 5. 示例代码
  • 6. 参考资料

1. 源由

ArduPilot的外部传感器主要通过UART/CAN/I2C/SPI等方式接入系统。UART在调试输出、遥测、GPS模块等方面有着诸多应用。了解如何通过HAL与UART对话将有助于理解ArduPilot代码。

2. UART定义

HAL框架设计角度,ArduPilot支持1 + 9个UART端口,其中1个是USB转串口。

libraries/AP_HAL/HAL.cpp

// access serial ports using SERIALn numbering
AP_HAL::UARTDriver* AP_HAL::HAL::serial(uint8_t sernum) const
{
    UARTDriver **uart_array = const_cast<UARTDriver**>(&uartA);
    // this mapping captures the historical use of uartB as SERIAL3
    const uint8_t mapping[] = { 0, 2, 3, 1, 4, 5, 6, 7, 8, 9 };
    static_assert(sizeof(mapping) == num_serial, "num_serial must match mapping");
    if (sernum >= num_serial) {
        return nullptr;
    }
    return uart_array[mapping[sernum]];
}

鉴于ArduPilot支持OS版本不同,或多或少有一些差异,UART可能存在不同的配置情况。

2.1 HAL_Empty

空定义,其实现都是空的,类似dummy/stub。后面可以看到有些OS上会有一些空定义的串口。

libraries/AP_HAL_Empty/HAL_Empty_Class.cpp

static UARTDriver uartADriver;
static UARTDriver uartBDriver;
static UARTDriver uartCDriver;

2.2 HAL_ChibiOS

支持10个UART。

libraries/AP_HAL_ChibiOS/HAL_ChibiOS_Class.cpp

#ifndef HAL_NO_UARTDRIVER
static HAL_UARTA_DRIVER;
static HAL_UARTB_DRIVER;
static HAL_UARTC_DRIVER;
static HAL_UARTD_DRIVER;
static HAL_UARTE_DRIVER;
static HAL_UARTF_DRIVER;
static HAL_UARTG_DRIVER;
static HAL_UARTH_DRIVER;
static HAL_UARTI_DRIVER;
static HAL_UARTJ_DRIVER;
#else
static Empty::UARTDriver uartADriver;
static Empty::UARTDriver uartBDriver;
static Empty::UARTDriver uartCDriver;
static Empty::UARTDriver uartDDriver;
static Empty::UARTDriver uartEDriver;
static Empty::UARTDriver uartFDriver;
static Empty::UARTDriver uartGDriver;
static Empty::UARTDriver uartHDriver;
static Empty::UARTDriver uartIDriver;
static Empty::UARTDriver uartJDriver;
#endif

2.3 HAL_ESP32

支持3个UART,uartB用于TCP通信,uartC用于UDP通信,uartD正常硬件串口。

libraries/AP_HAL_ESP32/HAL_ESP32_Class.cpp

static Empty::UARTDriver uartADriver;
static ESP32::UARTDriver cons(0);
static ESP32::UARTDriver uartBDriver(1);
#ifdef HAL_ESP32_WIFI
#if HAL_ESP32_WIFI == 1
static ESP32::WiFiDriver uartCDriver; //tcp, client should connect to 192.168.4.1 port 5760
#elif HAL_ESP32_WIFI == 2
static ESP32::WiFiUdpDriver uartCDriver; //udp
#endif
#else
static Empty::UARTDriver uartCDriver;
#endif
static ESP32::UARTDriver uartDDriver(2);
static Empty::UARTDriver uartEDriver;
static Empty::UARTDriver uartFDriver;
static Empty::UARTDriver uartGDriver;
static Empty::UARTDriver uartHDriver;
static Empty::UARTDriver uartIDriver;
static Empty::UARTDriver uartJDriver;

2.4 HAL_Linux

支持10个UART,其中第0个uartA定义为Console。

libraries/AP_HAL_Linux/HAL_Linux_Class.cpp

static UARTDriver uartADriver(true);
static UARTDriver uartCDriver(false);
static UARTDriver uartDDriver(false);
static UARTDriver uartEDriver(false);
static UARTDriver uartFDriver(false);
static UARTDriver uartGDriver(false);
static UARTDriver uartHDriver(false);
static UARTDriver uartIDriver(false);
static UARTDriver uartJDriver(false);

2.5 HAL_SITL

支持10个UART。

https://github.com/ArduPilot/ardupilot/blob/master/libraries/AP_HAL_SITL/HAL_SITL_Class.cpp

static UARTDriver sitlUart0Driver(0, &sitlState);
static UARTDriver sitlUart1Driver(1, &sitlState);
static UARTDriver sitlUart2Driver(2, &sitlState);
static UARTDriver sitlUart3Driver(3, &sitlState);
static UARTDriver sitlUart4Driver(4, &sitlState);
static UARTDriver sitlUart5Driver(5, &sitlState);
static UARTDriver sitlUart6Driver(6, &sitlState);
static UARTDriver sitlUart7Driver(7, &sitlState);
static UARTDriver sitlUart8Driver(8, &sitlState);
static UARTDriver sitlUart9Driver(9, &sitlState);

SITL mapping

ParamPrefixSim_vehicle Cmd LineDef Role DefaultConnection
SERIAL0_- -uartA= or - -serial0=Consoletcp:localhost:5760:wait
SERIAL1_- -uartB= or - -serial1=MAVLinktcp:localhost:5762
SERIAL2_- -uartC= or - -serial2=MAVLinktcp:localhost:5763
SERIAL3_- -uartD= or - -serial3=GPSSimulated GPS
SERIAL4_- -uartE= or - -serial4=GPSSimulated GPS
SERIAL5_- -uartF= or - -serial5=
SERIAL6_- -uartG= or - -serial6=
SERIAL7_- -uartH= or - -serial7=
SERIAL8_- -uartI= or - -serial8=
SERIAL9_- -uartJ= or - -serial9=

参考命令

# sim_vehicle.py --console --map -A --serial5=uart:/dev/ttyS15:115200

3. 配置参数

3.1 SERIALx_BAUD

ValueMeaning
11200
22400
44800
99600
1919200
3838400
5757600
111111100
115115200
230230400
256256000
460460800
500500000
921921600
15001500000
20002000000

3.2 SERIALx_PROTOCOL

ValueMeaning
-1None
1MAVLink1
2MAVLink2
3Frsky D
4Frsky SPort
5GPS
7Alexmos Gimbal Serial
8SToRM32 Gimbal Serial
9Rangefinder
10FrSky SPort Passthrough (OpenTX)
11Lidar360
13Beacon
14Volz servo out
15SBus servo out
16ESC Telemetry
17Devo Telemetry
18OpticalFlow
19RobotisServo
20NMEA Output
21WindVane
22SLCAN
23RCIN
24EFI Serial
25LTM
26RunCam
27HottTelem
28Scripting
29Crossfire VTX
30Generator
31Winch
32MSP
33DJI FPV
34AirSpeed
35ADSB
36AHRS
37SmartAudio
38FETtecOneWire
39Torqeedo
40AIS
41CoDevESC
42DisplayPort
43MAVLink High Latency
44IRC Tramp

3.3 SERIALx_OPTIONS

ValueMeaning
bit0InvertRX
bit1InvertTX
bit2HalfDuplex
bit3Swap
bit4RX_PullDown
bit5RX_PullUp
bit6TX_PullDown
bit7TX_PullUp
bit8RX_NoDMA
bit9TX_NoDMA
bit10Don’t forward mavlink to/from
bit11DisableFIFO
bit12Ignore Streamrate

3.4 SERIAL_PASSx

ValueMeaning
-1Disabled
0Serial0
1Serial1
2Serial2
3Serial3
4Serial4
5Serial5
6Serial6

3.5 SERIAL_PASSTIMO

RangeUnits
0 to 120seconds

4. UART常用函数

  • printf - formatted print
  • printf_P - formatted print with progmem string (saves memory on AVR boards)
  • println - print and line feed
  • write - write a bunch of bytes
  • read - read some bytes
  • available - check if any bytes are waiting
  • txspace - check how much outgoing buffer space is available
  • get_flow_control - check if the UART has flow control capabilities

5. 示例代码

libraries/AP_HAL/examples/UART_test 它向前5个UART打印一条问候信息。

可以在测试飞控板上试试,看看是否可以使用USB串行适配器显示所有输出,以及调整波特率。

/*
  simple test of UART interfaces
 */

#include <AP_HAL/AP_HAL.h>

#if HAL_OS_POSIX_IO
#include <stdio.h>
#endif

void setup();
void loop();

const AP_HAL::HAL& hal = AP_HAL::get_HAL();

/*
  setup one UART at 57600
 */
static void setup_uart(AP_HAL::UARTDriver *uart, const char *name)
{
    if (uart == nullptr) {
        // that UART doesn't exist on this platform
        return;
    }
    uart->begin(57600);
}


void setup(void)
{
    /*
      start all UARTs at 57600 with default buffer sizes
    */

    hal.scheduler->delay(1000); //Ensure that the uartA can be initialized

    setup_uart(hal.serial(0), "SERIAL0");  // console
    setup_uart(hal.serial(1), "SERIAL1");  // telemetry 1
    setup_uart(hal.serial(2), "SERIAL2");  // telemetry 2
    setup_uart(hal.serial(3), "SERIAL3");  // 1st GPS
    setup_uart(hal.serial(4), "SERIAL4");  // 2nd GPS
}

static void test_uart(AP_HAL::UARTDriver *uart, const char *name)
{
    if (uart == nullptr) {
        // that UART doesn't exist on this platform
        return;
    }
    uart->printf("Hello on UART %s at %.3f seconds\n",
                 name, (double)(AP_HAL::millis() * 0.001f));
}

void loop(void)
{
    test_uart(hal.serial(0), "SERIAL0");
    test_uart(hal.serial(1), "SERIAL1");
    test_uart(hal.serial(2), "SERIAL2");
    test_uart(hal.serial(3), "SERIAL3");
    test_uart(hal.serial(4), "SERIAL4");

    // also do a raw printf() on some platforms, which prints to the
    // debug console
#if HAL_OS_POSIX_IO
    ::printf("Hello on debug console at %.3f seconds\n", (double)(AP_HAL::millis() * 0.001f));
#endif

    hal.scheduler->delay(1000);
}

AP_HAL_MAIN();

6. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码框架
【3】ArduPilot飞控之ubuntu22.04-SITL安装
【4】ArduPilot飞控之ubuntu22.04-Gazebo模拟
【5】ArduPilot飞控之Mission Planner模拟
【6】ArduPilot飞控AOCODARC-H7DUAL固件编译
【7】ArduPilot之开源代码Library&Sketches设计
【8】ArduPilot之开源代码Sensor Drivers设计
【9】ArduPilot之开源代码基础知识&Threading概念

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ArduPilot之开源代码UARTs and the Console使用 的相关文章

  • 如何将控制台输出写入文本文件

    我是编程新手 我在网页上搜索了这个问题的答案 并尝试了很多可能性 但没有成功 我目前已成功将电位计连接到我的树莓派并在控制台上获取值 但我不知道如何将这些值保存到文本文件中 这是我的代码 usr bin python import spid
  • Ember Data:在控制台中获取模型

    我有最简单的 Ember 应用程序JSBin http jsbin com aYIkAcUk 2 edit 我想做的就是找到一个模型 基于其他所以问题 https stackoverflow com questions 18756092 h
  • C# 高级控制台 I/O [重复]

    这个问题在这里已经有答案了 我想使用控制台执行多个 I O 任务 打印出标准的 不可编辑的文本 Console WriteLine 打印出用户可以编辑的文本 Allow the user to type and be able to out
  • 如何使用 Composer 初始化 Symfony 控制台项目,以限制其坚持使用长期发行版本?

    我的目标是经营作曲家require命令来初始化 Symfony Console 项目 当运行作曲家的require命令 我相信可以将所需的包限制为特定版本 我正在考虑使用它来坚持 Symfony 的长期发行版本 它将支持更长时间 根据Sym
  • 在 C# 控制台应用程序中一次写入一个字符?

    我不知道如何解释这一点 基本上 我希望能够在控制台窗口中编写一行文本 就像旧的角色扮演游戏用来编写对话一样 一次一个字符 游戏 口袋妖怪不可思议的迷宫 中的示例 顺便说一下 包含剧透 http www youtube com watch v
  • 如何检查 Java 程序的输入/输出流是否连接到终端?

    我希望 Java 程序根据其用途具有不同的默认设置 详细程度 可能支持彩色输出 在 C 语言中 有一个 isatty 函数 如果文件描述符连接到终端 则该函数将返回 1 否则返回 0 Java 中有类似的东西吗 我没有在 JavaDoc 中
  • 如何在 IE8 中转储 JavaScript 变量?

    我有一个需要在 IE8 中检查的对象 我尝试了开发者工具console log 他们的 Firebug 等价物 但是 当我将对象输出到日志时 console log Element element console log element 我
  • 在 Openshift 中哪里可以查看控制台日志?

    最近 我将 JSP 项目部署到 Openshift 服务器中 现在我的愿望是查看控制台日志 假设 如果我打印System out println Message 在我的 JSP 项目中 如何看到该消息打印到 Openshift 服务器的控制
  • 在控制台窗口中以横向树格式漂亮打印输出

    我有一本使用 Python 创建的字典 d a Adam Book 4 b Bill TV 6 Jill Sports 1 Bill Computer 5 c Bill Sports 3 d Quin Computer 3 Adam Com
  • Opera 控制台中出现红色警告消息

    出现红色消息 大概是在浏览器自动更新之后 Warning 该区域仅供开发人员使用 众所周知 骗子会鼓励人们在此处复制 粘贴信息来破解帐户 如果您不确定 请不要继续 浏览器是 Opera 87 0 4390 36 似乎它不适用于 Chrome
  • 如何在 SpiderMonkey JavaScript 中获取控制台输入?

    我目前正在使用 Spidermonkey 来运行我的 JavaScript 代码 我想知道是否有一个函数可以从控制台获取输入 类似于 Python 的做法 var raw input 或者在 C 中 std cin gt gt var 我环
  • 从一个程序执行并捕获另一个程序

    在 win32 中用 C 编程 在另一个 win32 程序中执行 win32 控制台程序并让启动执行的程序捕获输出的最佳方法是什么 目前我使程序将输出重定向到文件 但我确信我必须能够打开某种管道 Use the CreateProcess
  • 为什么“System.out.println”在 Android 中不起作用?

    我想在控制台中打印一些内容 以便我可以调试它 但由于某种原因 我的 Android 应用程序中没有打印任何内容 那我该如何调试呢 public class HelloWebview extends Activity WebView webv
  • 当 Eclipse 插件使用 JNI 时,如何将 JNI 控制台输出重定向到 Eclipse 控制台视图?

    我有一个 Eclipse 插件 A 它依赖于另一个插件 B 插件 B 只是一个 jar 的包装器 其中包含本机 dll 并执行 jni 功能 鉴于此设置 我在 A 的 Activator 类的 start 方法中有以下代码 MessageC
  • C# 有没有办法设置控制台应用程序的滚动位置

    你好 我已经在谷歌上搜索这个问题很长一段时间了 但找不到任何关于我将如何做这件事的结果 我目前有一个选择菜单 用户可以从中选择选项列表 该菜单从顶部开始 但每次刷新列表时窗口都会显示最后一个选项 我想要做的就是能够在窗口中显示带有所选选项的
  • Node.js:如何从模块内获取需要函数的文件名?

    我试图从需要模块功能的地方获取原始文件名 我知道你可以使用 filename获取当前文件 但我想获取原始文件 例如 我有一个简单的模块 模块 js module exports function return print function
  • CTRL+C 和 CTRL+Break 不同吗?

    我一直认为它们绝对是一样的 但我刚刚在以下位置找到了一些值 CTRL C EVENT 和 CTRL BREAK EVENT设置控制台Ctrl处理程序 http msdn microsoft com en us library ms68601
  • 如何启动 VBS 的交互式控制台?

    与这个问题非常相似 如何启动 Perl 的交互式控制台 https stackoverflow com questions 73667 how can i start an interactive console for perl 我只是希
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • 禁用显示控制台窗口

    我可以在哪里禁用 Microsoft Visual C 显示控制台窗口 在您的控制台应用程序中 转到 Properties gt Linker gt System change SubSystem to Windows 并在你的代码中 代替

随机推荐

  • 强化学习进阶 第七讲 TRPO

    转载自知乎专栏 天津包子馅儿 的知乎 今天开始我们的第七讲 xff0c TRPO 先简短地介绍一下 xff1a TRPO是英文单词Trust region policy optimization的简称 xff0c 翻译成中文是信赖域策略优化
  • 防抖(debounce)、节流(throttle)以及前端锁(mutex)

    节流和去抖的核心其实就是限制某一个方法被频繁触发 节流 xff1a 间隔时间段触发一次去抖 xff1a 对于一定时间段的连续的函数调用 xff0c 只让其执行一次 xff0c 两者有时候不需要细分 xff0c 节流去抖也可以合在一起 具体场
  • css3的动画属性总结

  • 算法题:按图找最近的路(js/python3)

    题目描述 xff1a 有一张 m n 的地图 xff0c 地图描述了起点和终点的位置 xff0c 也描述了两点间分布的高山湖泊 xff0c 高山湖泊挡住去路 xff0c 需要绕道行走 xff0c 请问从起点到终点的最短路径距离是多少 xff
  • git和远程仓库建立连接详细过程

    git和远程仓库建立连接详细过程 建立远程仓库 首先在github gitee上创建自己的一个仓库 xff0c 并将自己的路径复制下来 xff0c 如下图 建立本地仓库 本地新建文件夹存储工程文件 xff0c 并且初始化仓库 打开gitba
  • 微信小程序封装请求

    封装请求 解决的问题 很多页面中请求的url前半部分都是一样的 xff0c 重复书写导致页面代码冗余复杂同时逻辑容易不清晰 xff0c 所以采用单独将请求封装成一个文件 xff08 模块 xff09 使得这些问题得到解决 前期基础知识 un
  • 交响乐排布及乐器音色特点

    交响乐布局 乐器组成及音色特点 木管组及铜管组代表乐器 木管组 铜管组 钢琴键谱图 国际谱和大小字组记录方式对比 其他乐器在钢琴键盘上音域表示图示 单簧管和长笛音色特点 音色特点综合分析
  • 【matlab】获取文件夹下文件名或路径保存到txt

    获取某文件夹下的所有文件名并保存 当需要在某一个文件夹下获取子文件的所有文件名 xff0c 并进行保存时 xff0c 可使用下面的代码 xff1a Path 61 39 D 文件夹 39 设置数据存放的文件夹路径 File 61 dir f
  • pycharm:新建虚拟环境和安装依赖

    前言 小编深有体会 xff0c 在刚开始用pycharm跑python的项目的时候 xff0c 一时间不知道如何下手 xff0c 特别是作为一个新手小白 xff0c 这里总结了一份新手避坑指南 xff0c 主要是新建虚拟环境 xff08 生
  • unbuntu安装 PyTorch 1.7.0+ torchvision 0.8.1

    unbuntu安装 PyTorch 1 7 0 43 torchvision 0 8 1 一 创建环境二 启动环境三 查看电脑CUDA版本 xff0c 若电脑只有CPU则忽略这一步四 下载安装包到本地安装4 1 点击以下链接进入下载网站4
  • 树莓派VNC界面不显示或显示不全问题_解决方案

    刚开始上手树莓派的小伙伴们估计都遇到过这一问题 xff0c 用树莓派登录VNC时 xff0c 界面不显示或者界面显示的比例有问题 先打开VNC xff0c 输入自己的IP地址 xff0c 登录VNC 我这里在登录VNC时 xff0c VNC
  • ArcGIS Engine:对COM组件的调用返回了错误HRESULT E_FAIL

    最近做一个项目 xff0c 需要调用GP的 通视性 工具 该工具在ARCScene中界面如下 xff1a 需要两个参数 xff08 必选 xff09 xff0c 即视线和障碍物 xff0c 在 帮助 中查看要求参数都是FeatureLaye
  • idea 2019.3之后的版本的项目使用gradle构建,编译时会出现中文乱码

    目录 背景1 修改gradle编译选项2 修改idea设置3 其他方法 xff08 尝试后没有效果 xff09 3 1 修改File Encdoing3 2 修改idea的custom VM option 背景 把公司电脑的idea更新到了
  • shell编程3循环语句

    文章目录 shell编程3循环语句1 for循环1 1 基本格式1 2 类C语言格式 2 while循环2 1 基本格式2 2 死循环 3 until循环4 跳出循环4 1 continue4 2 break 5 实验5 1 编写脚本实现计
  • ArduPilot飞控之ubuntu22.04-Gazebo模拟

    ArduPilot飞控之ubuntu22 04 Gazebo模拟 1 源由2 Gazebo安装2 1 ubuntu22 04系统更新2 2 安装Gazebo Garden2 3 安装ArduPilot Gazebo插件2 3 1 基础库安装
  • ArduPilot飞控之DIY-F450计划

    ArduPilot飞控之DIY F450计划 1 历史2 源由3 计划3 1 硬件3 2 软件 4 动手4 1 接线4 1 1 ELRS nano接收机4 1 2 BN880 GPS模块4 1 3 Radio Telemetry 4 2 配
  • ArduPilot Kakute F7 AIO DIYF450 without GPS配置

    ArduPilot Kakute F7 AIO DIYF450 without GPS配置 1 源由2 配置2 1 Kakute F7 AIO相关配置2 1 1 串口规划2 1 2 电传配置2 1 3 GPS配置2 1 4 CRSF接收机配
  • ArduPilot之posHold&RTL实测

    ArduPilot之posHold amp RTL实测 1 源由2 模式配置3 测试步骤4 飞行实测5 总结6 参考资料7 附录 关于QGC 暂不支持MAVLink2 signing Protocol问题7 1 问题描述7 2 硬件配置7
  • BetaFlight统一硬件配置文件研读之resource命令

    BetaFlight统一硬件配置文件研读之resource命令 1 源由2 代码分析3 实例分析4 配置情况4 1 resource4 2 resource show 5 参考资料 统一硬件配置文件的设计是一种非常好的设计模式 xff0c
  • ArduPilot之开源代码UARTs and the Console使用

    ArduPilot之开源代码UARTs and the Console使用 1 源由2 UART定义2 1 HAL Empty2 2 HAL ChibiOS2 3 HAL ESP322 4 HAL Linux2 5 HAL SITL 3 配