移植MAVLINK到STM32詳細教程之三

在前面教程的基礎上繼續移植優化,以前的沒有加緩衝區,沒有接收函數功能,這裏進行統一的講解                            做者:恆久力行  qq:624668529前端

緩衝區對於接受來講頗有必要,爲了數據的穩定性和實時性必需要加上緩衝。沒有緩衝很容易形成數據丟失

一:利用以前移植好的工程,在其基礎上進行改動

   1.將兩個文件mavlink_usart_fifo.h  mavlink_usart_fifo.c添加到工程裏(都是關於緩衝區的底層串口加緩衝區函數)

 mavlink_usart_fifo.h
  1. #ifndef _USART_FIFO_H_//做者:恆久力行 qq:624668529
  2. #define _USART_FIFO_H_
  3. #include"stdint.h"
  4. #definetrue1
  5. #definefalse0
  6. typedefstruct _fifo {
  7. uint8_t* buf;
  8. uint16_t length;
  9. uint16_t head;
  10. uint16_t tail;
  11. }fifo_t;
  12. uint8_t fifo_read_ch(fifo_t* fifo,uint8_t* ch);
  13. uint8_t fifo_write_ch(fifo_t* fifo,uint8_t ch);
  14. uint16_t fifo_free(fifo_t* fifo);
  15. uint16_t fifo_used(fifo_t* fifo);
  16. void fifo_init(fifo_t* fifo,uint8_t* buf,uint16_t length);
  17. uint8_t serial_write_buf(uint8_t* buf,uint16_t length);
  18. uint8_t serial_read_ch(void);
  19. uint16_t serial_free(void);
  20. uint16_t serial_available(void);
  21. #endif/*_USART_FIFO_H_*/
 
mavlink_usart_fifo.c
  1. #include"sys.h"//做者:恆久力行 qq:624668529
  2. #include"mavlink_usart_fifo.h"
  3. #define UART_TX_BUFFER_SIZE 255
  4. #define UART_RX_BUFFER_SIZE 255
  5. fifo_t uart_rx_fifo, uart_tx_fifo;
  6. uint8_t uart_tx_buf[UART_TX_BUFFER_SIZE], uart_rx_buf[UART_RX_BUFFER_SIZE];
  7. /** @brief 讀FIFO
  8. * @param fifo 待讀緩衝區
  9. * *ch 讀到的數據
  10. * @return
  11. * 正確讀取,1; 無數據,0
  12. */
  13. uint8_t fifo_read_ch(fifo_t* fifo,uint8_t* ch)
  14. {
  15. if(fifo->tail == fifo->head)returnfalse;
  16. *ch = fifo->buf[fifo->tail];
  17. if(++fifo->tail >= fifo->length) fifo->tail =0;
  18. returntrue;
  19. }
  20. /** @brief 寫一字節數據到FIFO
  21. * @param fifo 待寫入緩衝區
  22. * ch 待寫入的數據
  23. * @return
  24. * 正確,1; 緩衝區滿,0
  25. */
  26. uint8_t fifo_write_ch(fifo_t* fifo,uint8_t ch)
  27. {
  28. uint16_t h = fifo->head;
  29. if(++h >= fifo->length) h =0;
  30. if(h == fifo->tail)returnfalse;
  31. fifo->buf[fifo->head]= ch;
  32. fifo->head = h;
  33. returntrue;
  34. }
  35. /** @brief 返回緩衝區剩餘字節長度
  36. * @param fifo
  37. * @return
  38. * 剩餘空間
  39. *
  40. * @note 剩餘字節長度大於等於2時,纔可寫入數據
  41. */
  42. uint16_t fifo_free(fifo_t* fifo)
  43. {
  44. uint16_t free;
  45. if(fifo->head >= fifo->tail) free = fifo->tail +(fifo->length - fifo->head);
  46. else free = fifo->tail - fifo->head;
  47. return free;
  48. }
  49. uint16_t fifo_used(fifo_t* fifo)
  50. {
  51. uint16_t used;
  52. if(fifo->head >= fifo->tail) used = fifo->head - fifo->tail;
  53. else used = fifo->head +(fifo->length - fifo->tail);
  54. return used;
  55. }
  56. /** @brief 初始化緩衝區
  57. * @param *fifo
  58. * *buf
  59. * length
  60. */
  61. void fifo_init(fifo_t* fifo,uint8_t* buf,uint16_t length)
  62. {
  63. uint16_t i;
  64. fifo->buf = buf;
  65. fifo->length = length;
  66. fifo->head =0;
  67. fifo->tail =0;
  68. for(i=0; i<length; i++) fifo->buf[i]=0;
  69. }
  70. /** @brief 寫數據到串口,啓動發射
  71. *
  72. * @note 數據寫入發射緩衝區後,啓動發射中斷,在中斷程序,數據自動發出
  73. */
  74. uint8_t serial_write_buf(uint8_t* buf,uint16_t length){
  75. uint16_t i;
  76. if(length ==0)returnfalse;
  77. for(i =0; length >0; length--, i++){
  78. fifo_write_ch(&uart_tx_fifo, buf[i]);
  79. }
  80. USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  81. returntrue;
  82. }
  83. /** @brief 自串口讀數據
  84. * @return 一字節數據
  85. */
  86. uint8_t serial_read_ch(void){
  87. uint8_t ch;
  88. fifo_read_ch(&uart_rx_fifo,&ch);
  89. return ch;
  90. }
  91. /** @breif 檢測發射緩衝區剩餘字節長度
  92. * @return 剩餘字節長度
  93. */
  94. uint16_t serial_free(void){
  95. return fifo_free(&uart_tx_fifo);
  96. }
  97. uint16_t serial_available(void){
  98. return fifo_used(&uart_rx_fifo);
  99. }
  100. void USART1_IRQHandler(void)
  101. {
  102. uint8_t c;
  103. if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)//數據接收終端
  104. {
  105. c = USART_ReceiveData(USART1);
  106. fifo_write_ch(&uart_rx_fifo, c);
  107. //USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
  108. }
  109. if(USART_GetITStatus(USART1, USART_IT_TXE)!= RESET)//數據發送中斷
  110. {
  111. if(fifo_read_ch(&uart_tx_fifo,&c))
  112. USART_SendData(USART1, c);
  113. else
  114. USART_SendData(USART1,0x55);
  115. if(fifo_used(&uart_tx_fifo)==0)// Check if all data is transmitted . if yes disable transmitter UDRE interrupt
  116. {
  117. // Disable the EVAL_COM1 Transmit interrupt
  118. USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
  119. }
  120. }
  121. }
 

2.在usart.c中屏蔽USART1_IRQHandler函數
usart.c全代碼

  1. #include"sys.h"//做者:恆久力行 qq:624668529
  2. #include"usart.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //若是使用ucos,則包括下面的頭文件便可.
  5. #if SYSTEM_SUPPORT_OS
  6. #include"includes.h"//ucos 使用
  7. #endif
  8. //////////////////////////////////////////////////////////////////////////////////
  9. //本程序只供學習使用,未經做者許可,不得用於其它任何用途
  10. //ALIENTEK STM32F4探索者開發板
  11. //串口1初始化
  12. //正點原子@ALIENTEK
  13. //技術論壇:www.openedv.com
  14. //修改日期:2014/6/10
  15. //版本:V1.5
  16. //版權全部,盜版必究。
  17. //Copyright(C) 廣州市星翼電子科技有限公司 2009-2019
  18. //All rights reserved
  19. //********************************************************************************
  20. //V1.3修改說明
  21. //支持適應不一樣頻率下的串口波特率設置.
  22. //加入了對printf的支持
  23. //增長了串口接收命令功能.
  24. //修正了printf第一個字符丟失的bug
  25. //V1.4修改說明
  26. //1,修改串口初始化IO的bug
  27. //2,修改了USART_RX_STA,使得串口最大接收字節數爲2的14次方
  28. //3,增長了USART_REC_LEN,用於定義串口最大容許接收的字節數(不大於2的14次方)
  29. //4,修改了EN_USART1_RX的使能方式
  30. //V1.5修改說明
  31. //1,增長了對UCOSII的支持
  32. //////////////////////////////////////////////////////////////////////////////////
  33. //////////////////////////////////////////////////////////////////
  34. //加入如下代碼,支持printf函數,而不須要選擇use MicroLIB
  35. #if 1
  36. #pragmaimport(__use_no_semihosting)
  37. //標準庫須要的支持函數
  38. struct __FILE
  39. {
  40. int handle;
  41. };
  42. FILE __stdout;
  43. //定義_sys_exit()以免使用半主機模式
  44. _sys_exit(int x)
  45. {
  46. x = x;
  47. }
  48. //重定義fputc函數
  49. int fputc(int ch,FILE*f)
  50. {
  51. while((USART1->SR&0X40)==0);//循環發送,直到發送完畢
  52. USART1->DR =(u8) ch;
  53. return ch;
  54. }
  55. #endif
  56. #if EN_USART1_RX //若是使能了接收
  57. //串口1中斷服務程序
  58. //注意,讀取USARTx->SR能避免莫名其妙的錯誤
  59. u8 USART_RX_BUF[USART_REC_LEN];//接收緩衝,最大USART_REC_LEN個字節.
  60. //接收狀態
  61. //bit15, 接收完成標誌
  62. //bit14, 接收到0x0d
  63. //bit13~0, 接收到的有效字節數目
  64. u16 USART_RX_STA=0;//接收狀態標記
  65. //初始化IO 串口1
  66. //bound:波特率
  67. void uart_init(u32 bound){
  68. //GPIO端口設置
  69. GPIO_InitTypeDef GPIO_InitStructure;
  70. USART_InitTypeDef USART_InitStructure;
  71. NVIC_InitTypeDef NVIC_InitStructure;
  72. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA時鐘
  73. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1時鐘
  74. //串口1對應引腳複用映射
  75. GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//GPIOA9複用爲USART1
  76. GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//GPIOA10複用爲USART1
  77. //USART1端口配置
  78. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//GPIOA9與GPIOA10
  79. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//複用功能
  80. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  81. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推輓複用輸出
  82. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  83. GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA9,PA10
  84. //USART1 初始化設置
  85. USART_InitStructure.USART_BaudRate = bound;//波特率設置
  86. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長爲8位數據格式
  87. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一箇中止位
  88. USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
  89. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
  90. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收發模式
  91. USART_Init(USART1,&USART_InitStructure);//初始化串口1
  92. USART_Cmd(USART1, ENABLE);//使能串口1
  93. //USART_ClearFlag(USART1, USART_FLAG_TC);
  94. #if EN_USART1_RX
  95. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啓相關中斷
  96. //Usart1 NVIC 配置
  97. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中斷通道
  98. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶佔優先級3
  99. NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;//子優先級3
  100. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
  101. NVIC_Init(&NVIC_InitStructure);//根據指定的參數初始化VIC寄存器、
  102. #endif
  103. }
  104. //void USART1_IRQHandler(void) //串口1中斷服務程序
  105. //{
  106. // u8 Res;
  107. //#if SYSTEM_SUPPORT_OS //若是SYSTEM_SUPPORT_OS爲真,則須要支持OS.
  108. // OSIntEnter();
  109. //#endif
  110. // if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷(接收到的數據必須是0x0d 0x0a結尾)
  111. // {
  112. // Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數據
  113. //
  114. // if((USART_RX_STA&0x8000)==0)//接收未完成
  115. // {
  116. // if(USART_RX_STA&0x4000)//接收到了0x0d
  117. // {
  118. // if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,從新開始
  119. // else USART_RX_STA|=0x8000; //接收完成了
  120. // }
  121. // else //還沒收到0X0D
  122. // {
  123. // if(Res==0x0d)USART_RX_STA|=0x4000;
  124. // else
  125. // {
  126. // USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  127. // USART_RX_STA++;
  128. // if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,從新開始接收
  129. // }
  130. // }
  131. // }
  132. // }
  133. //#if SYSTEM_SUPPORT_OS //若是SYSTEM_SUPPORT_OS爲真,則須要支持OS.
  134. // OSIntExit();
  135. //#endif
  136. //}
  137. #endif
 

3.添加mavlink_avoid_errors.h裏面的代碼以下,這個代碼是用來避免錯誤的,跟mdk編譯器相關的

  1. /** @file mavlink_avoid_errors.h//做者:恆久力行 qq:624668529
  2. * @簡介:本文件是由624668529添加,用來統一解決mavlink報錯信息
  3. * @see QQ624668529
  4. */
  5. #ifndef MAVLINK_AVOID_ERRORS_H
  6. #define MAVLINK_AVOID_ERRORS_H
  7. #include"stdio.h"
  8. #include"stdint.h"
  9. /*解決..\MAVLINK\common\../mavlink_types.h(53): error: #20: identifier "pack" is undefined*/
  10. #define MAVPACKED( __Declaration__ ) __Declaration__
  11. /*解決..\MAVLINK\common\../mavlink_types.h(53): error: #3092: anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions*/
  12. #pragma anon_unions
  13. #defineinline __inline
  14. //#ifndef memset//由624668529添加 2018-08-24
  15. //void *memset(void *dest, int data, size_t length) {
  16. // uint32_t i;
  17. // int *point = dest;
  18. // for(i=0; i<length; i++) point[i] = data;
  19. // return dest;
  20. //}
  21. //#endif
  22. //#ifndef memcpy//由624668529添加 2018-08-24
  23. //void *memcpy(void *dest, const void *src, size_t n)
  24. //{
  25. // unsigned char *pout = (unsigned char*)dest;
  26. // unsigned char *pin = (unsigned char*)src;
  27. // while (n-- > 0) *pout++ = *pin++;
  28. // return dest;
  29. //}
  30. //#endif
  31. #include"mavlink_types.h"
  32. #define MAVLINK_USE_CONVENIENCE_FUNCTIONS
  33. //#define MAVLINK_SEPARATE_HELPERS
  34. //mavlink_system_t mavlink_system = {0,0};
  35. //mavlink_system_t mavlink_system = {
  36. // 1,
  37. // 1
  38. //}; // System ID, 1-255, Component/Subsystem ID, 1-255
  39. //void comm_send_ch(mavlink_channel_t chan, uint8_t buf)
  40. //{
  41. // chan=chan;
  42. // USART_SendData(USART1, buf); //向串口1發送數據
  43. // while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
  44. //}
  45. #include"mavlink.h"
  46. #include"mavlink_helpers.h"
  47. #endif//AVLINK_AVOID_ERRORS_H
 

4.添加open_tel_mavlink.h 和open_tel_mavlink.c 這兩個函數是測試mavlink通訊的上層代碼

open_tel_mavlink.h
  1. #ifndef __OPEN_TEL_MAVLINK_H//做者:恆久力行  qq:624668529
  2. #define __OPEN_TEL_MAVLINK_H
  3. //#include "./minimal/minimal/minimal.h"
  4. #include"define.h"
  5. #include"mavlink_avoid_errors.h"
  6. #include"stdint.h"
  7. void mavlink_send_message(mavlink_channel_t chan,enum ap_message id,uint16_t packet_drops);
  8. void update(void);
  9. void handleMessage(mavlink_message_t* msg);
  10. #endif/*__OPENTEL_MAVLINK_H*/
