黄同学来学习 发表于 2019-1-14 11:06:52

stm32f103CAN口怎么接收来自上机位的一包32字节的数据

如何接收上机位发送一包“69311F000335500050003FE0100112BB3550B5780E4004B7FA84F500104E00064”这样的数据存放在数组中待解析

现在用例程函数接收   只能接收8个字节的数或者main函数一直扫描can口   这样接收会严重丢帧

各位大神能不能支个招呀

程序设计思想是怎么样的?怎么样实现一下子接收32字节的数据包不丢帧?

说明一下:上机位一包数据是分多帧发送的,每帧发送间隔是小于1ms的,求大神支招,或者有现成例程给我改一下:hug::hug::hug::hug::hug:

发表于 2019-1-14 11:13:40

用CAN中断接收,把数据放入到指定的缓冲区中。外部再对缓冲区进行数据处理。

stm1024 发表于 2019-1-14 11:19:21

本帖最后由 stm1024 于 2019-1-14 11:20 编辑

正统的做法是采用CAN FD,最多可支持64bytes的数据场。但是目前103的CAN控制器不支持CAN FD,如果你想用一帧报文传输,原则是不能实现的。
不过也有work around的方法,就是把数据拆分为多次发送。
例如你这里有32个字节,你可以分5帧发送,为什么不是4帧呢?因为第五帧要用来做校验和,验证数据的完整性。
在具体实施上,可以采用一个ID发送,也可以分多个ID发送。如果共用一个ID,则建议每个ID的数据场中,第一个字节用来标识子组数据的位置,便于以后还原,这样的话最少要5次。如果是多个ID,则位置根据ID来确定。

最后就是,下位机的CAN接收报文,尽可能使用interrupt方式,而不是polling方式。

黄同学来学习 发表于 2019-1-14 11:20:24

安 发表于 2019-1-14 11:13
用CAN中断接收,把数据放入到指定的缓冲区中。外部再对缓冲区进行数据处理。 ...

大神非常感谢你能回复我   我是can新手   现在还是在改代码的阶段   其他的都是半桶水   能不能说具体一点缓冲区下次接收就已经覆盖前一帧的数据了

黄同学来学习 发表于 2019-1-14 11:29:28

stm1024 发表于 2019-1-14 11:19
正统的做法是采用CAN FD,最多可支持64bytes的数据场。但是目前103的CAN控制器不支持CAN FD,如果你想用一 ...

大神我需要一个小时来理解你的话   水平不够还在复制改代码的阶段   现在上机位的报文就是你说的同个ID多帧分多次发送的   就是我接收不会接   用中断接收只存了8个字节其他的不见了   只接收到最后的8个字节

发表于 2019-1-14 11:38:00

需要你自己开一个缓冲区,可以存放多个CAN数据的。每包CAN数据第一个自己最好是指示包序号。通过对所有的CAN数据进行整理进行数据重新排序。
比如:
CAN={01,01,02,03,04,05,06,07}
CAN={02,08,09,10,11,12,13,14}
重新排列以后是:01,02,03,04,05,06,07,08,09,10,11,12,13,14

黄同学来学习 发表于 2019-1-14 11:52:19

安 发表于 2019-1-14 11:38
需要你自己开一个缓冲区,可以存放多个CAN数据的。每包CAN数据第一个自己最好是指示包序号。通过对所有的CA ...

我是已经定义了一个数组candata={0};这个就是用来存接收上机位 的报文的有些时候不止32个字节的   我就想怎么把接收到报文完整地存进这个数组里面   上机位的报文含有包头“69”和报文长度的   现在就是不知道怎么完整接收存进自己定义的数组里面

stm1024 发表于 2019-1-14 13:21:14

黄同学来学习 发表于 2019-1-14 11:29
大神我需要一个小时来理解你的话   水平不够还在复制改代码的阶段   现在上机位的报文就是你说的同 ...

你需要做一个buffer。看你其他的回复,这个是有的。但是你在中断中要跟踪缓冲区的下标。例如来第一个报文的时候,buffer的起始Index为0,第二帧报文来了,起始index应该是8,否则把之前存的数据都给刷新变没了。

stm1024 发表于 2019-1-14 13:21:57

黄同学来学习 发表于 2019-1-14 11:20
大神非常感谢你能回复我   我是can新手   现在还是在改代码的阶段   其他的都是半桶水   能不能说具体 ...

你的问题可能不是丢包,应该是数据被新的数据给替换了

Johnson Cao 发表于 2019-1-14 13:57:15

使用环形缓冲区,中断写,main里读就行了.环形缓冲研究下,以后搞通信,用得上的地方多了去.
页: [1] 2 3
查看完整版本: stm32f103CAN口怎么接收来自上机位的一包32字节的数据