前言
ArduPilot 中的很多组件都依赖于 UARTs。它们被用于调试输出、遥测、GPS 模块等等。了解如何通过 HAL 与 UART 通信将有助于你理解很多 ArduPilot 的代码。
1 8个UARTs
ArduPilot 的 HAL 目前定义了8个 UARTs。HAL 本身并没有为这些 UARTs 定义任何特定的角色,但是 ArduPilot 的其他部分认为它们将被分配特定的功能。
与 sim_vehicle.py 一起使用串口的命令行选项应该在前面加上 -A 以传递给飞行器的二进制文件。请确保包含了 uart 协议。指定一个波特率不是必须的,但更能体现出一致性。
例如,sim_vehicle.py --console --map -A --serial5=uart:/dev/ttyS15:115200。uartX 选项比较老,serialX 选项比较新,比较方便。
ParamPrefix |
Sim_vehicle Cmd Line |
Def Role |
Default Connection |
SERIAL0_ |
- -uartA= or - -serial0= |
Console |
tcp:localhost:5760:wait |
SERIAL1_ |
- -uartC= or - -serial1= |
MAVLink |
tcp:localhost:5762 |
SERIAL2_ |
- -uartD= or - -serial2= |
MAVLink |
tcp:localhost:5763 |
SERIAL3_ |
- -uartB= or - -serial3= |
Simulated GPS |
|
SERIAL4_ |
- -uartE= or - -serial4= |
GPS |
Simulated GPS |
SERIAL5_ |
- -uartF= or - -serial5= |
||
SERIAL6_ |
- -uartG= or - -serial6= |
||
SERIAL7_ |
- -uartH= or - -serial7= |
如果你使用 ArduPilot HAL 编写自己的示例,那么你可以将这些 UART 用于任何你喜欢的目的,但是如果可能的话,你应该尽量使用上述分配,因为这将使你更容易适应现有代码。
你可以通过改变其 SERIALn_PROTOCOL 参数来改变 UART 的角色。可能的参数值在SERIAL1_PROTOCOL 的描述中列出。
去看看 libraries/AP_HAL/examples/UART_test 示例概述。它向前5个 UART 打印了一个 Hello 信息。在你的主板上试试,看看你是否能用 USB 串口适配器获得所有的输出显示。尝试改变示例中的波特率。
1.1 调试控制台
从历史上看,除了基本的5个 UARTs 外,在一些平台上还有一个附加的调试控制台。最近调试控制台被定向到 USB。在 SITL 上,调试被定向到一个终端,而 USB 在默认情况下被定向到端口5760。
如果你的板子确实设置了 HAL_OS_POSIX_IO(在 AP_HAL/AP_HAL_Boards.h 中检查),那么试着在 UART_test 示例中添加一些 ::printf() 和其他 stdio 函数。
如果运行不了::printf,可能是你的特定文件(例如一个库)顶部没有 #include <stdio.h>,只要加上它就可以了。
你也可以使用 hal.console->printf() 来指定 USB 端口。
2 UART功能
每个 UART 都有一些基本的 IO 功能可用。主要的功能有:
- printf - 格式化的打印;
- printf_P - 带有 progmem 字符串的格式化打印(在 AVR 板上可节省内存);
- println - 打印和换行;
- write - 写一堆字节;
- read - 读一些字节;
- available - 检查是否有字节在等待;
- txspace - 检查有多少可用的传出缓冲区空间;
- get_flow_control - 检查 UART 是否具有流控制功能。
去看看 AP_HAL 中每个声明,并在 UART_test 中尝试一下。