关于两个板子的CAN通信的疑问!

2019-07-21 01:57发布

最近一直在调CAN通信正常模式下的两块电路板之间的数据收发。两块电路板都是用的STM32F103C8T6 + TJA1050  。
两块板子的LOOPBACK模式均调试通过,现在卡在正常模式下无法稳定的正确收发数据。今天碰到了代码中发送数据0X11,0X22,但是查看KEIL里面的CAN发送的数据不知道为何多出来一个0X20,而且总是在第五个数据的地方出现,但是接收到的数据又是只有0X11,0X22,这是为什么?附图如下:
 这个是发送端看到的发送数据


 这个是发送端的发送数据代码



 这个是接收端接收到的数据



请教各位这个问题是怎么回事呢?

还有问题如:
1.断开两块电路板的CANH和CANL连接,接收端绿灯依然常亮(接收端收到数据并判断正确之后绿灯常亮,否则红灯闪烁),这个如何解释?
2.发送端和接收端上电顺序对结果有没有影响?
3.两块电路板需要共地吗?


最后,希望能有高人指点指点我!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
zc123
1楼-- · 2019-07-21 02:28
1.


固件库里就是无论里定义了几个发送变量,这8个数据都是投递到can邮箱的,然后根据DLC的大小来判断正确发送的数据(硬件自己判断),因为你声明TxMessage没有初始化,所以这个20就是栈里默认的数字,不过不影响实际发送和接收的。如果你不习惯,在声明之后用这个
memset((char *)&TxMessage, 0, sizeof(TxMessage)); 

2.你这个是逻辑问题,接收到数据判断正确后绿灯常亮,反之没有数据接收也是绿灯啊,你断开相当于没有数据,肯定不会改变现有状态啊,也就是绿灯还是绿,红灯还是红。

3. 如果是轮询模式,且设计合理(不会因为一次发送失败而造成程序堵塞,或者影响第二次发送),没有影响。
   如果是线性模式,接收端要先上电。

4.不清楚
维拉帕克
2楼-- · 2019-07-21 07:47
回复【2楼】zc123:
---------------------------------
感谢您的解答。
根据您的解答,第一个问题我应该是可以解决的了。
2.当我刚下载好接收端程序的时候,按您的说法就是处于没有接收数据的状态吧,那为什么绿灯也不亮,红灯也不亮呢?
3.您说的轮询模式应该就是很多例程里面所说的查询方法吧?线性模式的话就是中断方法?
4.这个共地的问题我也还在找资料看。

再次感谢您的答疑解惑。
zc123
3楼-- · 2019-07-21 10:12
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-21 15:39
can通信是差分传输,是没有要求共地的.
维拉帕克
5楼-- · 2019-07-21 19:08
回复【4楼】zc123:
---------------------------------
非常感谢。几个疑问都清楚了。多谢多谢
维拉帕克
6楼-- · 2019-07-22 00:18
回复【4楼】 zc123 :
---------------------------------

不好意思 又得麻烦您帮帮我了。

我现在是循环发送固定的数据11 22 33给另一块板子。但是通过keil调试时发现发送数据并不是一直发送11 22 33,而且另一块板子接收的数据也不全是11 22 33
发送端CAN_TransmitMailbox中的数据如下:


发送端代码是这样的:


其中的res=can_send_msg()语句就是发送数据的函数,can_send_msg函数定义如下:


接收端邮箱中数据如下:


麻烦您帮我看看这是什么问题吧,感谢!

一周热门 更多>