小强电脑与stm32底层串口通讯协议
串口波特率为115200,8个数据位,1个停止位,无奇偶校验。
第一部分是上位机对底层下发的控制指令:
每个指令构成一个数据帧,可以同时下发多个数据帧,帧内容是:包头+长度+内容,包头为3个u8字符:205 235 215 长度是1个u8字符,长度不包括包头和长度字符自身,内容为命令+参数。
单字符命令,即一个字符完成的命令: 调试模式 ‘T’ 运行模式 ‘R’ 软件复位 ‘I’
例如,让stm32软件复位,下发的数据帧hex内容为:0xcd 0xeb 0xd7 0x01 0x49
双字符命令,即一个字符加一个参数X完成的命令:
前进 'f‘X , X数值范围为0~100
后退 'b’X , X数值范围为0~100
刹车 's'X , X数值任意
左转 'c'X , X数值范围为0~100
右转 'd'X , X数值范围为0~100
例如:
以80%的制动量制动小车: 0xcd 0xeb 0xd7 0x02 0x73 0x50
以16%的速度左转: 0xcd 0xeb 0xd7 0x02 0x63 0x10
以16%的速度右转: 0xcd 0xeb 0xd7 0x02 0x64 0x10
多字符带参数命令: 设置电机 't'XXXXxxxx 命令说明:完整命令格式tABCDabcd,总共9个字符。t为命令标识,表示设置电机命令 ABCD分别为1--4个电机的状态,每个字符有三种状态,F:向前,B:向后,S:刹车, 其他字符无效。abcd为四个电机的速度等级,范围0~100,即以字符的数值表示速度
例如:
让四个电机全部以0%的制动量刹车 tSSSS0000
对应帧内容为 0xcd 0xeb 0xd7 0x09 0x74 0x53 0x53 0x53 0x53 0x00 0x00 0x00 0x00
对于小强硬件,只有前两个电机有效,第一个电机对应右轮,第二个电机对应左轮
第二部分是底层给上位机上传的数据:
也是数据帧的形式上传,上传频率为50HZ。帧格式和上面的命令帧一样,只是把命令内容换成了数据。 数据内容是由23个4字节小端模式二进制表示的数字组成,数字之间用空格0x20分开。这23个数字可以构成如下结构体,建议使用内存拷贝的方式直接将数据内容拷贝给这个结构体,然后以结构体形式访问数据,这样可以避免浮点数转换问题。具体代码请参考我们git开源仓库中的上位机ros驱动。
typedef struct {
int status;//小车状态,0表示未初始化,1表示正常,-1表示error
float power;//电源电压【9 13】v
float theta;//方位角,【0 360)°
int encoder_ppr;//车轮1转对应的编码器个数
int encoder_delta_r;//右轮编码器增量, 个为单位
int encoder_delta_l;//左轮编码器增量, 个为单位
int encoder_delta_car;//两车轮中心位移,个为单位
int omga_r;//右轮转速 个每秒
int omga_l;//左轮转速 个每秒
float distance1;//第一个超声模块距离值 单位cm
float distance2;//第二个超声模块距离值 单位cm
float distance3;//第三个超声模块距离值 单位cm
float distance4;//第四个超声模块距离值 单位cm
float IMU[9];//mpu9250 9轴数据
unsigned int time_stamp;//时间戳
}UPLOAD_STATUS;