open_tel_mavlink.c
  1. #include"open_tel_mavlink.h"//做者:恆久力行  qq:624668529
  2. ////#include "mavlink_usart_fifo.h"
  3. //#include "mavlink_avoid_errors.h"
  4. //#include "mavlink_types.h"
  5. //#include "mavlink_avoid_errors.h"
  6. #include"define.h"
  7. #include"stdint.h"
  8. ////Add By BigW
  9. typedefuint8_tbool;
  10. //typedef struct {
  11. // char c;
  12. //} prog_char_t;
  13. //
  14. // This is the state of the flight control system
  15. // There are multiple states defined such as STABILIZE, ACRO,
  16. staticint8_t control_mode = STABILIZE;
  17. mavlink_channel_t chan;
  18. //uint16_t packet_drops;
  19. mavlink_heartbeat_t heartbeat;
  20. mavlink_attitude_t attitude;
  21. mavlink_global_position_int_t position;
  22. //mavlink_ahrs_t ahrs;
  23. uint8_t buf[100];
  24. ////End Add By BigW
  25. //// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
  26. // this costs us 51 bytes, but means that low priority
  27. // messages don't block the CPU
  28. staticmavlink_statustext_t pending_status;
  29. // true when we have received at least 1 MAVLink packet
  30. staticbool mavlink_active;
  31. // check if a message will fit in the payload space available
  32. #define CHECK_PAYLOAD_SIZE(id)if(payload_space < MAVLINK_MSG_ID_ ## id ## _LEN) return false
  33. void handleMessage(mavlink_message_t* msg);
  34. /*
  35. * !!NOTE!!
  36. *
  37. * the use of NOINLINE separate functions for each message type avoids
  38. * a compiler bug in gcc that would cause it to use far more stack
  39. * space than is needed. Without the NOINLINE we use the sum of the
  40. * stack needed for each message type. Please be careful to follow the
  41. * pattern below when adding any new messages
  42. */
  43. static NOINLINE void send_heartbeat(mavlink_channel_t chan)
  44. {
  45. uint8_t base_mode = MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
  46. uint8_t system_status = MAV_STATE_ACTIVE;
  47. uint32_t custom_mode = control_mode;
  48. // work out the base_mode. This value is not very useful
  49. // for APM, but we calculate it as best we can so a generic
  50. // MAVLink enabled ground station can work out something about
  51. // what the MAV is up to. The actual bit values are highly
  52. // ambiguous for most of the APM flight modes. In practice, you
  53. // only get useful information from the custom_mode, which maps to
  54. // the APM flight mode and has a well defined meaning in the
  55. // ArduPlane documentation
  56. base_mode = MAV_MODE_FLAG_STABILIZE_ENABLED;
  57. switch(control_mode){
  58. case AUTO:
  59. case RTL:
  60. case LOITER:
  61. case GUIDED:
  62. case CIRCLE:
  63. base_mode |= MAV_MODE_FLAG_GUIDED_ENABLED;
  64. // note that MAV_MODE_FLAG_AUTO_ENABLED does not match what
  65. // APM does in any mode, as that is defined as "system finds its own goal
  66. // positions", which APM does not currently do
  67. break;
  68. }
  69. // all modes except INITIALISING have some form of manual
  70. // override if stick mixing is enabled
  71. base_mode |= MAV_MODE_FLAG_MANUAL_INPUT_ENABLED;
  72. #if HIL_MODE != HIL_MODE_DISABLED
  73. base_mode |= MAV_MODE_FLAG_HIL_ENABLED;
  74. #endif
  75. // we are armed if we are not initialising
  76. if(0){//motors.armed()) {
  77. base_mode |= MAV_MODE_FLAG_SAFETY_ARMED;
  78. }
  79. // indicate we have set a custom mode
  80. base_mode |= MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
  81. mavlink_msg_heartbeat_send(
  82. chan,
  83. MAV_TYPE_QUADROTOR,
  84. MAV_AUTOPILOT_ARDUPILOTMEGA,
  85. base_mode,
  86. custom_mode,
  87. system_status);
  88. }
  89. static NOINLINE void send_attitude(mavlink_channel_t chan)
  90. {
  91. mavlink_msg_attitude_send(
  92. chan,
  93. ++buf[1],//millis(),
  94. ++buf[2],//ahrs.roll,
  95. ++buf[3],//ahrs.pitch,
  96. ++buf[4],//ahrs.yaw,
  97. ++buf[5],//omega.x,
  98. ++buf[6],//omega.y,
  99. ++buf[7]);//omega.z);
  100. }
  101. staticvoid NOINLINE send_location(mavlink_channel_t chan)
  102. {
  103. //Matrix3f rot = ahrs.get_dcm_matrix(); // neglecting angle of attack for now
  104. mavlink_msg_global_position_int_send(
  105. chan,
  106. 1,//millis(),
  107. 2,//current_loc.lat, // in 1E7 degrees
  108. 3,//current_loc.lng, // in 1E7 degrees
  109. 4,//g_gps->altitude * 10, // millimeters above sea level
  110. 5,//(current_loc.alt - home.alt) * 10, // millimeters above ground
  111. 6,//g_gps->ground_speed * rot.a.x, // X speed cm/s
  112. 7,//g_gps->ground_speed * rot.b.x, // Y speed cm/s
  113. 8,//g_gps->ground_speed * rot.c.x,
  114. 9);//g_gps->ground_course); // course in 1/100 degree
  115. }
  116. //static void NOINLINE send_ahrs(mavlink_channel_t chan)
  117. //{
  118. // //Vector3f omega_I = ahrs.get_gyro_drift();
  119. // mavlink_msg_ahrs_send(
  120. // chan,
  121. // ++buf[8],//omega_I.x,
  122. // ++buf[9],//omega_I.y,
  123. // ++buf[10],//omega_I.z,
  124. // 1,
  125. // 0,
  126. // ++buf[11],//ahrs.get_error_rp(),
  127. // ++buf[12]);//ahrs.get_error_yaw());
  128. //}
  129. staticvoid NOINLINE send_statustext(mavlink_channel_t chan)
  130. {
  131. }
  132. // are we still delaying telemetry to try to avoid Xbee bricking?
  133. staticbool telemetry_delayed(mavlink_channel_t chan)
  134. {
  135. returnfalse;
  136. }
  137. // try to send a message, return false if it won't fit in the serial tx buffer
  138. staticbool mavlink_try_send_message(mavlink_channel_t chan,enum ap_message id,uint16_t packet_drops)
  139. {
  140. int16_t payload_space = serial_free();
  141. if(telemetry_delayed(chan)){
  142. returnfalse;
  143. }
  144. switch(id){
  145. case MSG_HEARTBEAT:
  146. CHECK_PAYLOAD_SIZE(HEARTBEAT);
  147. send_heartbeat(chan);
  148. break;
  149. case MSG_ATTITUDE:
  150. CHECK_PAYLOAD_SIZE(ATTITUDE);
  151. send_attitude(chan);
  152. break;
  153. case MSG_LOCATION:
  154. CHECK_PAYLOAD_SIZE(GLOBAL_POSITION_INT);
  155. send_location(chan);
  156. break;
  157. // case MSG_AHRS:
  158. // CHECK_PAYLOAD_SIZE(AHRS);
  159. // send_ahrs(chan);
  160. // break;
  161. case MSG_STATUSTEXT:
  162. CHECK_PAYLOAD_SIZE(STATUSTEXT);
  163. send_statustext(chan);
  164. break;
  165. default:
  166. break;
  167. }
  168. returntrue;
  169. }
  170. #define MAX_DEFERRED_MESSAGES MSG_RETRY_DEFERRED
  171. staticstruct mavlink_queue {
  172. enum ap_message deferred_messages[MAX_DEFERRED_MESSAGES];
  173. uint8_t next_deferred_message;
  174. uint8_t num_deferred_messages;
  175. } mavlink_queue[2];
  176. // send a message using mavlink
  177. void mavlink_send_message(mavlink_channel_t chan,enum ap_message id,uint16_t packet_drops)
  178. {
  179. uint8_t i, nextid;
  180. struct mavlink_queue *q =&mavlink_queue[(uint8_t)chan];
  181. // see if we can send the deferred messages, if any
  182. while(q->num_deferred_messages !=0){
  183. if(!mavlink_try_send_message(chan,
  184. q->deferred_messages[q->next_deferred_message],
  185. packet_drops)){
  186. break;
  187. }
  188. q->next_deferred_message++;
  189. if(q->next_deferred_message == MAX_DEFERRED_MESSAGES){
  190. q->next_deferred_message =0;
  191. }
  192. q->num_deferred_messages--;
  193. }
  194. if(id == MSG_RETRY_DEFERRED){
  195. return;
  196. }
  197. // this message id might already be deferred
  198. for(i=0, nextid = q->next_deferred_message; i < q->num_deferred_messages; i++){
  199. if(q->deferred_messages[nextid]== id){
  200. // its already deferred, discard
  201. return;
  202. }
  203. nextid++;
  204. if(nextid == MAX_DEFERRED_MESSAGES){
  205. nextid =0;
  206. }
  207. }
  208. if(q->num_deferred_messages !=0||
  209. !mavlink_try_send_message(chan, id, packet_drops)){
  210. // can't send it now, so defer it
  211. if(q->num_deferred_messages == MAX_DEFERRED_MESSAGES){
  212. // the defer buffer is full, discard
  213. return;
  214. }
  215. nextid = q->next_deferred_message + q->num_deferred_messages;
  216. if(nextid >= MAX_DEFERRED_MESSAGES){
  217. nextid -= MAX_DEFERRED_MESSAGES;
  218. }
  219. q->deferred_messages[nextid]= id;
  220. q->num_deferred_messages++;
  221. }
  222. }
  223. void mavlink_send_text(mavlink_channel_t chan,enum gcs_severity severity,char*str)
  224. {
  225. if(telemetry_delayed(chan)){
  226. return;
  227. }
  228. if(severity == SEVERITY_LOW){
  229. // send via the deferred queuing system
  230. pending_status.severity =(uint8_t)severity;
  231. mav_array_memcpy((char*)pending_status.text, str,sizeof(pending_status.text));
  232. mavlink_send_message(chan, MSG_STATUSTEXT,0);
  233. }else{
  234. // send immediately
  235. mavlink_msg_statustext_send(
  236. chan,
  237. severity,
  238. str);
  239. }
  240. }
  241. void update(void)
  242. {
  243. // receive new packets
  244. mavlink_message_t msg;
  245. mavlink_status_t status;
  246. status.packet_rx_drop_count =0;
  247. // process received bytes
  248. while(serial_available())
  249. {
  250. uint8_t c = serial_read_ch();
  251. // Try to get a new message
  252. if(mavlink_parse_char(chan, c,&msg,&status)){
  253. mavlink_active =true;
  254. //printf("%c",c);
  255. printf("Received message with ID %d, sequence: %d from component %d of system %d",\
  256. msg.msgid, msg.seq, msg.compid, msg.sysid);
  257. handleMessage(&msg);
  258. }
  259. }
  260. }
  261. void handleMessage(mavlink_message_t* msg)
  262. {
  263. //struct Location tell_command = {}; // command for telemetry
  264. switch(msg->msgid){
  265. case MAVLINK_MSG_ID_HEARTBEAT:{
  266. mavlink_msg_heartbeat_decode(msg,&heartbeat);
  267. break;
  268. }
  269. case MAVLINK_MSG_ID_ATTITUDE:{
  270. mavlink_msg_attitude_decode(msg,&attitude);
  271. break;
  272. }
  273. case MAVLINK_MSG_ID_GLOBAL_POSITION_INT:{
  274. mavlink_msg_global_position_int_decode(msg,&position);
  275. break;
  276. }
  277. //
  278. // case MAVLINK_MSG_ID_AHRS: {
  279. // mavlink_msg_ahrs_decode(msg, &ahrs);
  280. // break;
  281. // }
  282. default:
  283. break;
  284. }// end switch
  285. }// end handle mavlink

