一、串口设置
ArduPilot对串口的管理在
libraries/AP_SerialManager/AP_SerialManager.cpp
文件中实现。在AP_SerialManager.cpp的var_info[]中定义了各串口的功能和参数。分别包括
SERIALx_PROTOCOL
SERIALx_BAUD
SERIALx_OPTION
等参数。
SERIALx_PROTOCOL定义了串口的功能,比如用于Mavlink通讯、GPS、云台等。它的取值在AP_SerialManager.h中定义,由一个enum数据类型定义
cpp
enum SerialProtocol {
SerialProtocol_None = -1,
SerialProtocol_Console = 0, // unused
SerialProtocol_MAVLink = 1,
SerialProtocol_MAVLink2 = 2, // do not use - use MAVLink and provide instance of 1
SerialProtocol_FrSky_D = 3, // FrSky D protocol (D-receivers)
SerialProtocol_FrSky_SPort = 4, // FrSky SPort protocol (X-receivers)
SerialProtocol_GPS = 5,
SerialProtocol_GPS2 = 6, // do not use - use GPS and provide instance of 1
SerialProtocol_AlexMos = 7,
SerialProtocol_Gimbal = 8, // SToRM32, Siyi custom serial protocols
...
SERIALx_BAUD定义了串口的波特率,通常为57600、115200等数值。在设置参数时有可能会除以1000进行设置。
SERIALx_OPTION定义了串口的一些高级选项,如对数据进行反转、半双工模式、TX/RX 引脚交换等。
ArduPilot默认的串口配置如下
| 串口 | 功能 | 协议 | 波特率 |
|---|---|---|---|
| SERIAL0 | 控制台/地面站连接(Console) | USB端口,固定为MAVLink2 (协议值 2) | 115200 |
| SERIAL1 | 第一数据端口(Telem1) | MAVLink2 (协议值 2) | 57600 |
| SERIAL2 | 第二数据端口(Telem2) | MAVLink2 (协议值 2) | 57600 |
| SERIAL3 | 第一GPS端口(GPS1) | GPS (协议值 5) | 230400 |
| SERIAL4 | 第二GPS端口(GPS2) | GPS (协议值 5) | 230400 |
| SERIALx(其它) | 未定义 | None (协议值 -1) | 57600 |
可以通过修改它们的数值设置它们的功能和参数。
二、串口初始化
串口的初始化在AP_Vehicle::setup()函数中实现,顺序大致如下
cpp
void AP_Vehicle::setup()
{
...
serial_manager.init_console();
...
gcs().init();
...
serial_manager.init();
...
gcs().setup_console();
...
}
在函数中首先调用serial_manager.init_console()函数来实现对串口0(Console)进行初始化。后面调用serial_manager.init()函数,在init()函数中对所有串口进行遍历(从串口1开始),分别根据他们的参数设置进行初始化。上面程序执行过程也进行了GCS对象的初始化,GCS对象负责与地面站的通讯。