MK飞控板通过串口提供了大量的调试设置信息。上位机通过串口向MK飞控板发送命令要求,命令支持采集传感器信息、测试电机、传递杆量、3D显示等功能。代码实现放在Uart.c中,两个关键函数是TransmitTxData和ProcessRxData,按照固定数据帧格式进行数据的传送和接收处理。MK的串口数据采用了modified 64base加密,加密后每个字符前均加上'=', 然后加两byte crc校验位。接受到的数据由Decode64负责对加密数据进行逆向解码。
TransmitTxData处理好的数据交给SendOutData进行具体的传输。函数原型为void SendOutData(uint8_t cmd, uint8_t addr, uint8_t numofbuffers, ...)。其中,Numofbuffers代表需要发送的数据的种类数,参数为地址及数据大小。举例:
SendOutData('L',FC_ADDRESS,3,&MenuItem,sizeof(MenuItem),&MaxMenuItem, sizeof(MaxMenuItem), DisplayBuff, sizeof(DisplayBuff));
串口接收中断函数ISR(USART0_RX_vect)判断数据'#'开始,'/r'结束。接收一组数据后进行crc校验,校验通过后设置终止位,锁定rx buffer。待ProcessRxData处理完一组合法的接收数据时rx buffer解锁。
串口协议说明:
Serial Protocol
Start-Byte | Address Byte | ID-Byte | n Data-Bytes coded | CRC-Byte1 | CRC-Byte2 | Stop-Byte |
'#' | 'a'+ Addr | 'V','D' etc | "modified-base64" | variable | variable | '/r' |
Common Commands
| Received | Send | ||||||
Description | ID | Address | Data | ID | Address | Data | ||
Labels of analog values | 'a' | AnyAddr | u8 Index of Analog Channel | 'A' | SlaveAddr | u8 Index, char[16] label text | ||
ExternControl | 'b' | AnyAddr | ExternControl Struct | 'B' | SlaveAddr | ConfirmFrame | ||
Request display | 'h' | AnyAddr | u8 ~RemoteKey, u8 AutoSendInterval | 'H' | SlaveAddr | char[80] DisplayText | ||
Request display | 'l' | AnyAddr | u8 MenuItem | 'L' | SlaveAddr | u8 MenuItem, u8 MaxMenuItem, char[80] Display Text | ||
Version Request | 'v' | AnyAddr | none | 'V' | SlaveAddr | !Version Info Struct | ||
Debug Request | 'd' | AnyAddr | u8 AutoSendInterval | 'D' | SlaveAddr | Debug Data Struct | ||
Reset | 'R' | AnyAddr | none | - | - | - | ||
Get External Control | 'g' | AnyAddr | none | 'G' | SlaveAddr | ExternControl Strcut |
Flight-Ctrl
| Received by FC | Send by FC |
| |||||
Description | ID | Address | Data | ID | Address | Data | since FC | |
Compass Heading | 'K' | FC-Addr | s16 Compass Value | 'k' | MK3MAG-Addr | Nick Roll Attitude ... | 0.71f | |
Engine Test | 't' | FC-Addr | u8[16] values for the engines | 'T' | FC-Addr | - | 0.71f | |
Settings Request | 'q' | FC-Addr | u8 Settings Index ( 1..5 READ or 0xff for actual setting) | 'Q' | FC-Addr | u8 Settings Index, u8 Settings Version, Settings Struct | 0.71f | |
Write Settings | 's' | FC-Addr | u8 Settings Index, u8 Settings Version, Settings Struct | 'S' | FC-Addr | u8 Settings Index (1 ..5, 0=Error) | 0.71f | |
Read PPM Channels | 'p' | FC-Addr | none | 'P' | FC-Addr | s16 PPM-Array[11] | 0.71f | |
Set 3D-Data Interval | 'c' | AnyAddr | u8 Interval | 'C' | FC-Addr | struct Data3D | 0.72p | |
Mixer Request | 'n' | FC-Addr | none | 'N' | FC-Addr | u8 MixerRevision, u8 Name[12], u8 MixerTable[16][4] | 0.73 | |
Mixer Write | 'm' | FC-Addr | u8 MixerRevision, u8 Name[12], u8 MixerTable[16][4] | 'M' | FC-Addr | u8 ack (1 = okay, 0 = error) | 0.73 | |
Change setting | 'f' | FC-Addr | u8 Number of new Setting | 'F' | FC-Addr | u8 Number | 0.77 | |
Serial Poti | 'y' | FC-Addr | s8 Poti[12] | - | - | - | 0.77 | |
BL parameter request | 'u' | FC-Addr | u8 BL_Addr | 'U' | FC-Addr | u8 Status1, u8 Status2, u8 BL_Addr, BLConfig Struct | 0.80 | |
BL parameter write | 'w' | FC-Addr | u8 BL_Addr, BLConfig Struct | 'W' | FC-Addr | u8Status1, u8 Status2 | 0.80 |