串口奇校验问题

[复制链接]
4229|7
 楼主| lostzay 发表于 2011-12-26 12:14 | 显示全部楼层 |阅读模式
本帖最后由 lostzay 于 2011-12-26 20:47 编辑

写了个串口奇校验的程序,失败,逐步检查错误,

在检查到位运算的时候,发现有问题了~~
按照程序的思路,我发3E,应该返回01 02 03 04 05
但是实际:
发3E,没返回。
发E3,返回01 02 03
发EE,返回01 02 03
  1. void uart_interrupt(void) interrupt 4//串口中断函数
  2. {
  3.         uint comm_inbuf_temp;
  4.         uchar count;
  5.         uint check_flag=0;                                          //校验标志
  6.         uint m=0x80;
  7.         
  8.         if(RI)// RI=1表示cpu收取数据完毕
  9.         {
  10.                 RI=0;  //复位
  11.                
  12.                 comm_inbuf_temp=SBUF;
  13.                
  14.                
  15.                

  16.                 for(count=0;count<8;count++)           //8位数据检验
  17.                 {
  18.                         if(comm_inbuf_temp & m)                           //从最左边1位开始计算是否为1
  19.                         {         
  20.                                 check_flag++;                           //如果是1,校验标志+1
  21.                                 comm_inbuf_temp = comm_inbuf_temp << 1 ;
  22.                                 //m=m>>1;        
  23.                                                                    //m右移1位
  24.                                 ES=0;
  25.                                 SBUF=check_flag;
  26.                                 while(!TI);
  27.                                 TI=0;
  28.                                 ES=1;
  29.                         }
  30.                                 
  31.                 }

  32.                 /*if((check_flag%2)^RB8)                           //校验标志是否和RB8一致,不一致则说明数据被正确接收
  33.                 {
  34.                         comm_inbuf=comm_inbuf_temp;   //将串口数据送入comm_inbuf数组
  35.                           send_char_comm(0);
  36.                         //comm_judge();  //判断接收数据是否正确        
  37.                 }  */
  38.          
  39.            
  40.                
  41.                         

  42.         }
  43.         else
  44.                 TI=0;
  45.                
  46.                   
  47. }
wukunshan 发表于 2011-12-26 14:34 | 显示全部楼层
串口中断函数里代码太长、太耗时,又for循环又调用函数的。造成单片机不能及时接受数据。如果非要那么长得代码,那就得延长上位机每发送一个数据(一个字节)的时间间隔。
ledyd 发表于 2011-12-26 14:44 | 显示全部楼层
这种情况,我之前也见到过,一直未找到解决的办法
ayb_ice 发表于 2011-12-26 14:53 | 显示全部楼层
1: 修改协议,检验打包的数据
2: 用ASM
3: 混合编程
 楼主| lostzay 发表于 2011-12-26 15:27 | 显示全部楼层
谢谢楼上几位

我自己找到问题所在了~~

我在***论坛里也提问了,那里比我自己早找到~~错误~


在for循环里,当最高位不为1,comm_inbuf_temp 没移位

comm_inbuf_temp = comm_inbuf_temp << 1 ;
放到if外面
Wayner 发表于 2011-12-26 16:35 | 显示全部楼层
LS请问用的是什么字体啊?很漂亮的
 楼主| lostzay 发表于 2011-12-26 20:42 | 显示全部楼层
6# Wayner
居然阿~莫~也被屏蔽,擦
 楼主| lostzay 发表于 2011-12-26 20:43 | 显示全部楼层
本帖最后由 lostzay 于 2011-12-26 20:45 编辑

现在的问题是(第34行)RB8一直是0啊,我用串口调试已经设置ODD了,理论上应该k为奇数,RB8就是0,k为偶数,RB8就是1吧

导致有时候根本无法发送k的值 ,第38行,



  1. void init_serialcomm(void)//串口中断初始化函数
  2. {
  3. TMOD=0x20;   //M1=1,M0=0 定时器1工作方式2(定时常数重装,8 位)
  4. SCON=0xD0;   //SM0=1,SM1=1,SM2=0,REN=1 串口工作方式3,允许接收   
  5. TH1=0xFD;    //晶振11.0592时,波特率9600
  6. PCON=0x80;   //波特率倍增,9600*2=19200
  7. TL1=TH1;     //TL1计数,溢出后,TH1值送入TL1
  8.   
  9. TR1=1;       //启动定时器1
  10. TI=0;
  11. ES=1;        //允许串口中断
  12. EA=1;        //开总中断
  13. }




  14. void oddcheck(uchar tempchar)
  15. {
  16. uchar count;
  17. uchar a;
  18. uchar k=0;
  19. a=tempchar;
  20. TI=0;
  21. for(count=0;count<8;count++)           //8位数据检验
  22. {
  23. if(0x80 & a)            //从最左边1位开始计算是否为1
  24. {         
  25. k++;            //如果是1,校验标志+1
  26. }
  27. a = a << 1 ;       
  28. }

  29. if((k%2)^RB8)            //校验标志是否和RB8一致,不一致则说明数据被正确接收
  30. {
  31. check_flag=1;   //将串口数据标志置位
  32.          ES=0;
  33. SBUF=k;
  34. while(!TI);
  35. TI=0;
  36. ES=1;

  37. }   

  38.   

  39. }


  40. void uart_interrupt(void) interrupt 4//串口中断函数
  41. {  

  42. if(RI)// RI=1表示cpu收取数据完毕
  43. {  
  44. RI=0;  //复位

  45. comm_inbuf_temp=SBUF;
  46. oddcheck(comm_inbuf_temp);


  47. }  
  48. else
  49. TI=0;  

  50.    
  51. }

您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名: 欢迎单片机、射频方面的人士多多交流

4

主题

151

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部