最近一直在弄关于SBUS的编码与解码这方面的内容,虽然网上资料很多,但是网上资料太杂,我找的一些资料可能是我理解的问题,所以我摒弃了一些骚操作,对于一些单片机学得不精的人来说,有些地方是值得注意的。
对于SBUS的探索,首先我个人是使用51芯片的遥控器通过NRF24L01发送遥控器PWM模拟量到一块STM32F030的接收机,在接收机内进行PWM转SBUS的操作,之后通过串口发送出SBUS信号,用F4飞控来连接串口发送出来的SBUS信号,并检验信号是否正确。(虽然这样挺麻烦的,但是检验起来很方便)
1.九位数据位、偶校验
SBUS本质是一种串口通信协议,采用100K的波特率,8位数据位,两位停止位,偶效验,即8E2的串口通信。
这里对于单片机学得不精的人来说特别容易搞混,波特率100000,两位停止位没什么问题。问题在于8位数据位,偶校验,这段话在单片机中却需要这样子表达9位数据位、偶校验。对没有错是9位数据位、偶校验。刚开始编码的时候我就一直卡在了这里,F4的飞控一直识别不了我编码的SBUS信号。原因如下:
/* 如果需要8位数据,无奇偶校验,则数据长度=8
如果需要8位数据,有奇偶校验,则数据长度=9*/
所以,关于串口端的设置,代码如下:
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 100000; //设定传输速率
USART_InitStructure.USART_WordLength = USART_WordLength_9b; //设定传输数据位数
USART_InitStructure.USART_StopBits = USART_StopBits_2; //设定停止位个数——2位
USART_InitStructure.USART_Parity = USART_Parity_Even ; //偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不用流量控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //使用接收和发送功能
USART_Init(USART1, &USART_InitStructure); &n