打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
不用JTAG,也可在线调试
        我用nrf24l01进行无线通信,第一次和我预料的一样,没成功,自然很是郁闷。无线电看不见摸不着,不知如何调试,这东西是不是坏了,我都不知道。后来,我想出一个注意:写寄存器,再读寄存器,若读出来的值与写入的值一样(若两个值是一样,就让一个指定的LED亮),就证明这两部操作都是正确的。而对这些芯片的操作无非就是由读和写构成的。我按照这种思路,对nrf24l01的所有寄存器,依次进行读写,我很欣慰,我可以把值写进去,也可以读出来相同的值,器件是好的。
       这个方法让我兴奋了一天,因为我可以窥见他们的心脏。这个方法也有点不足,就是不全面,一次只能显示一个寄存器。我想在同一时间显示所有寄存器,该如何呢?我实现了,方法为把寄存器的值依次读出,然后依次通过串口上传至PC,显示在串口调试助手中。程序不是很难写,关键两点。第一、波特率要正确,而且误差要小。我用的晶振是12M,若用9600则误差是6.98%,误差相当大,在串口上显示的都是乱码,汉字都出来了。注:发送和接受都要以字符方式,不要勾选HEX选项。
 
 
我把单片机的波特率设置成4800 SMOD = 1; 误差只有0.16,我发现SMOD =1波特率倍增后,误差明显减小。例如4800 SMOD =0;误差有7%之多。
 
单片机的波特率可以设置,PC的波特率当然更能设置了,在设备管理器里找到串口,右击属性,有个选项就是更改波特率的,还可以该名字,例如把COM1变成COM9.另一点是把整型变成字符串,因为串口调试助手是通过字符串来显示的,HEX的你能看懂吗?把整数 0X3A 变成"0X3A",需要一点技巧,我把程序贴出来
      void send_char(uchar x){
 SBUF = x;
 while(!TI);
 _nop_();
 TI = 0;
 }
void send_str(uchar *s) {
 uchar i = 0;
 while(s[i] != '\0') {
  SBUF = s[i];
  while(!TI);
  _nop_();
  TI = 0;
  i++;
  }}
void send_nu(uchar c)
{
  uchar low,high;
  low = c & 0x0f;
  high = _cror_(c,4);
  high = high & 0x0f;
  
  send_str(" 0x");
  switch(high) {
   case 0: {send_char(48);break;}
   case 1: {send_char(49);break;}
   case 2: {send_char(50);break;}
   case 3: {send_char(51);break;}
   case 4: {send_char(52);break;}
   case 5: {send_char(53);break;}
   case 6: {send_char(54);break;}
   case 7: {send_char(55);break;}
   case 8: {send_char(56);break;}
   case 9: {send_char(57);break;}
   case 10: {send_char(65);break;}
   case 11: {send_char(66);break;}
   case 12: {send_char(67);break;}
   case 13: {send_char(68);break;}
   case 14: {send_char(69);break;}
   case 15: {send_char(70);break;}
  }
  switch(low) {
   case 0: {send_char(48);break;}
   case 1: {send_char(49);break;}
   case 2: {send_char(50);break;}
   case 3: {send_char(51);break;}
   case 4: {send_char(52);break;}
   case 5: {send_char(53);break;}
   case 6: {send_char(54);break;}
   case 7: {send_char(55);break;}
   case 8: {send_char(56);break;}
   case 9: {send_char(57);break;}
   case 10: {send_char(65);break;}
   case 11: {send_char(66);break;}
   case 12: {send_char(67);break;}
   case 13: {send_char(68);break;}
   case 14: {send_char(69);break;}
   case 15: {send_char(70);break;}
  }
}  
void send_nus(uchar *a,uchar len)
{
 uchar i;
 for(i = 0;i<len;i++) {
  send_nu(a[i]);
 }
}
send_str("\r\nEN_AA =\t");
send_nu(0xa3);  
send_str("\r\nEN_ADDR=\t");         // \r\n  \t 等可以格式化显示
send_nu(0x35);   
在串口调试助手中显示为
EN_AA =   0XA3
EN_ADDR =   0X35           
程序不复杂,参考一下ASCII码表。
串口调试的时候,不要犯一些低级错误,第一步就是打开串口哦。若是乱码,八成是波特率没设置好,尤其是单片机方面。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
15W4K58S4 实验14:串行口
单片机电子秤设计(源程序+lcd12864显示)
51单片机多机通信协议
串行口通信原理及操作流程
Linux串口编程分析
三 ARM9(S3C2440)的串口UART——程序实例讲解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服