标题: STM32 CAN转USART问题 [打印本页]

作者: 我的天空-    时间: 2019-5-16 22:28
标题: STM32 CAN转USART问题
最近在做一个CAN转USART的工具,主要是把特定格式发回来的CAN数据,解析之后通过串口转发回来,一包数据是有多帧CAN数据转换回来的,长度不固定,如果前一包数据长度较长,后一包数据就会把上一包多出来的数据也打印出来,试过每次printf完一包数据之后,把数组通过memset函数清零,但是依然不行,求大神支招

我是每次中断里把CAN每一帧数据解析,每一次进中断都会把解析到需要的数据存到一个全局变量X的数组里面,在多次进中断,解析完之后,就在主函数里打印全局变量X

作者: yzwzfyz    时间: 2019-5-17 09:01
你要好好规划好存储数据的地方,并能区分:
1、上个包数据放在何处?
2、这次包又放在了哪进?
3、下个包来了,这次包又如何变成了上个包?
4、包是什么概念,他是如何被界定的,大小多少……
这此都是逻辑问题,规划好后,画成框图,再依框图写程序,不难。
作者: 我的天空-    时间: 2019-5-17 10:04
yzwzfyz 发表于 2019-5-17 09:01
你要好好规划好存储数据的地方,并能区分:
1、上个包数据放在何处?
2、这次包又放在了哪进?

是这样的,
1、每次解析出来的数据,也就是一包数据,我会按每帧的方式放在一个全局变量的数组里面,也就是一个数组,前8个字节存第一帧,8-16存第二帧,16-24第三帧,结束之后,这个全局变量就是一包;
2、然后这次包来了的话,依旧是把它按上一包的方式,覆盖在这个全局变量里面;
3、下包来了,依然是解析出来,放在上一包上面
4、包的概念主要是,多帧解析之后组合成一包,比如说一帧8个字节,这次这一包是3帧,这三帧就会组成一包,大小的话,由第一帧里面的某个数据表示;比如说第一包是00 00 07 00 00 00 00 00,这里的07就是长度,表示7个字节,这一包完整的一包就是,00 00 07 00 00 00 00 00    01 xx xx xx 00 00 00 00,这里就是一包;

我现在遇到的问题是,如果上一包数据长度比这一包数据长度长的话,这一包的数据除了原本需要有的数据以外,还会多出来上一包数据未被覆盖的数据,导致一包数据不对,这里我尝试过打印完数据之后,用memset函数给这个全局变量清零,但是直接全部数据都乱了,还未找到原因;
作者: yzwzfyz    时间: 2019-5-17 11:14
本帖最后由 yzwzfyz 于 2019-5-18 07:59 编辑

这是你的方案,而你已经认识到这个方案不能解决你遇到的问题了,那就设法改进方案。
“覆盖”出问题,就让它“不复盖”好了。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1