楼主

遥控发送数据解码

[复制链接]
正式队员ksc
2015-3-20 19:57:19 只看该作者

马上注册,玩转Robomaster!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我的遥控发送数据后,发现接收到的18个字节按照官方解码方法是不对的。
其中第5,6,7,8,9,10字节是由遥控的四个通道ch0-3控制的,而遥控s1和s2分别控制第12字节+13字节高四位和13字节低四位+14字节。多次复位后,一直保持此结果。并且在拨动遥控通道,他的数据大小变化无规律。求回复
跳转到指定楼层
推荐

遥控发送数据解码

[复制链接]
正式队员ksc
 楼主| 2015-3-22 12:09:28 只看该作者
liughsy 发表于 2015-3-22 10:38
把代码贴出来分析下,不要贴十六进制的,贴成你解码后每个通道的十进制 ...

#include "main.h"
/*-----USART2_RX-----PA3----*/
//for D-BUS

volatile unsigned char sbus_rx_buffer[25];

void USART2_Configuration(void)
{
                {
                        GPIO_InitTypeDef  gpio;
                        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
                        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3 ,GPIO_AF_USART2);
                        gpio.GPIO_Pin = GPIO_Pin_3 ;
                        gpio.GPIO_Mode = GPIO_Mode_AF;
                        gpio.GPIO_OType = GPIO_OType_PP;
                        gpio.GPIO_Speed = GPIO_Speed_100MHz;
                        gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
                        GPIO_Init(GPIOA,&gpio);
                }
    {
                        USART_InitTypeDef usart2;
                        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
                        USART_DeInit(USART2);
                        usart2.USART_BaudRate = 100000;   //SBUS 100K baudrate
                        usart2.USART_WordLength = USART_WordLength_8b;
                        usart2.USART_StopBits = USART_StopBits_1;
                        usart2.USART_Parity = USART_Parity_Even;
                        usart2.USART_Mode = USART_Mode_Rx;
                        usart2.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
                        USART_Init(USART2,&usart2);
                       
                        USART_ITConfig(USART2, USART_IT_RXNE ,ENABLE);
                        USART_Cmd(USART2,ENABLE);
                        USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);
                }
    {
                        NVIC_InitTypeDef  nvic;
                        nvic.NVIC_IRQChannel = DMA1_Stream5_IRQn;
                        nvic.NVIC_IRQChannelPreemptionPriority = 1;
                        nvic.NVIC_IRQChannelSubPriority = 1;
                        nvic.NVIC_IRQChannelCmd = ENABLE;
                        NVIC_Init(&nvic);
                        /*nvic.NVIC_IRQChannel = USART2_IRQn;
                        nvic.NVIC_IRQChannelPreemptionPriority = 0;
                        nvic.NVIC_IRQChannelSubPriority = 1;
                        nvic.NVIC_IRQChannelCmd = ENABLE;
                        NVIC_Init(&nvic);*/
                }
    {
                        DMA_InitTypeDef   dma;
                        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
                        DMA_DeInit(DMA1_Stream5);
                        dma.DMA_Channel= DMA_Channel_4;
                        dma.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR);
                        dma.DMA_Memory0BaseAddr = (uint32_t)sbus_rx_buffer;
                        dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
                        dma.DMA_BufferSize = 18;
                        dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
                        dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
                        dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
                        dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
                        dma.DMA_Mode = DMA_Mode_Circular;
                        dma.DMA_Priority = DMA_Priority_VeryHigh;
                        dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
                        dma.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
                        dma.DMA_MemoryBurst = DMA_Mode_Normal;
                        dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
                        DMA_Init(DMA1_Stream5,&dma);
                        DMA_ITConfig(DMA1_Stream5,DMA_IT_TC,ENABLE);
                        DMA_Cmd(DMA1_Stream5,ENABLE);
         }
}



uint16_t  sbus_channel_temp[15];



