问题描述
由于更改波特率指令错误导致通讯异常,输出全是乱码的情况,现象如下,
不管什么更换常用的波特率都无法看到使用说明书描述0x59,0x59的帧头
乱码数据图片
正常数据图片
分析
给雷达上电,并使用逻辑分析仪采集波形数据
这次测试使用的是Kingst LA1010
采集异常波形
如图:
- 自动检测波特率为625000,从数据上看解析并不对,所以真实波特率差异较大(如下图)
异常图
正常图 0x59开头
- 根据一个BYTE的时间计算大概波特率
北醒默认雷达通讯协议为8N1,也就是1个起始位+8个数据位+1个停止位,停止位时间非固定不好计算,所以计算9个BIT的时间
注:单独测一个BIT偏差较大,如果在比较快的波特率下,误差太大,容易出现计算错误的情况
帧头0x59模拟波形如下图
测量实际测试的时间
如上图实际测量9个BIT时间为17.3us
1个BIT时间为 17.3us/9bit ≈ 1.922us/bit
计算波特率 1S/1.922us/bit = 1*10^6us/1.922us/bit ≈ 520291bit
大概波特率为520291 导入刚才的逻辑分析仪解析一下数据(关闭自动检测波特率)
如图:更改后解析已经变正常的0x59
恢复
如果使用串口助手尝试使用自定义的波特率可以实现的话建议使用串口助手
使用TTL-USB接电脑使用串口助手可能会出现没有自定义波特率以及波特率设定后无法正常启用的情况以及以上所得波特率可能并不是非常准确,有可能存在误差
或者使用Arduino开发板更改,此次使用硬件串口,不建议使用软串口,问题较多。
全部例程如下:
typedef struct {
int distance;
int strength;
int temp;
boolean receiveComplete;
} TF;
TF Lidar = {0, 0, 0, false};
u8 cmd[8] = {0x5A, 0x04, 0x10, 0x6E, 0x5A, 0x04, 0x11, 0x6F}; //恢复出厂配置指令
void getLidarData(TF* lidar)
{
static char i = 0;
char j = 0;
int checksum = 0;
static int rx[9];
if (Serial.available())
{
rx[i] = Serial.read();
if (rx[0] != 0x59)
{
i = 0;
}
else if (i == 1 && rx[1] != 0x59) {
i = 0;
}
else if (i == 8)
{
for (j = 0; j < 8; j++)
{
checksum += rx[j];
}
if (rx[8] == (checksum % 256))
{
lidar->distance = rx[2] + rx[3] * 256;
lidar->strength = rx[4] + rx[5] * 256;
lidar->temp = (rx[6] + rx[7] * 256) / 8 - 256;
lidar->receiveComplete = true;
}
i = 0;
}
else
{
i++;
}
}
}/*首先将雷达输出的9位数据按顺序存放入‘rx[]’数组中,随后计算输出的距离、信号强度、温度*/
u8 cmd[8] = {0x5A, 0x04, 0x10, 0x6E, 0x5A, 0x04, 0x11, 0x6F}; //恢复出厂配置指令
void setup() {
long int foc = 510000;
long int i = 0;
for(i=0;i<100000;i++)
{
foc++;
Serial.begin(foc);
Serial.write(cmd,8);
}
Serial.begin(115200);
Serial.print("END!!!!!");
}
void loop()
{
getLidarData(&Lidar);
if (Lidar.receiveComplete)
{
Lidar.receiveComplete = false;
Serial.print("Distance: ");
Serial.print(Lidar.distance);
Serial.print("cm\t");
Serial.print("Strength: ");
Serial.print(Lidar.strength);
Serial.print("\t");
Serial.print("Temp: ");
Serial.println(Lidar.temp);
}
}
以下是通过轮询的方式直接给雷达发送恢复出厂配置的指令,选一个比较可靠的范围进行轮询。
u8 cmd[8] = {0x5A, 0x04, 0x10, 0x6E, 0x5A, 0x04, 0x11, 0x6F}; //恢复出厂配置指令
void setup() {
long int foc = 510000;
long int i = 0;
for(i=0;i<100000;i++)
{
foc++;
Serial.begin(foc);
Serial.write(cmd,8);
}
Serial.begin(115200);
Serial.print("END!!!!!");
}
开启测试隔一分钟左右出现以下正常读取数据,说明恢复成功
附录
北醒常用波特率及对应配置指令如下
9600 [5A 08 06 80 25 00 00 00]
19200 [5A 08 06 00 4B 00 00 00]
38400 [5A 08 06 00 96 00 00 00]
57600 [5A 08 06 00 E1 00 00 00]
115200 [5A 08 06 00 C2 01 00 00]
230400 [5A 08 06 00 84 03 00 00]
460800 [5A 08 06 00 08 07 00 00]
921600 [5A 08 06 00 10 0E 00 00]