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