zoukankan      html  css  js  c++  java
  • 移植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. /*解决..MAVLINKcommon../mavlink_types.h(53): error: #20: identifier "pack" is undefined*/
    10. #define MAVPACKED( __Declaration__ ) __Declaration__
    11. /*解决..MAVLINKcommon../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- 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- 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
     
      



    附件列表

  • 相关阅读:
    推荐:《TestDrive ASP.NET MVC》 节选与作者访谈
    30天敏捷结果(15):让自己处于宁静状态
    MDSF:如何使用GMF来做TOGAF建模工具
    强烈推荐:好书、好人、好谚语
    推荐:50个加强表单的jQuery插件
    101与金根回顾敏捷个人:(1)基于MBTI模型发现你的职业性格
    30天敏捷结果(19):你在为谁做事?
    30天敏捷生活(13):获得他人的反馈
    SourceForge.net上的新项目(2005/07/05)
    Open License,开源的许可生成器,实现你自己的许可管理器/应用
  • 原文地址:https://www.cnblogs.com/daxuezhidao/p/6064802.html
Copyright © 2011-2022 走看看