5.添加define.h函數,這裏是上層函數的一些結構類型定義,爲避免上層報錯就添加上(有興趣的能夠本身精簡)

  1. // -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-
  2. #ifndef _DEFINES_H//做者:恆久力行  qq:624668529
  3. #define _DEFINES_H
  4. // this avoids a very common config error
  5. #define ENABLE ENABLED
  6. #define DISABLE DISABLED
  7. // Flight modes
  8. // ------------
  9. #define YAW_HOLD 0
  10. #define YAW_ACRO 1
  11. #define YAW_AUTO 2
  12. #define YAW_LOOK_AT_HOME 3
  13. #define YAW_TOY 4// THOR This is the Yaw mode
  14. #define ROLL_PITCH_STABLE 0
  15. #define ROLL_PITCH_ACRO 1
  16. #define ROLL_PITCH_AUTO 2
  17. #define ROLL_PITCH_STABLE_OF 3
  18. #define ROLL_PITCH_TOY 4// THOR This is the Roll and Pitch
  19. // mode
  20. #define THROTTLE_MANUAL 0
  21. #define THROTTLE_HOLD 1
  22. #define THROTTLE_AUTO 2
  23. // active altitude sensor
  24. // ----------------------
  25. #define SONAR 0
  26. #define BARO 1
  27. #define SONAR_SOURCE_ADC 1
  28. #define SONAR_SOURCE_ANALOG_PIN 2
  29. // CH 7 control
  30. #define CH7_DO_NOTHING 0
  31. #define CH7_SET_HOVER 1
  32. #define CH7_FLIP 2
  33. #define CH7_SIMPLE_MODE 3
  34. #define CH7_RTL 4
  35. #define CH7_AUTO_TRIM 5
  36. #define CH7_ADC_FILTER 6
  37. #define CH7_SAVE_WP 7
  38. #define CH7_MULTI_MODE 8
  39. // Frame types
  40. #define QUAD_FRAME 0
  41. #define TRI_FRAME 1
  42. #define HEXA_FRAME 2
  43. #define Y6_FRAME 3
  44. #define OCTA_FRAME 4
  45. #define HELI_FRAME 5
  46. #define OCTA_QUAD_FRAME 6
  47. #define PLUS_FRAME 0
  48. #define X_FRAME 1
  49. #define V_FRAME 2
  50. // LED output
  51. #define NORMAL_LEDS 0
  52. #define AUTO_TRIM_LEDS 1
  53. #define CH_7_PWM_TRIGGER 1800
  54. #define CH_6_PWM_TRIGGER_HIGH 1800
  55. #define CH_6_PWM_TRIGGER 1500
  56. #define CH_6_PWM_TRIGGER_LOW 1200
  57. // Internal defines, don't edit and expect things to work
  58. // -------------------------------------------------------
  59. #define TRUE 1
  60. #define FALSE 0
  61. #defineToRad(x)(x*0.01745329252)// *pi/180
  62. #defineToDeg(x)(x*57.2957795131)// *180/pi
  63. #define DEBUG 0
  64. #define LOITER_RANGE 60// for calculating power outside of loiter radius
  65. #define T6 1000000
  66. #define T7 10000000
  67. // GPS type codes - use the names, not the numbers
  68. #define GPS_PROTOCOL_NONE -1
  69. #define GPS_PROTOCOL_NMEA 0
  70. #define GPS_PROTOCOL_SIRF 1
  71. #define GPS_PROTOCOL_UBLOX 2
  72. #define GPS_PROTOCOL_IMU 3
  73. #define GPS_PROTOCOL_MTK 4
  74. #define GPS_PROTOCOL_HIL 5
  75. #define GPS_PROTOCOL_MTK16 6
  76. #define GPS_PROTOCOL_AUTO 7
  77. #define CH_ROLL CH_1
  78. #define CH_PITCH CH_2
  79. #define CH_THROTTLE CH_3
  80. #define CH_RUDDER CH_4
  81. #define CH_YAW CH_4
  82. #define RC_CHANNEL_ANGLE 0
  83. #define RC_CHANNEL_RANGE 1
  84. #define RC_CHANNEL_ANGLE_RAW 2
  85. // HIL enumerations
  86. #define HIL_MODE_DISABLED 0
  87. #define HIL_MODE_ATTITUDE 1
  88. #define HIL_MODE_SENSORS 2
  89. #define ASCENDING 1
  90. #define DESCENDING -1
  91. #define REACHED_ALT 0
  92. // Auto Pilot modes
  93. // ----------------
  94. #define STABILIZE 0// hold level position
  95. #define ACRO 1// rate control
  96. #define ALT_HOLD 2// AUTO control
  97. #define AUTO 3// AUTO control
  98. #define GUIDED 4// AUTO control
  99. #define LOITER 5// Hold a single location
  100. #define RTL 6// AUTO control
  101. #define CIRCLE 7// AUTO control
  102. #define POSITION 8// AUTO control
  103. #define LAND 9// AUTO control
  104. #define OF_LOITER 10// Hold a single location using optical flow
  105. // sensor
  106. #define TOY_A 11// THOR Enum for Toy mode
  107. #define TOY_M 12// THOR Enum for Toy mode
  108. #define NUM_MODES 13
  109. #define SIMPLE_1 1
  110. #define SIMPLE_2 2
  111. #define SIMPLE_3 4
  112. #define SIMPLE_4 8
  113. #define SIMPLE_5 16
  114. #define SIMPLE_6 32
  115. // CH_6 Tuning
  116. // -----------
  117. #define CH6_NONE 0
  118. // Attitude
  119. #define CH6_STABILIZE_KP 1
  120. #define CH6_STABILIZE_KI 2
  121. #define CH6_STABILIZE_KD 29// duplicate with CH6_DAMP
  122. #define CH6_YAW_KP 3
  123. #define CH6_YAW_KI 24
  124. // Rate
  125. #define CH6_ACRO_KP 25
  126. #define CH6_RATE_KP 4
  127. #define CH6_RATE_KI 5
  128. #define CH6_RATE_KD 21
  129. #define CH6_YAW_RATE_KP 6
  130. #define CH6_YAW_RATE_KD 26
  131. // Altitude rate controller
  132. #define CH6_THROTTLE_KP 7
  133. // Extras
  134. #define CH6_TOP_BOTTOM_RATIO 8
  135. #define CH6_RELAY 9
  136. // Navigation
  137. #define CH6_TRAVERSE_SPEED 10// maximum speed to next way point
  138. #define CH6_NAV_KP 11
  139. #define CH6_LOITER_KP 12
  140. #define CH6_LOITER_KI 27
  141. // Trad Heli specific
  142. #define CH6_HELI_EXTERNAL_GYRO 13
  143. // altitude controller
  144. #define CH6_THR_HOLD_KP 14
  145. #define CH6_Z_GAIN 15
  146. #define CH6_DAMP 16// duplicate with CH6_YAW_RATE_KD
  147. // optical flow controller
  148. #define CH6_OPTFLOW_KP 17
  149. #define CH6_OPTFLOW_KI 18
  150. #define CH6_OPTFLOW_KD 19
  151. #define CH6_NAV_I 20
  152. #define CH6_LOITER_RATE_KP 22
  153. #define CH6_LOITER_RATE_KI 28
  154. #define CH6_LOITER_RATE_KD 23
  155. #define CH6_AHRS_YAW_KP 30
  156. #define CH6_AHRS_KP 31
  157. // nav byte mask
  158. // -------------
  159. #define NAV_LOCATION 1
  160. #define NAV_ALTITUDE 2
  161. #define NAV_DELAY 4
  162. // Commands - Note that APM now uses a subset of the MAVLink protocol
  163. // commands. See enum MAV_CMD in the GCS_Mavlink library
  164. #define CMD_BLANK 0// there is no command stored in the mem location
  165. // requested
  166. #define NO_COMMAND 0
  167. #define LOITER_MODE 1
  168. #define WP_MODE 2
  169. #define CIRCLE_MODE 3
  170. #define NO_NAV_MODE 4
  171. #define TOY_MODE 5// THOR This mode defines the Virtual
  172. // WP following mode
  173. // TOY mixing options
  174. #define TOY_LOOKUP_TABLE 0
  175. #define TOY_LINEAR_MIXER 1
  176. #define TOY_EXTERNAL_MIXER 2
  177. // Waypoint options
  178. #define MASK_OPTIONS_RELATIVE_ALT 1
  179. #define WP_OPTION_ALT_CHANGE 2
  180. #define WP_OPTION_YAW 4
  181. #define WP_OPTION_ALT_REQUIRED 8
  182. #define WP_OPTION_RELATIVE 16
  183. //#define WP_OPTION_ 32
  184. //#define WP_OPTION_ 64
  185. #define WP_OPTION_NEXT_CMD 128
  186. //repeating events
  187. #define NO_REPEAT 0
  188. #define CH_5_TOGGLE 1
  189. #define CH_6_TOGGLE 2
  190. #define CH_7_TOGGLE 3
  191. #define CH_8_TOGGLE 4
  192. #define RELAY_TOGGLE 5
  193. #define STOP_REPEAT 10
  194. // GCS Message ID's
  195. /// NOTE: to ensure we never block on sending MAVLink messages
  196. /// please keep each MSG_ to a single MAVLink message. If need be
  197. /// create new MSG_ IDs for additional messages on the same
  198. /// stream
  199. enum ap_message {
  200. MSG_HEARTBEAT,
  201. MSG_ATTITUDE,
  202. MSG_LOCATION,
  203. MSG_EXTENDED_STATUS1,
  204. MSG_EXTENDED_STATUS2,
  205. MSG_NAV_CONTROLLER_OUTPUT,
  206. MSG_CURRENT_WAYPOINT,
  207. MSG_VFR_HUD,
  208. MSG_RADIO_OUT,
  209. MSG_RADIO_IN,
  210. MSG_RAW_IMU1,
  211. MSG_RAW_IMU2,
  212. MSG_RAW_IMU3,
  213. MSG_GPS_STATUS,
  214. MSG_GPS_RAW,
  215. MSG_SERVO_OUT,
  216. MSG_NEXT_WAYPOINT,
  217. MSG_NEXT_PARAM,
  218. MSG_STATUSTEXT,
  219. MSG_LIMITS_STATUS,
  220. MSG_AHRS,
  221. MSG_SIMSTATE,
  222. MSG_HWSTATUS,
  223. MSG_RETRY_DEFERRED // this must be last
  224. };
  225. enum gcs_severity {
  226. SEVERITY_LOW=1,
  227. SEVERITY_MEDIUM,
  228. SEVERITY_HIGH,
  229. SEVERITY_CRITICAL
  230. };
  231. // Logging parameters
  232. #define TYPE_AIRSTART_MSG 0x00
  233. #define TYPE_GROUNDSTART_MSG 0x01
  234. #define LOG_ATTITUDE_MSG 0x01
  235. #define LOG_GPS_MSG 0x02
  236. #define LOG_MODE_MSG 0x03
  237. #define LOG_CONTROL_TUNING_MSG 0x04
  238. #define LOG_NAV_TUNING_MSG 0x05
  239. #define LOG_PERFORMANCE_MSG 0x06
  240. #define LOG_RAW_MSG 0x07
  241. #define LOG_CMD_MSG 0x08
  242. #define LOG_CURRENT_MSG 0x09
  243. #define LOG_STARTUP_MSG 0x0A
  244. #define LOG_MOTORS_MSG 0x0B
  245. #define LOG_OPTFLOW_MSG 0x0C
  246. #define LOG_DATA_MSG 0x0D
  247. #define LOG_PID_MSG 0x0E
  248. #define LOG_ITERM_MSG 0x0F
  249. #define LOG_DMP_MSG 0x10
  250. #define LOG_INDEX_MSG 0xF0
  251. #define MAX_NUM_LOGS 50
  252. #define MASK_LOG_ATTITUDE_FAST (1<<0)
  253. #define MASK_LOG_ATTITUDE_MED (1<<1)
  254. #define MASK_LOG_GPS (1<<2)
  255. #define MASK_LOG_PM (1<<3)
  256. #define MASK_LOG_CTUN (1<<4)
  257. #define MASK_LOG_NTUN (1<<5)
  258. #define MASK_LOG_MODE (1<<6)
  259. #define MASK_LOG_RAW (1<<7)
  260. #define MASK_LOG_CMD (1<<8)
  261. #define MASK_LOG_CUR (1<<9)
  262. #define MASK_LOG_MOTORS (1<<10)
  263. #define MASK_LOG_OPTFLOW (1<<11)
  264. #define MASK_LOG_PID (1<<12)
  265. #define MASK_LOG_ITERM (1<<13)
  266. // Waypoint Modes
  267. // ----------------
  268. #define ABS_WP 0
  269. #define REL_WP 1
  270. // Command Queues
  271. // ---------------
  272. #define COMMAND_MUST 0
  273. #define COMMAND_MAY 1
  274. #define COMMAND_NOW 2
  275. // Events
  276. // ------
  277. #define EVENT_WILL_REACH_WAYPOINT 1
  278. #define EVENT_SET_NEW_WAYPOINT_INDEX 2
  279. #define EVENT_LOADED_WAYPOINT 3
  280. #define EVENT_LOOP 4
  281. // Climb rate calculations
  282. #define ALTITUDE_HISTORY_LENGTH 8//Number of (time,altitude) points to
  283. // regress a climb rate from
  284. #define BATTERY_VOLTAGE(x)(x*(g.input_voltage/1024.0))*g.volt_div_ratio
  285. #define CURRENT_AMPS(x)((x*(g.input_voltage/1024.0))-CURR_AMPS_OFFSET)*g.curr_amp_per_volt
  286. //#define BARO_FILTER_SIZE 8
  287. /* ************************************************************** */
  288. /* Expansion PIN's that people can use for various things. */
  289. // AN0 - 7 are located at edge of IMU PCB "above" pressure sensor and
  290. // Expansion port
  291. // AN0 - 5 are also located next to voltage dividers and sliding SW2 switch
  292. // AN0 - 3 has 10kOhm resistor in serial, include 3.9kOhm to make it as
  293. // voltage divider
  294. // AN4 - 5 are direct GPIO pins from atmega1280 and they are the latest pins
  295. // next to SW2 switch
  296. // Look more ArduCopter Wiki for voltage dividers and other ports
  297. #define AN0 54// resistor, vdiv use, divider 1 closest to relay
  298. #define AN1 55// resistor, vdiv use, divider 2
  299. #define AN2 56// resistor, vdiv use, divider 3
  300. #define AN3 57// resistor, vdiv use, divider 4 closest to SW2
  301. #define AN4 58// direct GPIO pin, default as analog input, next to SW2
  302. // switch
  303. #define AN5 59// direct GPIO pin, default as analog input, next to SW2
  304. // switch
  305. #define AN6 60// direct GPIO pin, default as analog input, close to
  306. // Pressure sensor, Expansion Ports
  307. #define AN7 61// direct GPIO pin, default as analog input, close to
  308. // Pressure sensor, Expansion Ports
  309. // AN8 - 15 are located at edge of IMU PCB "above" pressure sensor and
  310. // Expansion port
  311. // AN8 - 15 PINs are not connected anywhere, they are located as last 8 pins
  312. // on edge of the board above Expansion Ports
  313. // even pins (8,10,12,14) are at edge of board, Odd pins (9,11,13,15) are on
  314. // inner row
  315. #define AN8 62// NC
  316. #define AN9 63// NC
  317. #define AN10 64// NC
  318. #define AN11 65// NC
  319. #define AN12 66// NC
  320. #define AN13 67// NC
  321. #define AN14 68// NC
  322. #define AN15 69// NC
  323. #define RELAY_PIN 47
  324. #define PIEZO_PIN AN5 //Last pin on the back ADC connector
  325. // sonar
  326. //#define SonarToCm(x) (x*1.26) // Sonar raw value to centimeters
  327. // RADIANS
  328. #define RADX100 0.000174532925
  329. #define DEGX100 5729.57795
  330. // EEPROM addresses
  331. #define EEPROM_MAX_ADDR 4096
  332. // parameters get the first 1536 bytes of EEPROM, remainder is for waypoints
  333. #define WP_START_BYTE 0x600// where in memory home WP is stored + all other
  334. // WP
  335. #define WP_SIZE 15
  336. #define ONBOARD_PARAM_NAME_LENGTH 15
  337. // fence points are stored at the end of the EEPROM
  338. #define MAX_FENCEPOINTS 6
  339. #define FENCE_WP_SIZE sizeof(Vector2l)
  340. #define FENCE_START_BYTE (EEPROM_MAX_ADDR-(MAX_FENCEPOINTS*FENCE_WP_SIZE))
  341. #define MAX_WAYPOINTS ((FENCE_START_BYTE - WP_START_BYTE)/ WP_SIZE)-1// -
  342. // 1
  343. // to
  344. // be
  345. // safe
  346. // mark a function as not to be inlined
  347. #define NOINLINE __attribute__((noinline))
  348. // IMU selection
  349. #define CONFIG_IMU_OILPAN 1
  350. #define CONFIG_IMU_MPU6000 2
  351. // APM Hardware selection
  352. #define APM_HARDWARE_APM1 1
  353. #define APM_HARDWARE_APM2 2
  354. #define AP_BARO_BMP085 1
  355. #define AP_BARO_MS5611 2
  356. #define LOGGING_SIMPLE 1
  357. #define LOGGING_VERBOSE 2
  358. // Channel Config selection
  359. #define CHANNEL_CONFIG_DEFAULT 1
  360. #define CHANNEL_CONFIG_CUSTOM 2
  361. #endif// _DEFINES_H//做者:恆久力行  qq:624668529

6.主函數也有更改這裏是主函數代碼

main.c
  1. #include"sys.h"//做者:恆久力行  qq:624668529
  2. #include"delay.h"
  3. #include"usart.h"
  4. #include"led.h"
  5. #include"beep.h"
  6. #include"key.h"
  7. #include"mavlink_avoid_errors.h"
  8. #include"mavlink_usart_fifo.h"
  9. #include"open_tel_mavlink.h"
  10. //ALIENTEK 探索者STM32F407開發板 實驗4
  11. //串口通訊實驗 -庫函數版本
  12. //技術支持:www.openedv.com
  13. //淘寶店鋪:http://eboard.taobao.com
  14. //廣州市星翼電子科技有限公司
  15. //做者:正點原子 @ALIENTEK
  16. mavlink_system_t mavlink_system;
  17. #define UART_TX_BUFFER_SIZE 255
  18. #define UART_RX_BUFFER_SIZE 255
  19. externfifo_t uart_rx_fifo, uart_tx_fifo;
  20. externuint8_t uart_tx_buf[UART_TX_BUFFER_SIZE], uart_rx_buf[UART_RX_BUFFER_SIZE];
  21. int main(void)
  22. {
  23. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
  24. delay_init(168);//延時初始化
  25. uart_init(115200);//串口初始化波特率爲115200
  26. LED_Init();//初始化與LED鏈接的硬件接口
  27. fifo_init(&uart_tx_fifo, uart_tx_buf, UART_TX_BUFFER_SIZE);
  28. fifo_init(&uart_rx_fifo, uart_rx_buf, UART_RX_BUFFER_SIZE);
  29. mavlink_system.sysid = MAV_TYPE_GENERIC;
  30. mavlink_system.compid = MAV_AUTOPILOT_GENERIC;
  31. while(1)
  32. {
  33. mavlink_send_message(0, MSG_HEARTBEAT,0);
  34. mavlink_send_message(0, MSG_LOCATION,0);
  35. while(1)
  36. {
  37. // if(tranlTimer > 100)
  38. // {
  39. // tranlTimer = 0;
  40. // mavlink_send_message(0, MSG_HEARTBEAT, 0);
  41. // mavlink_send_message(0, MSG_ATTITUDE, 0);
  42. // mavlink_send_message(0, MSG_AHRS, 0);
  43. // }
  44. update();
  45. }
  46. }
  47. }