RC_Ctl_t RC_Ctl;
void DMA1_Stream5_IRQHandler(void)
{
         
    if(DMA_GetITStatus(DMA1_Stream5, DMA_IT_TCIF5))
    {
        DMA_ClearFlag(DMA1_Stream5, DMA_FLAG_TCIF5);
        DMA_ClearITPendingBit(DMA1_Stream5, DMA_IT_TCIF5);
                               
                                RC_Ctl.rc.ch0 = (sbus_rx_buffer[0]| (sbus_rx_buffer[1] << 8)) & 0x07ff; //!< Channel 0
                                RC_Ctl.rc.ch1 = ((sbus_rx_buffer[1] >> 3) | (sbus_rx_buffer[2] << 5)) & 0x07ff; //!< Channel 1
                                RC_Ctl.rc.ch2 = ((sbus_rx_buffer[2] >> 6) | (sbus_rx_buffer[3] << 2) | (sbus_rx_buffer[4] << 10)) & 0x07ff;//!< Channel 2
                          RC_Ctl.rc.ch3 = ((sbus_rx_buffer[4] >> 1) | (sbus_rx_buffer[5] << 7)) & 0x07ff; //!< Channel 3
                                RC_Ctl.rc.s1 = ((sbus_rx_buffer[5] >> 4)& 0x000C) >> 2; //!< Switch left
                                RC_Ctl.rc.s2 = ((sbus_rx_buffer[5] >> 4)& 0x0003);
                                RC_Ctl.mouse.x = sbus_rx_buffer[6] | (sbus_rx_buffer[7] << 8); //!< Mouse X axis
                                RC_Ctl.mouse.y = sbus_rx_buffer[8] | (sbus_rx_buffer[9] << 8); //!< Mouse Y axis
                                RC_Ctl.mouse.z = sbus_rx_buffer[10] | (sbus_rx_buffer[11] << 8); //!< Mouse Z axis
                                RC_Ctl.mouse.press_l = sbus_rx_buffer[12]; //!< Mouse Left Is Press ?
                                RC_Ctl.mouse.press_r = sbus_rx_buffer[13]; //!< Mouse Right Is Press ?
                                RC_Ctl.key.v = sbus_rx_buffer[14] | (sbus_rx_buffer[15] << 8); //!< KeyBoard value
    }
}
推荐

遥控发送数据解码

[复制链接]
工程Nemo_o
2015-3-22 13:57:25 只看该作者

推荐

遥控发送数据解码

[复制链接]
顾问liughsy
2015-3-23 16:25:49 只看该作者
Nemo_o 发表于 2015-3-22 13:57
案例里给的这一段错了,要改成下面这段:

RC_Ctl.rc.s1 = ((sbus_rx_buffer[5] >> 4)& 0x03); //!< Swit ...

不对,我用官方的都能正确测出来,你先用官方的读下读数,


沙发

遥控发送数据解码

[复制链接]
步兵LittleQiang
2015-3-20 21:45:56 只看该作者
你用的是什么板子?
板凳

遥控发送数据解码

[复制链接]
正式队员ksc
 楼主| 2015-3-20 22:13:12 只看该作者
stm32f4啊,官方的电路
地板

遥控发送数据解码

[复制链接]
英雄IRONMAN
2015-3-20 23:06:33 只看该作者
你看看是不是波特率不对?
5#

遥控发送数据解码

[复制链接]
正式队员ksc
 楼主| 2015-3-21 23:12:45 只看该作者
IRONMAN 发表于 2015-3-20 23:06
你看看是不是波特率不对?

波特率设置的·是100000,是对的,如果不对的话,那个数据不是稳定的,而我的数据是稳定的,只有遥控状态改变时,接收到的数据才会变化
6#

遥控发送数据解码

[复制链接]
顾问liughsy
2015-3-22 10:38:36 只看该作者
把代码贴出来分析下,不要贴十六进制的,贴成你解码后每个通道的十进制
10#

遥控发送数据解码

[复制链接]
工程Nemo_o
2015-3-24 22:37:59 只看该作者
liughsy 发表于 2015-3-23 16:25
不对,我用官方的都能正确测出来,你先用官方的读下读数,

官方的S1和S2反了,没有其他的问题,我想多了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

触屏版 | 电脑版

Copyright © 2024 RoboMasters 版权所有 备案号 粤ICP备2022092332号

快速回复 返回顶部 返回列表