下午以及晚上上完课后,就一直开始查错查到现在,终于发现问题之所在~!!!(中午已经认真计算过波特率,但还是没有效果) 原来是所使用的SJA驱动的接收与发送函数有问题!
请先看接收与发送缓冲区的数据结构:
struct BASICCAN_BUFstruct{ unsigned char FrameID_H ; //帧ID高8位 unsigned char FrameLENTH ; //帧数据长度 unsigned char FrameKIND ; //数据帧或远程帧(0:数据;1:远程) unsigned char FrameID_L3 ; //帧ID低3位 unsigned char Frame_Data[8]; //数据缓冲区 };
再看以下发送函数里的关于发送一帧信号中的第二个字节(即低3位ID,PTR,四位长度标志)的写法:
/////////////////////////////////////////////////////////////////////// if((CANREG_read(0x02)&0x10)==0) { if((CANREG_read(0x02)&0x04)!=0) { CANREG_write(0x10,send_BUF.FrameID_H); CANREG_write(0x11,(send_BUF.FrameLENTH)||(send_BUF.FrameKIND<<4)||(send_BUF.FrameID_L3<<5));//注意这一句,问题出在这里! if(send_BUF.FrameKIND==0) { for(i=0;i<send_BUF.FrameLENTH,i<8;i++) CANREG_write(0x12+i,send_BUF.Frame_Data); P1_7 = !P1_7; } //发送寄存器写成功 setting_success=1; } } //////////////////////////////////////////////////////////////////////
就是因为第二个字节的数据不正确,以至接收模块根本不能接收到正确的数据(接收函数也采用类似的写法,但发送都不正确了,接收的正确与否也无从谈起)。 如原驱动所采用的逻辑或的方法根本是得不到设想的结果的。后来根据陈明计前辈的一本关于smallRTOS的书中所展示的BasicCAN实验例子的接收与发送函数进行改写,最后终于成功了~!
通过本次实验,再次感到自己的C语言的运用能力的不足,如果是真的熟练的话,相信这个错误可以一眼就可以看出,之前太过相信这些下载而来的程序的正确性了。 虽然本次实验只是一个开始,不过有了这个成功的开始,后面的实验的开展相信会相对容易一些,毕竟有了一个成功的参考例子~! 在这里感谢各位网友提供的资料,特别是周工网站以及陈明计前辈写的一本关于smallRTOS的书中所提到的BasicCAN总线的例子,特别感谢wxj1952前辈提供热心的支持~~!
|