硬件连接
实现效果
软件部分逻辑
调试效果
硬件连接效果
硬件上使用jlink连接板子,用于烧写程序,typec口连接供电以及使用主板自带的ch340转串口,用于通讯数据
![image.png image.png](data/attachment/forum/202401/10/204018zglgt8uiu1tu22tf.png)
![image.png image.png](data/attachment/forum/202401/10/203726ch0vuw1uv2vv1zq2.png)
实现效果
电池数据显示效果,主要用于单片机将诊断电池或者搜集bms电池电压 温度 均衡等信息上报给上位机
![image.png image.png](data/attachment/forum/202401/10/203304ssnzasncqqro0llo.png)
软件部分逻辑
电池数据信息结构体ST_BAT_INFO st_BatInfo;此数据中用于存放电池电量信息 电流 以及各个电芯的电压温度等系列数据
![image.png image.png](data/attachment/forum/202401/10/202956guk14meol2g15vw1.png)
串口中断收发数据逻辑,通过中断方式,一帧接收13个字节数据存放到buffer中,进一步校验数据的checksum以确保数据的有效性
![image.png image.png](data/attachment/forum/202401/10/203508pbtl8sz9t8hz0h00.png)
通过解析请求数据后,根据对应id重新组包,携带电池数据信息,再通过串口发送给电脑,这样上位机收到数据就显示到对应位置
![image.png image.png](data/attachment/forum/202401/10/203035f0pr3j53iz8efcci.png)
checksum检测函数如下,用于校验数据的一包有效性
uint8_t api_check_cmd_data()
{
uint8_t checksum = 0x00;
uint8_t i = 0;
USART_RxTx_TypeDef* p_recvdata = &USART_RxStruct;
if ((p_recvdata->Buffer[0] == UsartCmdBuff.Head) && (p_recvdata->Buffer[1] == UsartCmdBuff.addr))
{
for(i = 0; i < 12; i ++)
{
checksum += p_recvdata->Buffer;
checksum = 0xFF & checksum;
}
if (p_recvdata->Buffer[12] == checksum)
{
UsartCmdBuff.id = p_recvdata->Buffer[2];
UsartCmdBuff.Length = p_recvdata->Buffer[3];
for(i = 0; i < 8; i ++)
{
UsartCmdBuff.pdata = p_recvdata->Buffer[i+4];
}
UsartCmdBuff.checksum = p_recvdata->Buffer[12];
return Ret_Ok;
}
else
{
printf("\r\n checksum fail !");
return Ret_Fail;
}
}
printf("\r\n head check fail !");
return Ret_Fail;
}
调试效果
最终调试数据请求和响应效果如下,可见通讯按预期正常响应信息
![image.png image.png](data/attachment/forum/202401/10/203142hios5kov555idodq.png)
最终上位机调试结果如下
![image.png image.png](data/attachment/forum/202401/10/203230dm11s5v0b2n60nv2.png)