此连载贴分享的内容均是基于STM32单片机。
本次分享所用的单片机型号为:STM32F207,使用的是HAL库
所涉及的产品为:数据转换模块
功能描述:此模块将CAN接口接收到的数据进行处理后,通过串口再发送出去,CAN采用中断接收数据并更新串口发送缓存aTx2GZBuffer_Gu8,如示意图中所示。
问题描述:
串口通过中断发送数据,每次发送58字节数据,程序如下
aTx2GZBuffer_Gu8[57]=CheckSum(aTx2GZBuffer_Gu8,57); //异或校验 ...........(1)
HAL_UART_Transmit_IT(&huart2, (uint8_t *)aTx2GZBuffer_Gu8, 58);...........(2)
发送过程中发现有的时候一帧数据的校验码不正确(CheckSum()用于异或校验的函数是准确无误的),推断是执行完(1)句代码后校验码已经产生,而在执行(2)句代码的时候一帧数据(58字节)是在中断中一个字节一个字节的发送出去的,在发送的过程中串口发送缓存aTx2GZBuffer_Gu8中的部分数据被更新了(被从CAN接收中断接收到的数据),从而造成了校验码的不正确。
改进方案:
static uint8_t TempBuffer1_u8[58]={0};
memcpy(TempBuffer1_u8,aTx2GZBuffer_Gu8,58);
TempBuffer1_u8[57]=CheckSum(TempBuffer1_u8,57);
HAL_UART_Transmit_IT(&huart2, (uint8_t *)TempBuffer1_u8, 58);
如以上程序所示,再另外定义一个数组,发送前先将数据内容进行拷贝,然后用新定义的数组进行发送数据,在串口发送的过程中即便发生CAN接收中断进行数据更新,也只是将数组aTx2GZBuffer_Gu8中的数据更新,从保证了串口发送出去的一帧数据中,有效数据与校验码一致。问题得到了解决。
|