打印
[PIC®/AVR®/dsPIC®产品]

16F724串口接受程序问题

[复制链接]
902|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huarana|  楼主 | 2014-10-22 20:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做一个串口通信的项目,使用16F724.  串口接收其他主机发来了数据,数据格式是三个字节,第一个字节是字头0xaa,第二个字节是命令位,第三个字节是校验位(命令的取反码)。程序接受出现问题。

部分程序如下
u8 rcdat_code[3]={0,0,0};
u8 i=0;
u8 rcflag=0;
void interrupt Uart(void)   /*串口中断*/
  {
  if(RCIF==1)
                    {
//                   RCIF=0; //硬件自动清零
                   rcdat_code[i]=RCREG;
                   if(rcdat_code[0]==0xAA)
                           {
                           i++;
                           if(i>=3)
                                {
                                i=0;
                                rcflag=1;
                                }
                           }
                    }
                }

然后在主程序里读到rcflag==1进行数据校验和处理。
现在的问题是读不到rcflag=1,说明i没有到3,很奇怪。
沙发
Jinss| | 2014-10-22 20:36 | 只看该作者
自己单步调试试下。祝好运。

使用特权

评论回复
板凳
huarana|  楼主 | 2014-10-23 09:58 | 只看该作者
最近进展,能进到 if(rcdat_code[1]&rcdat_code[2]==0x00) 校验 这一步,但是 在 switch (rcdat_code[1]) 里面出问题。

问下,如何在接受到完整字符串以后,关闭接收器,然后在处理完一次命令以后再次打开呢?

使用特权

评论回复
地板
huarana|  楼主 | 2014-10-23 10:34 | 只看该作者
进展,发现是读修改写的问题。

case  0x13   :    {LED3=1;LED2=LED1=LED4=0;}         break; 这样的话,LED3不会亮。

case  0x13   :    {LED2=LED1=LED4=0;LED3=1;}         break; 这样的话,逻辑正常。

中间加NOP 还是不行。  case 0x13 :    {LED1=1;NOP();LED2=0;NOP();LED3=0;NOP();LED4=0;} break;
这样还是不正常。

求解

使用特权

评论回复
5
huarana|  楼主 | 2014-10-23 10:35 | 只看该作者
硬件接线是  IO口 ---------1K电阻-------LED灯-----GND

使用特权

评论回复
6
yklstudent| | 2014-10-23 10:46 | 只看该作者
接收到三个就关闭串口接收功能;
处理完后再打开串口接收功能,现阶段的你,你也就这样做了

使用特权

评论回复
7
huarana|  楼主 | 2014-10-23 13:33 | 只看该作者
最新进展,问题解决了。
嗯,忘记关掉 模拟功能了。 ANSELA=0b00000000; ANSELB=0b00000000; ANSELD=0b00000000; 这样就好了

使用特权

评论回复
8
XiChuanbo| | 2014-10-29 16:55 | 只看该作者
mark

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

1122

帖子

12

粉丝