7.mavlink_helpers.h在之前基礎上增長以下代碼(若有重複函數,請屏蔽之前的函數)

跟原來官方不一樣的還有MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t*buffer,constmavlink_message_t*msg)
這個函數參數定義到函數最前面了。全代碼是修改後的,有興趣的能夠去比較。不修改的話會報錯。
  1. #include"mavlink_usart_fifo.h"
  2. externmavlink_system_t mavlink_system;
  3. MAVLINK_HELPER void _mavlink_send_uart(mavlink_channel_t chan,constchar*buf,uint16_t len)
  4. {
  5. serial_write_buf((uint8_t*)buf, len);
  6. }
 
mavlink_helpers.h全代碼
  1. #ifndef _MAVLINK_HELPERS_H_//做者:恆久力行  qq:624668529
  2. #define _MAVLINK_HELPERS_H_
  3. #include"string.h"
  4. #include"checksum.h"
  5. #include"mavlink_types.h"
  6. #include"mavlink_conversions.h"
  7. #ifndef MAVLINK_HELPER
  8. #define MAVLINK_HELPER
  9. #endif
  10. externmavlink_system_t mavlink_system;
  11. /*
  12. * Internal function to give access to the channel status for each channel
  13. */
  14. #ifndef MAVLINK_GET_CHANNEL_STATUS
  15. MAVLINK_HELPER mavlink_status_t* mavlink_get_channel_status(uint8_t chan)
  16. {
  17. #ifdef MAVLINK_EXTERNAL_RX_STATUS
  18. // No m_mavlink_status array defined in function,
  19. // has to be defined externally
  20. #else
  21. staticmavlink_status_t m_mavlink_status[MAVLINK_COMM_NUM_BUFFERS];
  22. #endif
  23. return&m_mavlink_status[chan];
  24. }
  25. #endif
  26. /*
  27. * Internal function to give access to the channel buffer for each channel
  28. */
  29. #ifndef MAVLINK_GET_CHANNEL_BUFFER
  30. MAVLINK_HELPER mavlink_message_t* mavlink_get_channel_buffer(uint8_t chan)
  31. {
  32. #ifdef MAVLINK_EXTERNAL_RX_BUFFER
  33. // No m_mavlink_buffer array defined in function,
  34. // has to be defined externally
  35. #else
  36. staticmavlink_message_t m_mavlink_buffer[MAVLINK_COMM_NUM_BUFFERS];
  37. #endif
  38. return&m_mavlink_buffer[chan];
  39. }
  40. #endif
  41. /**
  42. * @brief Reset the status of a channel.
  43. */
  44. MAVLINK_HELPER void mavlink_reset_channel_status(uint8_t chan)
  45. {
  46. mavlink_status_t*status = mavlink_get_channel_status(chan);
  47. status->parse_state = MAVLINK_PARSE_STATE_IDLE;
  48. }
  49. /**
  50. * @brief Finalize a MAVLink message with channel assignment
  51. *
  52. * This function calculates the checksum and sets length and aircraft id correctly.
  53. * It assumes that the message id and the payload are already correctly set. This function
  54. * can also be used if the message header has already been written before (as in mavlink_msg_xxx_pack
  55. * instead of mavlink_msg_xxx_pack_headerless), it just introduces little extra overhead.
  56. *
  57. * @param msg Message to finalize
  58. * @param system_id Id of the sending (this) system, 1-127
  59. * @param length Message length
  60. */
  61. #if MAVLINK_CRC_EXTRA
  62. MAVLINK_HELPER uint16_t mavlink_finalize_message_chan(mavlink_message_t* msg,uint8_t system_id,uint8_t component_id,
  63. uint8_t chan,uint8_t min_length,uint8_t length,uint8_t crc_extra)
  64. #else
  65. MAVLINK_HELPER uint16_t mavlink_finalize_message_chan(mavlink_message_t* msg,uint8_t system_id,uint8_t component_id,
  66. uint8_t chan,uint8_t length)
  67. #endif
  68. {
  69. // This is only used for the v2 protocol and we silence it here
  70. (void)min_length;
  71. // This code part is the same for all messages;
  72. msg->magic = MAVLINK_STX;
  73. msg->len = length;
  74. msg->sysid = system_id;
  75. msg->compid = component_id;
  76. // One sequence number per channel
  77. msg->seq = mavlink_get_channel_status(chan)->current_tx_seq;
  78. mavlink_get_channel_status(chan)->current_tx_seq = mavlink_get_channel_status(chan)->current_tx_seq+1;
  79. msg->checksum = crc_calculate(((constuint8_t*)(msg))+3, MAVLINK_CORE_HEADER_LEN);
  80. crc_accumulate_buffer(&msg->checksum, _MAV_PAYLOAD(msg), msg->len);
  81. #if MAVLINK_CRC_EXTRA
  82. crc_accumulate(crc_extra,&msg->checksum);
  83. #endif
  84. mavlink_ck_a(msg)=(uint8_t)(msg->checksum &0xFF);
  85. mavlink_ck_b(msg)=(uint8_t)(msg->checksum >>8);
  86. return length + MAVLINK_NUM_NON_PAYLOAD_BYTES;
  87. }
  88. /**
  89. * @brief Finalize a MAVLink message with MAVLINK_COMM_0 as default channel
  90. */
  91. #if MAVLINK_CRC_EXTRA
  92. MAVLINK_HELPER uint16_t mavlink_finalize_message(mavlink_message_t* msg,uint8_t system_id,uint8_t component_id,
  93. uint8_t min_length,uint8_t length,uint8_t crc_extra)
  94. {
  95. return mavlink_finalize_message_chan(msg, system_id, component_id, MAVLINK_COMM_0, min_length, length, crc_extra);
  96. }
  97. #else
  98. MAVLINK_HELPER uint16_t mavlink_finalize_message(mavlink_message_t* msg,uint8_t system_id,uint8_t component_id,
  99. uint8_t length)
  100. {
  101. return mavlink_finalize_message_chan(msg, system_id, component_id, MAVLINK_COMM_0, length);
  102. }
  103. #endif
  104. #ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
  105. MAVLINK_HELPER void _mavlink_send_uart(mavlink_channel_t chan,constchar*buf,uint16_t len);
  106. /**
  107. * @brief Finalize a MAVLink message with channel assignment and send
  108. */
  109. #if MAVLINK_CRC_EXTRA
  110. MAVLINK_HELPER void _mav_finalize_message_chan_send(mavlink_channel_t chan,uint8_t msgid,constchar*packet,
  111. uint8_t min_length,uint8_t length,uint8_t crc_extra)
  112. #else
  113. MAVLINK_HELPER void _mav_finalize_message_chan_send(mavlink_channel_t chan,uint8_t msgid,constchar*packet,uint8_t length)
  114. #endif
  115. {
  116. uint16_t checksum;
  117. uint8_t buf[MAVLINK_NUM_HEADER_BYTES];
  118. uint8_t ck[2];
  119. mavlink_status_t*status = mavlink_get_channel_status(chan);
  120. buf[0]= MAVLINK_STX;
  121. buf[1]= length;
  122. buf[2]= status->current_tx_seq;
  123. buf[3]= mavlink_system.sysid;
  124. buf[4]= mavlink_system.compid;
  125. buf[5]= msgid;
  126. status->current_tx_seq++;
  127. checksum = crc_calculate((constuint8_t*)&buf[1], MAVLINK_CORE_HEADER_LEN);
  128. crc_accumulate_buffer(&checksum, packet, length);
  129. #if MAVLINK_CRC_EXTRA
  130. crc_accumulate(crc_extra,&checksum);
  131. #endif
  132. ck[0]=(uint8_t)(checksum &0xFF);
  133. ck[1]=(uint8_t)(checksum >>8);
  134. MAVLINK_START_UART_SEND(chan, MAVLINK_NUM_NON_PAYLOAD_BYTES +(uint16_t)length);
  135. _mavlink_send_uart(chan,(constchar*)buf, MAVLINK_NUM_HEADER_BYTES);
  136. _mavlink_send_uart(chan, packet, length);
  137. _mavlink_send_uart(chan,(constchar*)ck,2);
  138. MAVLINK_END_UART_SEND(chan, MAVLINK_NUM_NON_PAYLOAD_BYTES +(uint16_t)length);
  139. }
  140. /**
  141. * @brief re-send a message over a uart channel
  142. * this is more stack efficient than re-marshalling the message
  143. */
  144. MAVLINK_HELPER void _mavlink_resend_uart(mavlink_channel_t chan,constmavlink_message_t*msg)
  145. {
  146. uint8_t ck[2];
  147. ck[0]=(uint8_t)(msg->checksum &0xFF);
  148. ck[1]=(uint8_t)(msg->checksum >>8);
  149. // XXX use the right sequence here
  150. MAVLINK_START_UART_SEND(chan, MAVLINK_NUM_NON_PAYLOAD_BYTES + msg->len);
  151. _mavlink_send_uart(chan,(constchar*)&msg->magic, MAVLINK_NUM_HEADER_BYTES);
  152. _mavlink_send_uart(chan, _MAV_PAYLOAD(msg), msg->len);
  153. _mavlink_send_uart(chan,(constchar*)ck,2);
  154. MAVLINK_END_UART_SEND(chan, MAVLINK_NUM_NON_PAYLOAD_BYTES + msg->len);
  155. }
  156. #endif// MAVLINK_USE_CONVENIENCE_FUNCTIONS
  157. /**
  158. * @brief Pack a message to send it over a serial byte stream
  159. */
  160. MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t*buffer,constmavlink_message_t*msg)
  161. {
  162. uint8_t*ck;
  163. memcpy(buffer,(constuint8_t*)&msg->magic, MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  164. ck = buffer +(MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  165. ck[0]=(uint8_t)(msg->checksum &0xFF);
  166. ck[1]=(uint8_t)(msg->checksum >>8);
  167. return MAVLINK_NUM_NON_PAYLOAD_BYTES +(uint16_t)msg->len;
  168. }
  169. union __mavlink_bitfield {
  170. uint8_tuint8;
  171. int8_tint8;
  172. uint16_tuint16;
  173. int16_tint16;
  174. uint32_tuint32;
  175. int32_tint32;
  176. };
  177. MAVLINK_HELPER void mavlink_start_checksum(mavlink_message_t* msg)
  178. {
  179. crc_init(&msg->checksum);
  180. }
  181. MAVLINK_HELPER void mavlink_update_checksum(mavlink_message_t* msg,uint8_t c)
  182. {
  183. crc_accumulate(c,&msg->checksum);
  184. }
  185. /**
  186. * This is a varient of mavlink_frame_char() but with caller supplied
  187. * parsing buffers. It is useful when you want to create a MAVLink
  188. * parser in a library that doesn't use any global variables
  189. *
  190. * @param rxmsg parsing message buffer
  191. * @param status parsing starus buffer
  192. * @param c The char to parse
  193. *
  194. * @param returnMsg NULL if no message could be decoded, the message data else
  195. * @param returnStats if a message was decoded, this is filled with the channel's stats
  196. * @return 0 if no message could be decoded, 1 on good message and CRC, 2 on bad CRC
  197. *
  198. * A typical use scenario of this function call is:
  199. *
  200. * @code
  201. * #include <mavlink.h>
  202. *
  203. * mavlink_message_t msg;
  204. * int chan = 0;
  205. *
  206. *
  207. * while(serial.bytesAvailable > 0)
  208. * {
  209. * uint8_t byte = serial.getNextByte();
  210. * if (mavlink_frame_char(chan, byte, &msg) != MAVLINK_FRAMING_INCOMPLETE)
  211. * {
  212. * printf("Received message with ID %d, sequence: %d from component %d of system %d", msg.msgid, msg.seq, msg.compid, msg.sysid);
  213. * }
  214. * }
  215. *
  216. *
  217. * @endcode
  218. */
  219. MAVLINK_HELPER uint8_t mavlink_frame_char_buffer(mavlink_message_t* rxmsg,
  220. mavlink_status_t* status,
  221. uint8_t c,
  222. mavlink_message_t* r_message,
  223. mavlink_status_t* r_mavlink_status)
  224. {
  225. /*
  226. default message crc function. You can override this per-system to
  227. put this data in a different memory segment
  228. */
  229. #if MAVLINK_CRC_EXTRA
  230. #ifndef MAVLINK_MESSAGE_CRC
  231. staticconstuint8_t mavlink_message_crcs[256]= MAVLINK_MESSAGE_CRCS;
  232. #define MAVLINK_MESSAGE_CRC(msgid) mavlink_message_crcs[msgid]
  233. #endif
  234. #endif
  235. /* Enable this option to check the length of each message.
  236. This allows invalid messages to be caught much sooner. Use if the transmission
  237. medium is prone to missing (or extra) characters (e.g. a radio that fades in
  238. and out). Only use if the channel will only contain messages types listed in
  239. the headers.
  240. */
  241. #ifdef MAVLINK_CHECK_MESSAGE_LENGTH
  242. #ifndef MAVLINK_MESSAGE_LENGTH
  243. staticconstuint8_t mavlink_message_lengths[256]= MAVLINK_MESSAGE_LENGTHS;
  244. #define MAVLINK_MESSAGE_LENGTH(msgid) mavlink_message_lengths[msgid]
  245. #endif
  246. #endif
  247. int bufferIndex =0;
  248. status->msg_received = MAVLINK_FRAMING_INCOMPLETE;
  249. switch(status->parse_state)
  250. {
  251. case MAVLINK_PARSE_STATE_UNINIT:
  252. case MAVLINK_PARSE_STATE_IDLE:
  253. if(c == MAVLINK_STX)
  254. {
  255. status->parse_state = MAVLINK_PARSE_STATE_GOT_STX;
  256. rxmsg->len =0;
  257. rxmsg->magic = c;
  258. mavlink_start_checksum(rxmsg);
  259. }
  260. break;
  261. case MAVLINK_PARSE_STATE_GOT_STX:
  262. if(status->msg_received
  263. /* Support shorter buffers than the
  264. default maximum packet size */
  265. #if (MAVLINK_MAX_PAYLOAD_LEN < 255)
  266. || c > MAVLINK_MAX_PAYLOAD_LEN
  267. #endif
  268. )
  269. {
  270. status->buffer_overrun++;
  271. status->parse_error++;
  272. status->msg_received =0;
  273. status->parse_state = MAVLINK_PARSE_STATE_IDLE;
  274. }
  275. else
  276. {
  277. // NOT counting STX, LENGTH, SEQ, SYSID, COMPID, MSGID, CRC1 and CRC2
  278. rxmsg->len = c;
  279. status->packet_idx =0;
  280. mavlink_update_checksum(rxmsg, c);
  281. status->parse_state = MAVLINK_PARSE_STATE_GOT_LENGTH;
  282. }
  283. break;
  284. case MAVLINK_PARSE_STATE_GOT_LENGTH:
  285. rxmsg->seq = c;
  286. mavlink_update_checksum(rxmsg, c);
  287. status->parse_state = MAVLINK_PARSE_STATE_GOT_SEQ;
  288. break;
  289. case MAVLINK_PARSE_STATE_GOT_SEQ:
  290. rxmsg->sysid = c;
  291. mavlink_update_checksum(rxmsg, c);
  292. status->parse_state = MAVLINK_PARSE_STATE_GOT_SYSID;
  293. break;
  294. case MAVLINK_PARSE_STATE_GOT_SYSID:
  295. rxmsg->compid = c;
  296. mavlink_update_checksum(rxmsg, c);
  297. status->parse_state = MAVLINK_PARSE_STATE_GOT_COMPID;
  298. break;
  299. case MAVLINK_PARSE_STATE_GOT_COMPID:
  300. #ifdef MAVLINK_CHECK_MESSAGE_LENGTH
  301. if(rxmsg->len != MAVLINK_MESSAGE_LENGTH(c))
  302. {
  303. status->parse_error++;
  304. status->parse_state = MAVLINK_PARSE_STATE_IDLE;
  305. break;
  306. }
  307. #endif
  308. rxmsg->msgid = c;
  309. mavlink_update_checksum(rxmsg, c);
  310. if(rxmsg->len ==0)
  311. {
  312. status->parse_state = MAVLINK_PARSE_STATE_GOT_PAYLOAD;
  313. }
  314. else
  315. {
  316. status->parse_state = MAVLINK_PARSE_STATE_GOT_MSGID;
  317. }
  318. break;
  319. case MAVLINK_PARSE_STATE_GOT_MSGID:
  320. _MAV_PAYLOAD_NON_CONST(rxmsg)[status->packet_idx++]=(char)c;
  321. mavlink_update_checksum(rxmsg, c);
  322. if(status->packet_idx == rxmsg->len)
  323. {
  324. status->parse_state = MAVLINK_PARSE_STATE_GOT_PAYLOAD;
  325. }
  326. break;
  327. case MAVLINK_PARSE_STATE_GOT_PAYLOAD:
  328. #if MAVLINK_CRC_EXTRA
  329. mavlink_update_checksum(rxmsg, MAVLINK_MESSAGE_CRC(rxmsg->msgid));
  330. #endif
  331. if(c !=(rxmsg->checksum &0xFF)){
  332. status->parse_state = MAVLINK_PARSE_STATE_GOT_BAD_CRC1;
  333. }else{
  334. status->parse_state = MAVLINK_PARSE_STATE_GOT_CRC1;
  335. }
  336. _MAV_PAYLOAD_NON_CONST(rxmsg)[status->packet_idx]=(char)c;
  337. break;
  338. case MAVLINK_PARSE_STATE_GOT_CRC1:
  339. case MAVLINK_PARSE_STATE_GOT_BAD_CRC1:
  340. if(status->parse_state == MAVLINK_PARSE_STATE_GOT_BAD_CRC1 || c !=(rxmsg->checksum >>8)){
  341. // got a bad CRC message
  342. status->msg_received = MAVLINK_FRAMING_BAD_CRC;
  343. }else{
  344. // Successfully got message
  345. status->msg_received = MAVLINK_FRAMING_OK;
  346. }
  347. status->parse_state = MAVLINK_PARSE_STATE_IDLE;
  348. _MAV_PAYLOAD_NON_CONST(rxmsg)[status->packet_idx+1]=(char)c;
  349. memcpy(r_message, rxmsg,sizeof(mavlink_message_t));
  350. break;
  351. }
  352. bufferIndex++;
  353. // If a message has been sucessfully decoded, check index
  354. if(status->msg_received == MAVLINK_FRAMING_OK)
  355. {
  356. //while(status->current_seq != rxmsg->seq)
  357. //{
  358. // status->packet_rx_drop_count++;
  359. // status->current_seq++;
  360. //}
  361. status->current_rx_seq = rxmsg->seq;
  362. // Initial condition: If no packet has been received so far, drop count is undefined
  363. if(status->packet_rx_success_count ==0) status->packet_rx_drop_count =0;
  364. // Count this packet as received
  365. status->packet_rx_success_count++;
  366. }
  367. r_message->len = rxmsg->len;// Provide visibility on how far we are into current msg
  368. r_mavlink_status->parse_state = status->parse_state;
  369. r_mavlink_status->packet_idx = status->packet_idx;
  370. r_mavlink_status->current_rx_seq = status->current_rx_seq+1;
  371. r_mavlink_status->packet_rx_success_count = status->packet_rx_success_count;
  372. r_mavlink_status->packet_rx_drop_count = status->parse_error;
  373. status->parse_error =0;
  374. if(status->msg_received == MAVLINK_FRAMING_BAD_CRC){
  375. /*
  376. the CRC came out wrong. We now need to overwrite the
  377. msg CRC with the one on the wire so that if the
  378. caller decides to forward the message anyway that
  379. mavlink_msg_to_send_buffer() won't overwrite the
  380. checksum
  381. */
  382. r_message->checksum = _MAV_PAYLOAD(rxmsg)[status->packet_idx]|(_MAV_PAYLOAD(rxmsg)[status->packet_idx+1]<<8);
  383. }
  384. return status->msg_received;
  385. }
  386. /**
  387. * This is a convenience function which handles the complete MAVLink parsing.
  388. * the function will parse one byte at a time and return the complete packet once
  389. * it could be successfully decoded. This function will return 0, 1 or
  390. * 2 (MAVLINK_FRAMING_INCOMPLETE, MAVLINK_FRAMING_OK or MAVLINK_FRAMING_BAD_CRC)
  391. *
  392. * Messages are parsed into an internal buffer (one for each channel). When a complete
  393. * message is received it is copies into *returnMsg and the channel's status is
  394. * copied into *returnStats.
  395. *
  396. * @param chan ID of the current channel. This allows to parse different channels with this function.
  397. * a channel is not a physical message channel like a serial port, but a logic partition of
  398. * the communication streams in this case. COMM_NB is the limit for the number of channels
  399. * on MCU (e.g. ARM7), while COMM_NB_HIGH is the limit for the number of channels in Linux/Windows
  400. * @param c The char to parse
  401. *
  402. * @param returnMsg NULL if no message could be decoded, the message data else
  403. * @param returnStats if a message was decoded, this is filled with the channel's stats
  404. * @return 0 if no message could be decoded, 1 on good message and CRC, 2 on bad CRC
  405. *
  406. * A typical use scenario of this function call is:
  407. *
  408. * @code
  409. * #include <mavlink.h>
  410. *
  411. * mavlink_message_t msg;
  412. * int chan = 0;
  413. *
  414. *
  415. * while(serial.bytesAvailable > 0)
  416. * {
  417. * uint8_t byte = serial.getNextByte();
  418. * if (mavlink_frame_char(chan, byte, &msg) != MAVLINK_FRAMING_INCOMPLETE)
  419. * {
  420. * printf("Received message with ID %d, sequence: %d from component %d of system %d", msg.msgid, msg.seq, msg.compid, msg.sysid);
  421. * }
  422. * }
  423. *
  424. *
  425. * @endcode
  426. */
  427. MAVLINK_HELPER uint8_t mavlink_frame_char(uint8_t chan,uint8_t c,mavlink_message_t* r_message,mavlink_status_t* r_mavlink_status)
  428. {
  429. return mavlink_frame_char_buffer(mavlink_get_channel_buffer(chan),
  430. mavlink_get_channel_status(chan),
  431. c,
  432. r_message,
  433. r_mavlink_status);
  434. }
  435. /**
  436. * This is a convenience function which handles the complete MAVLink parsing.
  437. * the function will parse one byte at a time and return the complete packet once
  438. * it could be successfully decoded. This function will return 0 or 1.
  439. *
  440. * Messages are parsed into an internal buffer (one for each channel). When a complete
  441. * message is received it is copies into *returnMsg and the channel's status is
  442. * copied into *returnStats.
  443. *
  444. * @param chan ID of the current channel. This allows to parse different channels with this function.
  445. * a channel is not a physical message channel like a serial port, but a logic partition of
  446. * the communication streams in this case. COMM_NB is the limit for the number of channels
  447. * on MCU (e.g. ARM7), while COMM_NB_HIGH is the limit for the number of channels in Linux/Windows
  448. * @param c The char to parse
  449. *
  450. * @param returnMsg NULL if no message could be decoded, the message data else
  451. * @param returnStats if a message was decoded, this is filled with the channel's stats
  452. * @return 0 if no message could be decoded or bad CRC, 1 on good message and CRC
  453. *
  454. * A typical use scenario of this function call is:
  455. *
  456. * @code
  457. * #include <mavlink.h>
  458. *
  459. * mavlink_message_t msg;
  460. * int chan = 0;
  461. *
  462. *
  463. * while(serial.bytesAvailable > 0)
  464. * {
  465. * uint8_t byte = serial.getNextByte();
  466. * if (mavlink_parse_char(chan, byte, &msg))
  467. * {
  468. * printf("Received message with ID %d, sequence: %d from component %d of system %d", msg.msgid, msg.seq, msg.compid, msg.sysid);
  469. * }
  470. * }
  471. *
  472. *
  473. * @endcode
  474. */
  475. MAVLINK_HELPER uint8_t mavlink_parse_char(uint8_t chan,uint8_t c,mavlink_message_t* r_message,mavlink_status_t* r_mavlink_status)
  476. {
  477. uint8_t msg_received = mavlink_frame_char(chan, c, r_message, r_mavlink_status);
  478. if(msg_received == MAVLINK_FRAMING_BAD_CRC){
  479. // we got a bad CRC. Treat as a parse failure
  480. mavlink_message_t* rxmsg = mavlink_get_channel_buffer(chan);
  481. mavlink_status_t* status = mavlink_get_channel_status(chan);
  482. status->parse_error++;
  483. status->msg_received = MAVLINK_FRAMING_INCOMPLETE;
  484. status->parse_state = MAVLINK_PARSE_STATE_IDLE;
  485. if(c == MAVLINK_STX)
  486. {
  487. status->parse_state = MAVLINK_PARSE_STATE_GOT_STX;
  488. rxmsg->len =0;
  489. mavlink_start_checksum(rxmsg);
  490. }
  491. return0;
  492. }
  493. return msg_received;
  494. }
  495. /**
  496. * @brief Put a bitfield of length 1-32 bit into the buffer
  497. *
  498. * @param b the value to add, will be encoded in the bitfield
  499. * @param bits number of bits to use to encode b, e.g. 1 for boolean, 2, 3, etc.
  500. * @param packet_index the position in the packet (the index of the first byte to use)
  501. * @param bit_index the position in the byte (the index of the first bit to use)
  502. * @param buffer packet buffer to write into
  503. * @return new position of the last used byte in the buffer
  504. */
  505. MAVLINK_HELPER uint8_t put_bitfield_n_by_index(int32_t b,uint8_t bits,uint8_t packet_index,uint8_t bit_index,uint8_t* r_bit_index,uint8_t* buffer)
  506. {
  507. uint16_t bits_remain = bits;
  508. // Transform number into network order
  509. int32_t v;
  510. uint8_t i_bit_index, i_byte_index, curr_bits_n;
  511. #if MAVLINK_NEED_BYTE_SWAP
  512. union{
  513. int32_t i;
  514. uint8_t b[4];
  515. } bin, bout;
  516. bin.i = b;
  517. bout.b[0]= bin.b[3];
  518. bout.b[1]= bin.b[2];
  519. bout.b[2]= bin.b[1];
  520. bout.b[3]= bin.b[0];
  521. v = bout.i;
  522. #else
  523. v = b;
  524. #endif
  525. // buffer in
  526. // 01100000 01000000 00000000 11110001
  527. // buffer out
  528. // 11110001 00000000 01000000 01100000
  529. // Existing partly filled byte (four free slots)
  530. // 0111xxxx
  531. // Mask n free bits
  532. // 00001111 = 2^0 + 2^1 + 2^2 + 2^3 = 2^n - 1
  533. // = ((uint32_t)(1 << n)) - 1; // = 2^n - 1
  534. // Shift n bits into the right position
  535. // out = in >> n;
  536. // Mask and shift bytes
  537. i_bit_index = bit_index;
  538. i_byte_index = packet_index;
  539. if(bit_index >0)
  540. {
  541. // If bits were available at start, they were available
  542. // in the byte before the current index
  543. i_byte_index--;
  544. }
  545. // While bits have not been packed yet
  546. while(bits_remain >0)
  547. {
  548. // Bits still have to be packed
  549. // there can be more than 8 bits, so
  550. // we might have to pack them into more than one byte
  551. // First pack everything we can into the current 'open' byte
  552. //curr_bits_n = bits_remain << 3; // Equals bits_remain mod 8
  553. //FIXME
  554. if(bits_remain <=(uint8_t)(8- i_bit_index))
  555. {
  556. // Enough space
  557. curr_bits_n =(uint8_t)bits_remain;
  558. }
  559. else
  560. {
  561. curr_bits_n =(8- i_bit_index);
  562. }
  563. // Pack these n bits into the current byte
  564. // Mask out whatever was at that position with ones (xxx11111)
  565. buffer[i_byte_index]&=(0xFF>>(8- curr_bits_n));
  566. // Put content to this position, by masking out the non-used part
  567. buffer[i_byte_index]|=((0x00<< curr_bits_n)& v);
  568. // Increment the bit index
  569. i_bit_index += curr_bits_n;
  570. // Now proceed to the next byte, if necessary
  571. bits_remain -= curr_bits_n;
  572. if(bits_remain >0)
  573. {
  574. // Offer another 8 bits / one byte
  575. i_byte_index++;
  576. i_bit_index =0;
  577. }
  578. }
  579. *r_bit_index = i_bit_index;
  580. // If a partly filled byte is present, mark this as consumed
  581. if(i_bit_index !=7) i_byte_index++;
  582. return i_byte_index - packet_index;
  583. }
  584. #ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
  585. // To make MAVLink work on your MCU, define comm_send_ch() if you wish
  586. // to send 1 byte at a time, or MAVLINK_SEND_UART_BYTES() to send a
  587. // whole packet at a time
  588. /*
  589. #include "mavlink_types.h"
  590. void comm_send_ch(mavlink_channel_t chan, uint8_t ch)
  591. {
  592. if (chan == MAVLINK_COMM_0)
  593. {
  594. uart0_transmit(ch);
  595. }
  596. if (chan == MAVLINK_COMM_1)
  597. {
  598. uart1_transmit(ch);
  599. }
  600. }
  601. */
  602. #include"mavlink_usart_fifo.h"
  603. MAVLINK_HELPER void _mavlink_send_uart(mavlink_channel_t chan,constchar*buf,uint16_t len)
  604. {
  605. serial_write_buf((uint8_t*)buf, len);
  606. }
  607. //MAVLINK_HELPER void _mavlink_send_uart(mavlink_channel_t chan, const char *buf, uint16_t len)
  608. //{
  609. //#ifdef MAVLINK_SEND_UART_BYTES
  610. // /* this is the more efficient approach, if the platform
  611. // defines it */
  612. // MAVLINK_SEND_UART_BYTES(chan, (const uint8_t *)buf, len);
  613. //#else
  614. // /* fallback to one byte at a time */
  615. // uint16_t i;
  616. // for (i = 0; i < len; i++) {
  617. // comm_send_ch(chan, (uint8_t)buf[i]);
  618. // }
  619. //#endif
  620. //}
  621. #endif// MAVLINK_USE_CONVENIENCE_FUNCTIONS
  622. #endif/* _MAVLINK_HELPERS_H_ */

8.checksum未經任何修改(爲了你們方便看附上全代碼)

checksum.h
  1. #ifdef __cplusplus//做者:恆久力行  qq:624668529
  2. extern"C"{
  3. #endif
  4. #ifndef _CHECKSUM_H_
  5. #define _CHECKSUM_H_
  6. // Visual Studio versions before 2010 don't have stdint.h, so we just error out.
  7. #if (defined _MSC_VER) && (_MSC_VER < 1600)
  8. #error"The C-MAVLink implementation requires Visual Studio 2010 or greater"
  9. #endif
  10. #include<stdint.h>
  11. /**
  12. *
  13. * CALCULATE THE CHECKSUM
  14. *
  15. */
  16. #define X25_INIT_CRC 0xffff
  17. #define X25_VALIDATE_CRC 0xf0b8
  18. #ifndef HAVE_CRC_ACCUMULATE
  19. /**
  20. * @brief Accumulate the X.25 CRC by adding one char at a time.
  21. *
  22. * The checksum function adds the hash of one char at a time to the
  23. * 16 bit checksum (uint16_t).
  24. *
  25. * @param data new char to hash
  26. * @param crcAccum the already accumulated checksum
  27. **/
  28. staticinlinevoid crc_accumulate(uint8_t data,uint16_t*crcAccum)
  29. {
  30. /*Accumulate one byte of data into the CRC*/
  31. uint8_t tmp;
  32. tmp = data ^(uint8_t)(*crcAccum &0xff);
  33. tmp ^=(tmp<<4);
  34. *crcAccum =(*crcAccum>>8)^(tmp<<8)^(tmp <<3)^(tmp>>4);
  35. }
  36. #endif
  37. /**
  38. * @brief Initiliaze the buffer for the X.25 CRC
  39. *
  40. * @param crcAccum the 16 bit X.25 CRC
  41. */
  42. staticinlinevoid crc_init(uint16_t* crcAccum)
  43. {
  44. *crcAccum = X25_INIT_CRC;
  45. }
  46. /**
  47. * @brief Calculates the X.25 checksum on a byte buffer
  48. *
  49. * @param pBuffer buffer containing the byte array to hash
  50. * @param length length of the byte array
  51. * @return the checksum over the buffer bytes
  52. **/
  53. staticinlineuint16_t crc_calculate(constuint8_t* pBuffer,uint16_t length)
  54. {
  55. uint16_t crcTmp;
  56. crc_init(&crcTmp);
  57. while(length--){
  58. crc_accumulate(*pBuffer++,&crcTmp);
  59. }
  60. return crcTmp;
  61. }
  62. /**
  63. * @brief Accumulate the X.25 CRC by adding an array of bytes
  64. *
  65. * The checksum function adds the hash of one char at a time to the
  66. * 16 bit checksum (uint16_t).
  67. *
  68. * @param data new bytes to hash
  69. * @param crcAccum the already accumulated checksum
  70. **/
  71. staticinlinevoid crc_accumulate_buffer(uint16_t*crcAccum,constchar*pBuffer,uint16_t length)
  72. {
  73. constuint8_t*p =(constuint8_t*)pBuffer;
  74. while(length--){
  75. crc_accumulate(*p++, crcAccum);
  76. }
  77. }
  78. #endif/* _CHECKSUM_H_ */
  79. #ifdef __cplusplus
  80. }
  81. #endif

9.mavlink_conversions.h修改了一個地方就是將參數定義提到前面了

(就是這個函數MAVLINK_HELPER void mavlink_dcm_to_quaternion(constfloat dcm[3][3],float quaternion[4])
mavlink_conversions.h全代碼
  1. #ifndef _MAVLINK_CONVERSIONS_H_//做者:恆久力行  qq:624668529
  2. #define _MAVLINK_CONVERSIONS_H_
  3. /* enable math defines on Windows */
  4. #ifdef _MSC_VER
  5. #ifndef _USE_MATH_DEFINES
  6. #define _USE_MATH_DEFINES
  7. #endif
  8. #endif
  9. #include<math.h>
  10. #ifndef M_PI_2
  11. #define M_PI_2 ((float)asin(1))
  12. #endif
  13. /**
  14. * @file mavlink_conversions.h
  15. *
  16. * These conversion functions follow the NASA rotation standards definition file
  17. * available online.
  18. *
  19. * Their intent is to lower the barrier for MAVLink adopters to use gimbal-lock free
  20. * (both rotation matrices, sometimes called DCM, and quaternions are gimbal-lock free)
  21. * rotation representations. Euler angles (roll, pitch, yaw) will be phased out of the
  22. * protocol as widely as possible.
  23. *
  24. * @author James Goppert
  25. * @author Thomas Gubler <thomasgubler@gmail.com>
  26. */
  27. /**
  28. * Converts a quaternion to a rotation matrix
  29. *
  30. * @param quaternion a [w, x, y, z] ordered quaternion (null-rotation being 1 0 0 0)
  31. * @param dcm a 3x3 rotation matrix
  32. */
  33. MAVLINK_HELPER void mavlink_quaternion_to_dcm(constfloat quaternion[4],float dcm[3][3])
  34. {
  35. double a = quaternion[0];
  36. double b = quaternion[1];
  37. double c = quaternion[2];
  38. double d = quaternion[3];
  39. double aSq = a * a;
  40. double bSq = b * b;
  41. double cSq = c * c;
  42. double dSq = d * d;
  43. dcm[0][0]= aSq + bSq - cSq - dSq;
  44. dcm[0][1]=2*(b * c - a * d);
  45. dcm[0][2]=2*(a * c + b * d);
  46. dcm[1][0]=2*(b * c + a * d);
  47. dcm[1][1]= aSq - bSq + cSq - dSq;
  48. dcm[1][2]=2*(c * d - a * b);
  49. dcm[2][0]=2*(b * d - a * c);
  50. dcm[2][1]=2*(a * b + c * d);
  51. dcm[2][2]= aSq - bSq - cSq + dSq;
  52. }
  53. /**
  54. * Converts a rotation matrix to euler angles
  55. *
  56. * @param dcm a 3x3 rotation matrix
  57. * @param roll the roll angle in radians
  58. * @param pitch the pitch angle in radians
  59. * @param yaw the yaw angle in radians
  60. */
  61. MAVLINK_HELPER void mavlink_dcm_to_euler(constfloat dcm[3][3],float* roll,float* pitch,float* yaw)
  62. {
  63. float phi, theta, psi;
  64. theta = asin(-dcm[2][0]);
  65. if(fabsf(theta -(float)M_PI_2)<1.0e-3f){
  66. phi =0.0f;
  67. psi =(atan2f(dcm[1][2]- dcm[0][1],
  68. dcm[0][2]+ dcm[1][1])+ phi);
  69. }elseif(fabsf(theta +(float)M_PI_2)<1.0e-3f){
  70. phi =0.0f;
  71. psi = atan2f(dcm[1][2]- dcm[0][1],
  72. dcm[0][2]+ dcm[1][1]- phi);
  73. }else{
  74. phi = atan2f(dcm[2][1], dcm[2][2]);
  75. psi = atan2f(dcm[1][0], dcm[0][0]);
  76. }
  77. *roll = phi;
  78. *pitch = theta;
  79. *yaw = psi;
  80. }
  81. /**
  82. * Converts a quaternion to euler angles
  83. *
  84. * @param quaternion a [w, x, y, z] ordered quaternion (null-rotation being 1 0 0 0)
  85. * @param roll the roll angle in radians
  86. * @param pitch the pitch angle in radians
  87. * @param yaw the yaw angle in radians
  88. */
  89. MAVLINK_HELPER void mavlink_quaternion_to_euler(constfloat quaternion[4],float* roll,float* pitch,float* yaw)
  90. {
  91. float dcm[3][3];
  92. mavlink_quaternion_to_dcm(quaternion, dcm);
  93. mavlink_dcm_to_euler((constfloat(*)[3])dcm, roll, pitch, yaw);
  94. }
  95. /**
  96. * Converts euler angles to a quaternion
  97. *
  98. * @param roll the roll angle in radians
  99. * @param pitch the pitch angle in radians
  100. * @param yaw the yaw angle in radians
  101. * @param quaternion a [w, x, y, z] ordered quaternion (null-rotation being 1 0 0 0)
  102. */
  103. MAVLINK_HELPER void mavlink_euler_to_quaternion(float roll,float pitch,float yaw,float quaternion[4])
  104. {
  105. float cosPhi_2 = cosf(roll /2);
  106. float sinPhi_2 = sinf(roll /2);
  107. float cosTheta_2 = cosf(pitch /2);
  108. float sinTheta_2 = sinf(pitch /2);
  109. float cosPsi_2 = cosf(yaw /2);
  110. float sinPsi_2 = sinf(yaw /2);
  111. quaternion[0]=(cosPhi_2 * cosTheta_2 * cosPsi_2 +
  112. sinPhi_2 * sinTheta_2 * sinPsi_2);
  113. quaternion[1]=(sinPhi_2 * cosTheta_2 * cosPsi_2 -
  114. cosPhi_2 * sinTheta_2 * sinPsi_2);
  115. quaternion[2]=(cosPhi_2 * sinTheta_2 * cosPsi_2 +
  116. sinPhi_2 * cosTheta_2 * sinPsi_2);
  117. quaternion[3]=(cosPhi_2 * cosTheta_2 * sinPsi_2 -
  118. sinPhi_2 * sinTheta_2 * cosPsi_2);
  119. }
  120. /**
  121. * Converts a rotation matrix to a quaternion
  122. * Reference:
  123. * - Shoemake, Quaternions,
  124. * http://www.cs.ucr.edu/~vbz/resources/quatut.pdf
  125. *
  126. * @param dcm a 3x3 rotation matrix
  127. * @param quaternion a [w, x, y, z] ordered quaternion (null-rotation being 1 0 0 0)
  128. */
  129. MAVLINK_HELPER void mavlink_dcm_to_quaternion(constfloat dcm[3][3],float quaternion[4])
  130. {
  131. int dcm_j,dcm_k;
  132. float s;
  133. float tr = dcm[0][0]+ dcm[1][1]+ dcm[2][2];
  134. if(tr >0.0f){
  135. float s = sqrtf(tr +1.0f);
  136. quaternion[0]= s *0.5f;
  137. s =0.5f/ s;
  138. quaternion[1]=(dcm[2][1]- dcm[1][2])* s;
  139. quaternion[2]=(dcm[0][2]- dcm[2][0])* s;
  140. quaternion[3]=(dcm[1][0]- dcm[0][1])* s;
  141. }else{
  142. /* Find maximum diagonal element in dcm
  143. * store index in dcm_i */
  144. int dcm_i =0;
  145. int i;
  146. for(i =1; i <3; i++){
  147. if(dcm[i][i]> dcm[dcm_i][dcm_i]){
  148. dcm_i = i;
  149. }
  150. }
  151. dcm_j =(dcm_i +1)%3;
  152. dcm_k =(dcm_i +2)%3;
  153. s = sqrtf((dcm[dcm_i][dcm_i]- dcm[dcm_j][dcm_j]-
  154. dcm[dcm_k][dcm_k])+1.0f);
  155. quaternion[dcm_i +1]= s *0.5f;
  156. s =0.5f/ s;
  157. quaternion[dcm_j +1]=(dcm[dcm_i][dcm_j]+ dcm[dcm_j][dcm_i])* s;
  158. quaternion[dcm_k +1]=(dcm[dcm_k][dcm_i]+ dcm[dcm_i][dcm_k])* s;
  159. quaternion[0]=(dcm[dcm_k][dcm_j]- dcm[dcm_j][dcm_k])* s;
  160. }
  161. }
  162. /**
  163. * Converts euler angles to a rotation matrix
  164. *
  165. * @param roll the roll angle in radians
  166. * @param pitch the pitch angle in radians
  167. * @param yaw the yaw angle in radians
  168. * @param dcm a 3x3 rotation matrix
  169. */
  170. MAVLINK_HELPER void mavlink_euler_to_dcm(float roll,float pitch,float yaw,float dcm[3][3])
  171. {
  172. float cosPhi = cosf(roll);
  173. float sinPhi = sinf(roll);
  174. float cosThe = cosf(pitch);
  175. float sinThe = sinf(pitch);
  176. float cosPsi = cosf(yaw);
  177. float sinPsi = sinf(yaw);
  178. dcm[0][0]= cosThe * cosPsi;
  179. dcm[0][1]=-cosPhi * sinPsi + sinPhi * sinThe * cosPsi;
  180. dcm[0][2]= sinPhi * sinPsi + cosPhi * sinThe * cosPsi;
  181. dcm[1][0]= cosThe * sinPsi;
  182. dcm[1][1]= cosPhi * cosPsi + sinPhi * sinThe * sinPsi;
  183. dcm[1][2]=-sinPhi * cosPsi + cosPhi * sinThe * sinPsi;
  184. dcm[2][0]=-sinThe;
  185. dcm[2][1]= sinPhi * cosThe;
  186. dcm[2][2]= cosPhi * cosThe;
  187. }
  188. #endif

10.mavlink_types.h跟源代碼相比較屏蔽了下面這段代碼

(關於MAVPACKED相關定義在mavlink_avoid_errors.h中
  1. // Macro to define packed structures
  2. //#ifdef __GNUC__
  3. // #define MAVPACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
  4. //#else
  5. // #define MAVPACKED( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
  6. //#endif
mavlink_types.h全代碼
  1. #ifndef MAVLINK_TYPES_H_
  2. #define MAVLINK_TYPES_H_
  3. // Visual Studio versions before 2010 don't have stdint.h, so we just error out.
  4. #if (defined _MSC_VER) && (_MSC_VER < 1600)
  5. #error"The C-MAVLink implementation requires Visual Studio 2010 or greater"
  6. #endif
  7. #include<stdint.h>
  8. // Macro to define packed structures
  9. //#ifdef __GNUC__
  10. // #define MAVPACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
  11. //#else
  12. // #define MAVPACKED( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
  13. //#endif
  14. #ifndef MAVLINK_MAX_PAYLOAD_LEN
  15. // it is possible to override this, but be careful!
  16. #define MAVLINK_MAX_PAYLOAD_LEN 255///< Maximum payload length
  17. #endif
  18. #define MAVLINK_CORE_HEADER_LEN 5///< Length of core header (of the comm. layer): message length (1 byte) + message sequence (1 byte) + message system id (1 byte) + message component id (1 byte) + message type id (1 byte)
  19. #define MAVLINK_NUM_HEADER_BYTES (MAVLINK_CORE_HEADER_LEN +1)///< Length of all header bytes, including core and checksum
  20. #define MAVLINK_NUM_CHECKSUM_BYTES 2
  21. #define MAVLINK_NUM_NON_PAYLOAD_BYTES (MAVLINK_NUM_HEADER_BYTES + MAVLINK_NUM_CHECKSUM_BYTES)
  22. #define MAVLINK_MAX_PACKET_LEN (MAVLINK_MAX_PAYLOAD_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES)///< Maximum packet length
  23. #define MAVLINK_MSG_ID_EXTENDED_MESSAGE 255
  24. #define MAVLINK_EXTENDED_HEADER_LEN 14
  25. #if (defined _MSC_VER) || ((defined __APPLE__) && (defined __MACH__)) || (defined __linux__)
  26. /* full fledged 32bit++ OS */
  27. #define MAVLINK_MAX_EXTENDED_PACKET_LEN 65507
  28. #else
  29. /* small microcontrollers */
  30. #define MAVLINK_MAX_EXTENDED_PACKET_LEN 2048
  31. #endif
  32. #define MAVLINK_MAX_EXTENDED_PAYLOAD_LEN (MAVLINK_MAX_EXTENDED_PACKET_LEN - MAVLINK_EXTENDED_HEADER_LEN - MAVLINK_NUM_NON_PAYLOAD_BYTES)
  33. /**
  34. * Old-style 4 byte param union
  35. *
  36. * This struct is the data format to be used when sending
  37. * parameters. The parameter should be copied to the native
  38. * type (without type conversion)
  39. * and re-instanted on the receiving side using the
  40. * native type as well.
  41. */
  42. MAVPACKED(
  43. typedefstruct param_union {
  44. union{
  45. float param_float;
  46. int32_t param_int32;
  47. uint32_t param_uint32;
  48. int16_t param_int16;
  49. uint16_t param_uint16;
  50. int8_t param_int8;
  51. uint8_t param_uint8;
  52. uint8_t bytes[4];
  53. };
  54. uint8_t type;
  55. })mavlink_param_union_t;
  56. /**
  57. * New-style 8 byte param union
  58. * mavlink_param_union_double_t will be 8 bytes long, and treated as needing 8 byte alignment for the purposes of MAVLink 1.0 field ordering.
  59. * The mavlink_param_union_double_t will be treated as a little-endian structure.
  60. *
  61. * If is_double is 1 then the type is a double, and the remaining 63 bits are the double, with the lowest bit of the mantissa zero.
  62. * The intention is that by replacing the is_double bit with 0 the type can be directly used as a double (as the is_double bit corresponds to the
  63. * lowest mantissa bit of a double). If is_double is 0 then mavlink_type gives the type in the union.
  64. * The mavlink_types.h header will also need to have shifts/masks to define the bit boundaries in the above,
  65. * as bitfield ordering isn’t consistent between platforms. The above is intended to be for gcc on x86,
  66. * which should be the same as gcc on little-endian arm. When using shifts/masks the value will be treated as a 64 bit unsigned number,
  67. * and the bits pulled out using the shifts/masks.
  68. */
  69. MAVPACKED(
  70. typedefstruct param_union_extended {
  71. union{
  72. struct{
  73. uint8_t is_double:1;
  74. uint8_t mavlink_type:7;
  75. union{
  76. char c;
  77. uint8_tuint8;
  78. int8_tint8;
  79. uint16_tuint16;
  80. int16_tint16;
  81. uint32_tuint32;
  82. int32_tint32;
  83. float f;
  84. uint8_t align[7];
  85. };
  86. };
  87. uint8_t data[8];
  88. };
  89. })mavlink_param_union_double_t;
  90. /**
  91. * This structure is required to make the mavlink_send_xxx convenience functions
  92. * work, as it tells the library what the current system and component ID are.
  93. */
  94. MAVPACKED(
  95. typedefstruct __mavlink_system {
  96. uint8_t sysid;///< Used by the MAVLink message_xx_send() convenience function
  97. uint8_t compid;///< Used by the MAVLink message_xx_send() convenience function
  98. })mavlink_system_t;
  99. MAVPACKED(
  100. typedefstruct __mavlink_message {
  101. uint16_t checksum;///< sent at end of packet
  102. uint8_t magic;///< protocol magic marker
  103. uint8_t len;///< Length of payload
  104. uint8_t seq;///< Sequence of packet
  105. uint8_t sysid;///< ID of message sender system/aircraft
  106. uint8_t compid;///< ID of the message sender component
  107. uint8_t msgid;///< ID of message in payload
  108. uint64_t payload64[(MAVLINK_MAX_PAYLOAD_LEN+MAVLINK_NUM_CHECKSUM_BYTES+7)/8];
  109. })mavlink_message_t;
  110. MAVPACKED(
  111. typedefstruct __mavlink_extended_message {
  112. mavlink_message_t base_msg;
  113. int32_t extended_payload_len;///< Length of extended payload if any
  114. uint8_t extended_payload[MAVLINK_MAX_EXTENDED_PAYLOAD_LEN];
  115. })mavlink_extended_message_t;
  116. typedefenum{
  117. MAVLINK_TYPE_CHAR =0,
  118. MAVLINK_TYPE_UINT8_T =1,
  119. MAVLINK_TYPE_INT8_T =2,
  120. MAVLINK_TYPE_UINT16_T =3,
  121. MAVLINK_TYPE_INT16_T =4,
  122. MAVLINK_TYPE_UINT32_T =5,
  123. MAVLINK_TYPE_INT32_T =6,
  124. MAVLINK_TYPE_UINT64_T =7,
  125. MAVLINK_TYPE_INT64_T =8,
  126. MAVLINK_TYPE_FLOAT =9,
  127. MAVLINK_TYPE_DOUBLE =10
  128. }mavlink_message_type_t;
  129. #define MAVLINK_MAX_FIELDS 64
  130. typedefstruct __mavlink_field_info {
  131. constchar*name;// name of this field
  132. constchar*print_format;// printing format hint, or NULL
  133. mavlink_message_type_t type;// type of this field
  134. unsignedint array_length;// if non-zero, field is an array
  135. unsignedint wire_offset;// offset of each field in the payload
  136. unsignedint structure_offset;// offset in a C structure
  137. }mavlink_field_info_t;
  138. // note that in this structure the order of fields is the order
  139. // in the XML file, not necessary the wire order
  140. typedefstruct __mavlink_message_info {
  141. constchar*name;// name of the message
  142. unsigned num_fields;// how many fields in this message
  143. mavlink_field_info_t fields[MAVLINK_MAX_FIELDS];// field information
  144. }mavlink_message_info_t;
  145. #define _MAV_PAYLOAD(msg)((constchar*)(&((msg)->payload64[0])))
  146. #define _MAV_PAYLOAD_NON_CONST(msg)((char*)(&((msg)->payload64[0])))
  147. // checksum is immediately after the payload bytes
  148. #define mavlink_ck_a(msg)*((msg)->len +(uint8_t*)_MAV_PAYLOAD_NON_CONST(msg))
  149. #define mavlink_ck_b(msg)*(((msg)->len+(uint16_t)1)+(uint8_t*)_MAV_PAYLOAD_NON_CONST(msg))
  150. typedefenum{
  151. MAVLINK_COMM_0,
  152. MAVLINK_COMM_1,
  153. MAVLINK_COMM_2,
  154. MAVLINK_COMM_3
  155. }mavlink_channel_t;
  156. /*
  157. * applications can set MAVLINK_COMM_NUM_BUFFERS to the maximum number
  158. * of buffers they will use. If more are used, then the result will be
  159. * a stack overrun
  160. */
  161. #ifndef MAVLINK_COMM_NUM_BUFFERS
  162. #if (defined linux) | (defined __linux) | (defined __MACH__) | (defined _WIN32)
  163. # define MAVLINK_COMM_NUM_BUFFERS 16
  164. #else
  165. # define MAVLINK_COMM_NUM_BUFFERS 4
  166. #endif
  167. #endif
  168. typedefenum{
  169. MAVLINK_PARSE_STATE_UNINIT=0,
  170. MAVLINK_PARSE_STATE_IDLE,
  171. MAVLINK_PARSE_STATE_GOT_STX,
  172. MAVLINK_PARSE_STATE_GOT_SEQ,
  173. MAVLINK_PARSE_STATE_GOT_LENGTH,
  174. MAVLINK_PARSE_STATE_GOT_SYSID,
  175. MAVLINK_PARSE_STATE_GOT_COMPID,
  176. MAVLINK_PARSE_STATE_GOT_MSGID,
  177. MAVLINK_PARSE_STATE_GOT_PAYLOAD,
  178. MAVLINK_PARSE_STATE_GOT_CRC1,
  179. MAVLINK_PARSE_STATE_GOT_BAD_CRC1
  180. }mavlink_parse_state_t;///< The state machine for the comm parser
  181. typedefenum{
  182. MAVLINK_FRAMING_INCOMPLETE=0,
  183. MAVLINK_FRAMING_OK=1,
  184. MAVLINK_FRAMING_BAD_CRC=2
  185. }mavlink_framing_t;
  186. typedefstruct __mavlink_status {
  187. uint8_t msg_received;///< Number of received messages
  188. uint8_t buffer_overrun;///< Number of buffer overruns
  189. uint8_t parse_error;///< Number of parse errors
  190. mavlink_parse_state_t parse_state;///< Parsing state machine
  191. uint8_t packet_idx;///< Index in current packet
  192. uint8_t current_rx_seq;///< Sequence number of last packet received
  193. uint8_t current_tx_seq;///< Sequence number of last packet sent
  194. uint16_t packet_rx_success_count;///< Received packets
  195. uint16_t packet_rx_drop_count;///< Number of packet drops
  196. }mavlink_status_t;
  197. #define MAVLINK_BIG_ENDIAN 0
  198. #define MAVLINK_LITTLE_ENDIAN 1
  199. #endif/* MAVLINK_TYPES_H_ */

11.protocol.h未作任何修改,附上全代碼

protocol.h全代碼
  1. #ifndef _MAVLINK_PROTOCOL_H_//做者:恆久力行  qq:624668529
  2. #define _MAVLINK_PROTOCOL_H_
  3. #include"string.h"
  4. #include"mavlink_types.h"
  5. /*
  6. If you want MAVLink on a system that is native big-endian,
  7. you need to define NATIVE_BIG_ENDIAN
  8. */
  9. #ifdef NATIVE_BIG_ENDIAN
  10. # define MAVLINK_NEED_BYTE_SWAP (MAVLINK_ENDIAN == MAVLINK_LITTLE_ENDIAN)
  11. #else
  12. # define MAVLINK_NEED_BYTE_SWAP (MAVLINK_ENDIAN != MAVLINK_LITTLE_ENDIAN)
  13. #endif
  14. #ifndef MAVLINK_STACK_BUFFER
  15. #define MAVLINK_STACK_BUFFER 0
  16. #endif
  17. #ifndef MAVLINK_AVOID_GCC_STACK_BUG
  18. # define MAVLINK_AVOID_GCC_STACK_BUG defined(__GNUC__)
  19. #endif
  20. #ifndef MAVLINK_ASSERT
  21. #define MAVLINK_ASSERT(x)
  22. #endif
  23. #ifndef MAVLINK_START_UART_SEND
  24. #define MAVLINK_START_UART_SEND(chan, length)
  25. #endif
  26. #ifndef MAVLINK_END_UART_SEND
  27. #define MAVLINK_END_UART_SEND(chan, length)
  28. #endif
  29. /* option to provide alternative implementation of mavlink_helpers.h */
  30. #ifdef MAVLINK_SEPARATE_HELPERS
  31. #define MAVLINK_HELPER
  32. /* decls in sync with those in mavlink_helpers.h */
  33. #ifndef MAVLINK_GET_CHANNEL_STATUS
  34. MAVLINK_HELPER mavlink_status_t* mavlink_get_channel_status(uint8_t chan);
  35. #endif
  36. MAVLINK_HELPER void mavlink_reset_channel_status(uint8_t chan);
  37. #if MAVLINK_CRC_EXTRA
  38. MAVLINK_HELPER uint16_t mavlink_finalize_message_chan(mavlink_message_t* msg,uint8_t system_id,uint8_t component_id,
  39. uint8_t chan,uint8_t min_length,uint8_t length,uint8_t crc_extra);
  40. MAVLINK_HELPER uint16_t mavlink_finalize_message(mavlink_message_t* msg,uint8_t system_id,uint8_t component_id,
  41. uint8_t min_length,uint8_t length,uint8_t crc_extra);
  42. #ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
  43. MAVLINK_HELPER void _mav_finalize_message_chan_send(mavlink_channel_t chan,uint8_t msgid,constchar*packet,
  44. uint8_t min_length,uint8_t length,uint8_t crc_extra);
  45. #endif
  46. #else
  47. MAVLINK_HELPER uint16_t mavlink_finalize_message_chan(mavlink_message_t* msg,uint8_t system_id,uint8_t component_id,
  48. uint8_t chan,uint8_t length);
  49. MAVLINK_HELPER uint16_t mavlink_finalize_message(mavlink_message_t* msg,uint8_t system_id,uint8_t component_id,
  50. uint8_t length);
  51. #ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
  52. MAVLINK_HELPER void _mav_finalize_message_chan_send(mavlink_channel_t chan,uint8_t msgid,constchar*packet,uint8_t length);
  53. #endif
  54. #endif// MAVLINK_CRC_EXTRA
  55. MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t*buffer,constmavlink_message_t*msg);
  56. MAVLINK_HELPER void mavlink_start_checksum(mavlink_message_t* msg);
  57. MAVLINK_HELPER void mavlink_update_checksum(mavlink_message_t* msg,uint8_t c);
  58. MAVLINK_HELPER uint8_t mavlink_frame_char_buffer(mavlink_message_t* rxmsg,
  59. mavlink_status_t* status,
  60. uint8_t c,
  61. mavlink_message_t* r_message,
  62. mavlink_status_t* r_mavlink_status);
  63. MAVLINK_HELPER uint8_t mavlink_frame_char(uint8_t chan,uint8_t c,mavlink_message_t* r_message,mavlink_status_t* r_mavlink_status);
  64. MAVLINK_HELPER uint8_t mavlink_parse_char(uint8_t chan,uint8_t c,mavlink_message_t* r_message,mavlink_status_t* r_mavlink_status);
  65. MAVLINK_HELPER uint8_t put_bitfield_n_by_index(int32_t b,uint8_t bits,uint8_t packet_index,uint8_t bit_index,
  66. uint8_t* r_bit_index,uint8_t* buffer);
  67. #ifdef MAVLINK_USE_CONVENIENCE_FUNCTIONS
  68. MAVLINK_HELPER void _mavlink_send_uart(mavlink_channel_t chan,constchar*buf,uint16_t len);
  69. MAVLINK_HELPER void _mavlink_resend_uart(mavlink_channel_t chan,constmavlink_message_t*msg);
  70. #endif
  71. #else
  72. #define MAVLINK_HELPER staticinline
  73. #include"mavlink_helpers.h"
  74. #endif// MAVLINK_SEPARATE_HELPERS
  75. /**
  76. * @brief Get the required buffer size for this message
  77. */
  78. staticinlineuint16_t mavlink_msg_get_send_buffer_length(constmavlink_message_t* msg)
  79. {
  80. return msg->len + MAVLINK_NUM_NON_PAYLOAD_BYTES;
  81. }
  82. #if MAVLINK_NEED_BYTE_SWAP
  83. staticinlinevoid byte_swap_2(char*dst,constchar*src)
  84. {
  85. dst[0]= src[1];
  86. dst[1]= src[0];
  87. }
  88. staticinlinevoid byte_swap_4(char*dst,constchar*src)
  89. {
  90. dst[0]= src[3];
  91. dst[1]= src[2];
  92. dst[2]= src[1];
  93. dst[3]= src[0];
  94. }
  95. staticinlinevoid byte_swap_8(char*dst,constchar*src)
  96. {
  97. dst[0]= src[7];
  98. dst[1]= src[6];
  99. dst[2]= src[5];
  100. dst[3]= src[4];
  101. dst[4]= src[3];
  102. dst[5]= src[2];
  103. dst[6]= src[1];
  104. dst[7]= src[0];
  105. }
  106. #elif!MAVLINK_ALIGNED_FIELDS
  107. staticinlinevoid byte_copy_2(char*dst,constchar*src)
  108. {
  109. dst[0]= src[0];
  110. dst[1]= src[1];
  111. }
  112. staticinlinevoid byte_copy_4(char*dst,constchar*src)
  113. {
  114. dst[0]= src[0];
  115. dst[1]= src[1];
  116. dst[2]= src[2];
  117. dst[3]= src[3];
  118. }
  119. staticinlinevoid byte_copy_8(char*dst,constchar*src)
  120. {
  121. memcpy(dst, src,8);
  122. }
  123. #endif
  124. #define_mav_put_uint8_t(buf, wire_offset, b) buf[wire_offset]=(uint8_t)b
  125. #define_mav_put_int8_t(buf, wire_offset, b) buf[wire_offset]=(int8_t)b
  126. #define _mav_put_char(buf, wire_offset, b) buf[wire_offset]= b
  127. #if MAVLINK_NEED_BYTE_SWAP
  128. #define_mav_put_uint16_t(buf, wire_offset, b) byte_swap_2(&buf[wire_offset],(constchar*)&b)
  129. #define_mav_put_int16_t(buf, wire_offset, b) byte_swap_2(&buf[wire_offset],(constchar*)&b)
  130. #define_mav_put_uint32_t(buf, wire_offset, b) byte_swap_4(&buf[wire_offset],(constchar*)&b)
  131. #define_mav_put_int32_t(buf, wire_offset, b) byte_swap_4(&buf[wire_offset],(constchar*)&b)
  132. #define_mav_put_uint64_t(buf, wire_offset, b) byte_swap_8(&buf[wire_offset],(constchar*)&b)
  133. #define_mav_put_int64_t(buf, wire_offset, b) byte_swap_8(&buf[wire_offset],(constchar*)&b)
  134. #define _mav_put_float(buf, wire_offset, b) byte_swap_4(&buf[wire_offset],(constchar*)&b)
  135. #define _mav_put_double(buf, wire_offset, b) byte_swap_8(&buf[wire_offset],(constchar*)&b)
  136. #elif!MAVLINK_ALIGNED_FIELDS
  137. #define_mav_put_uint16_t(buf, wire_offset, b) byte_copy_2(&buf[wire_offset],(constchar*)&b)
  138. #define_mav_put_int16_t(buf, wire_offset, b) byte_copy_2(&buf[wire_offset],(constchar*)&b)
  139. #define_mav_put_uint32_t(buf, wire_offset, b) byte_copy_4(&buf[wire_offset],(constchar*)&b)
  140. #define_mav_put_int32_t(buf, wire_offset, b) byte_copy_4(&buf[wire_offset],(constchar*)&b)
  141. #define_mav_put_uint64_t(buf, wire_offset, b) byte_copy_8(&buf[wire_offset],(constchar*)&b)
  142. #define_mav_put_int64_t(buf, wire_offset, b) byte_copy_8(&buf[wire_offset],(constchar*)&b)
  143. #define _mav_put_float(buf, wire_offset, b) byte_copy_4(&buf[wire_offset],(constchar*)&b)
  144. #define _mav_put_double(buf, wire_offset, b) byte_copy_8(&buf[wire_offset],(constchar*)&b)
  145. #else
  146. #define_mav_put_uint16_t(buf, wire_offset, b)*(uint16_t*)&buf[wire_offset]= b
  147. #define_mav_put_int16_t(buf, wire_offset, b)*(int16_t*)&buf[wire_offset]= b
  148. #define_mav_put_uint32_t(buf, wire_offset, b)*(uint32_t*)&buf[wire_offset]= b
  149. #define_mav_put_int32_t(buf, wire_offset, b)*(int32_t*)&buf[wire_offset]= b
  150. #define_mav_put_uint64_t(buf, wire_offset, b)*(uint64_t*)&buf[wire_offset]= b
  151. #define_mav_put_int64_t(buf, wire_offset, b)*(int64_t*)&buf[wire_offset]= b
  152. #define _mav_put_float(buf, wire_offset, b)*(float*)&buf[wire_offset]= b
  153. #define _mav_put_double(buf, wire_offset, b)*(double*)&buf[wire_offset]= b
  154. #endif
  155. /*
  156. like memcpy(), but if src is NULL, do a memset to zero
  157. */
  158. staticinlinevoid mav_array_memcpy(void*dest,constvoid*src,size_t n)
  159. {
  160. if(src == NULL){
  161. memset(dest,0, n);
  162. }else{
  163. memcpy(dest, src, n);
  164. }
  165. }
  166. /*
  167. * Place a char array into a buffer
  168. */
  169. staticinlinevoid _mav_put_char_array(char*buf,uint8_t wire_offset,constchar*b,uint8_t array_length)
  170. {
  171. mav_array_memcpy(&buf[wire_offset], b, array_length);
  172. }
  173. /*
  174. * Place a uint8_t array into a buffer
  175. */
  176. staticinlinevoid _mav_put_uint8_t_array(char*buf,uint8_t wire_offset,constuint8_t*b,uint8_t array_length)
  177. {
  178. mav_array_memcpy(&buf[wire_offset], b, array_length);
  179. }
  180. /*
  181. * Place a int8_t array into a buffer
  182. */
  183. staticinlinevoid _mav_put_int8_t_array(char*buf,uint8_t wire_offset,constint8_t*b,uint8_t array_length)
  184. {
  185. mav_array_memcpy(&buf[wire_offset], b, array_length);
  186. }
  187. #if MAVLINK_NEED_BYTE_SWAP
  188. #define _MAV_PUT_ARRAY(TYPE, V) \
  189. staticinlinevoid _mav_put_ ## TYPE ##_array(char *buf, uint8_t wire_offset, const TYPE *b, uint8_t array_length) \
  190. { \
  191. if(b == NULL){ \
  192. memset(&buf[wire_offset],0, array_length*sizeof(TYPE)); \
  193. }else{ \
  194. uint16_t i; \
  195. for(i=0; i<array_length; i++){ \
  196. _mav_put_## TYPE (buf, wire_offset+(i*sizeof(TYPE)), b[i]); \
  197. } \
  198. } \
  199. }
  200. #else
  201. #define _MAV_PUT_ARRAY(TYPE, V) \
  202. staticinlinevoid _mav_put_ ## TYPE ##_array(char *buf, uint8_t wire_offset, const TYPE *b, uint8_t array_length) \
  203. { \
  204. mav_array_memcpy(&buf[wire_offset], b, array_length*sizeof(TYPE)); \
  205. }
  206. #endif
  207. _MAV_PUT_ARRAY(uint16_t, u16)
  208. _MAV_PUT_ARRAY(uint32_t, u32)
  209. _MAV_PUT_ARRAY(uint64_t, u64)
  210. _MAV_PUT_ARRAY(int16_t, i16)
  211. _MAV_PUT_ARRAY(int32_t, i32)
  212. _MAV_PUT_ARRAY(int64_t, i64)
  213. _MAV_PUT_ARRAY(float, f)
  214. _MAV_PUT_ARRAY(double, d)
  215. #define _MAV_RETURN_char(msg, wire_offset)(constchar)_MAV_PAYLOAD(msg)[wire_offset]
  216. #define_MAV_RETURN_int8_t(msg, wire_offset)(int8_t)_MAV_PAYLOAD(msg)[wire_offset]
  217. #define_MAV_RETURN_uint8_t(msg, wire_offset)(uint8_t)_MAV_PAYLOAD(msg)[wire_offset]
  218. #if MAVLINK_NEED_BYTE_SWAP
  219. #define _MAV_MSG_RETURN_TYPE(TYPE, SIZE) \
  220. staticinline TYPE _MAV_RETURN_## TYPE(const mavlink_message_t *msg, uint8_t ofs) \
  221. { TYPE r; byte_swap_## SIZE((char*)&r, &_MAV_PAYLOAD(msg)[ofs]); return r; }
  222. _MAV_MSG_RETURN_TYPE(uint16_t,2)
  223. _MAV_MSG_RETURN_TYPE(int16_t,2)
  224. _MAV_MSG_RETURN_TYPE(uint32_t,4)
  225. _MAV_MSG_RETURN_TYPE(int32_t,4)
  226. _MAV_MSG_RETURN_TYPE(uint64_t,8)
  227. _MAV_MSG_RETURN_TYPE(int64_t,8)
  228. _MAV_MSG_RETURN_TYPE(float,4)
  229. _MAV_MSG_RETURN_TYPE(double,8)
  230. #elif!MAVLINK_ALIGNED_FIELDS
  231. #define _MAV_MSG_RETURN_TYPE(TYPE, SIZE) \
  232. staticinline TYPE _MAV_RETURN_## TYPE(const mavlink_message_t *msg, uint8_t ofs) \
  233. { TYPE r; byte_copy_## SIZE((char*)&r, &_MAV_PAYLOAD(msg)[ofs]); return r; }
  234. _MAV_MSG_RETURN_TYPE(uint16_t,2)
  235. _MAV_MSG_RETURN_TYPE(int16_t,2)
  236. _MAV_MSG_RETURN_TYPE(uint32_t,4)
  237. _MAV_MSG_RETURN_TYPE(int32_t,4)
  238. _MAV_MSG_RETURN_TYPE(uint64_t,8)
  239. _MAV_MSG_RETURN_TYPE(int64_t,8)
  240. _MAV_MSG_RETURN_TYPE(float,4)
  241. _MAV_MSG_RETURN_TYPE(double,8)
  242. #else// nicely aligned, no swap
  243. #define _MAV_MSG_RETURN_TYPE(TYPE) \
  244. staticinline TYPE _MAV_RETURN_## TYPE(const mavlink_message_t *msg, uint8_t ofs) \
  245. {return*(const TYPE *)(&_MAV_PAYLOAD(msg)[ofs]);}
  246. _MAV_MSG_RETURN_TYPE(uint16_t)
  247. _MAV_MSG_RETURN_TYPE(int16_t)
  248. _MAV_MSG_RETURN_TYPE(uint32_t)
  249. _MAV_MSG_RETURN_TYPE(int32_t)
  250. _MAV_MSG_RETURN_TYPE(uint64_t)
  251. _MAV_MSG_RETURN_TYPE(int64_t)
  252. _MAV_MSG_RETURN_TYPE(float)
  253. _MAV_MSG_RETURN_TYPE(double)
  254. #endif// MAVLINK_NEED_BYTE_SWAP
  255. staticinlineuint16_t _MAV_RETURN_char_array(constmavlink_message_t*msg,char*value,
  256. uint8_t array_length,uint8_t wire_offset)
  257. {
  258. memcpy(value,&_MAV_PAYLOAD(msg)[wire_offset], array_length);
  259. return array_length;
  260. }
  261. staticinlineuint16_t _MAV_RETURN_uint8_t_array(constmavlink_message_t*msg,uint8_t*value,
  262. uint8_t array_length,uint8_t wire_offset)
  263. {
  264. memcpy(value,&_MAV_PAYLOAD(msg)[wire_offset], array_length);
  265. return array_length;
  266. }
  267. staticinlineuint16_t _MAV_RETURN_int8_t_array(constmavlink_message_t*msg,int8_t*value,
  268. uint8_t array_length,uint8_t wire_offset)
  269. {
  270. memcpy(value,&_MAV_PAYLOAD(msg)[wire_offset], array_length);
  271. return array_length;
  272. }
  273. #if MAVLINK_NEED_BYTE_SWAP
  274. #define _MAV_RETURN_ARRAY(TYPE, V) \
  275. staticinlineuint16_t _MAV_RETURN_## TYPE ##_array(const mavlink_message_t *msg, TYPE *value, \
  276. uint8_t array_length,uint8_t wire_offset) \
  277. { \
  278. uint16_t i; \
  279. for(i=0; i<array_length; i++){ \
  280. value[i]= _MAV_RETURN_## TYPE (msg, wire_offset+(i*sizeof(value[0]))); \
  281. } \
  282. return array_length*sizeof(value[0]); \
  283. }
  284. #else
  285. #define _MAV_RETURN_ARRAY(TYPE, V) \
  286. staticinlineuint16_t _MAV_RETURN_## TYPE ##_array(const mavlink_message_t *msg, TYPE *value, \
  287. uint8_t array_length,uint8_t wire_offset) \
  288. { \
  289. memcpy(value,&_MAV_PAYLOAD(msg)[wire_offset], array_length*sizeof(TYPE)); \
  290. return array_length*sizeof(TYPE); \
  291. }
  292. #endif
  293. _MAV_RETURN_ARRAY(uint16_t, u16)
  294. _MAV_RETURN_ARRAY(uint32_t, u32)
  295. _MAV_RETURN_ARRAY(uint64_t, u64)
  296. _MAV_RETURN_ARRAY(int16_t, i16)
  297. _MAV_RETURN_ARRAY(int32_t, i32)
  298. _MAV_RETURN_ARRAY(int64_t, i64)
  299. _MAV_RETURN_ARRAY(float, f)
  300. _MAV_RETURN_ARRAY(double, d)
  301. #endif// _MAVLINK_PROTOCOL_H_//做者:恆久力行  qq:624668529

12.其餘代碼均未修改,詳細移植步驟請參考教程二和教程一。

 
如今代碼已經移植成功。
 

二:實驗測試代碼是否移植成功

將代碼下載到stm32f407的開發板中去。
打開串口調試助手,設置波特率 115200, 16進制顯示接收到的數據。不細講,看圖

1.測試開發板發送功能

       而後重啓或者復位開發板,會有數據返回(注意: 選中16進制顯示)。如圖收到如圖數據表示發送移植成功。復位一次返回一次一樣的數據 // 做者:恆久力行   qq:624668529
        

 2.測試開發板接收功能

    將接收到的數據原封不動的拷貝下來,(複製下來的是16進制的哦,別弄成字符亂碼了,注意從FE到結尾的空格都不能少),而後 選中16進制發送 同時取消16進制顯示。 而後將數據粘貼在發送窗(發送窗必定要清空,不能有空格或者回車讓光標刪除到最前端),先清空接收,點擊發送,會有以下字符返回,如圖表示接受移植成功。點擊一次發送返回一次一樣的字符 // 做者:恆久力行   qq:624668529
    
 

三:分析數據

1.下面是串口助手接收到的開發板發過來的數據

  1. FE 0900000000000000000203510403855D FE 1C01000021010000000200000003000000040000000500000006000700080009002A16

2.下圖是消息包的發送格式說明

 

3.將從開發板收到的16進制的數據以FE爲分界將兩條消息按格式展開如圖

 
 
 
 
 

4分析

開發板發出的數據, 首先都是以FE開頭,先看第一幀數據的第二個字節,LEN表明有效載荷PAYLOAD的長度,經本身親自數數PAYLOAD   確實是9個字節(注意16進制要轉換成10進制),同理,再來看第二幀數據的第二個字節1C轉換成10進制是28.數一數PAYLOAD的長度確實爲28.表示移植數據發送成功。
 
開發板接收的數據是咱們原封不動發回去的數據,其收到後,會對數據進行解析。其對兩幀數據解析的結果是(即第二次發回來的字符):
Received message with ID 0, sequence: 0 from component 0 of system 0
Received message with ID 33, sequence: 1 from component 0 of system 0
 
對比 message with ID 便是 MSG   (10進制)
         sequence              既是SEQ
         component            既是COMP
         system                   既是SYS
 
對比以後發現數據一一對應。即開發板收到數據後成功的解析了數據。表示移植開發板接收部分紅功
 
 
移植成功。做者:恆久力行 qq:624668529
 
  



附件列表

相關文章
相關標籤/搜索