[STM32]

STM32单片机应用编程连载贴分享

[复制链接]
479|0
手机看帖
扫描二维码
随时随地手机跟帖
李不走寻常路|  楼主 | 2019-9-5 20:56 | 显示全部楼层 |阅读模式
此连载贴分享的内容均是基于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中的数据更新,从保证了串口发送出去的一帧数据中,有效数据与校验码一致。问题得到了解决。

模块连接示意图

模块连接示意图

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

92

帖子

3

粉丝