打印

下面这个程序可行吗?大家看看

[复制链接]
1152|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
江陵龙少|  楼主 | 2011-4-23 22:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 江陵龙少 于 2011-4-25 22:18 编辑

思路基本是这样:单片机通过串口一桢一桢的接收数据,接收的每一帧定长10个字节
,我想实现的是,每帧的第一个字节到来时,进入中断,之后立即变为查询方式接收剩下的9个字节,请大家指点,能否可行?

#include <reg51.h>
unsigned char xdata SerialRecBuf[200];
unsigned char xdata InLine[10];
unsigned char xdata Rin;
bit Rfull;

//串口接收中断
void UartRecIsr(void) interrupt 4
{
  if(RI&&~Rfull)
   {
        EA=0;
        RI=0;
        SerialRecBuf[Rin]=SBUF;
        Rin++;
        for(;;)   
           {
                 unsigned char i=200;
                 while(!RI)
                          {
                               i--;
                               if(i) continue;
                               else break;
                           }
                if(RI)
                   {
                       RI=0;
                       SerialRecBuf[Rin]=SBUF;
                       Rin++;      
                    }
                else break;
            }
      if(Rin==10) { Rfull=1;Rin=0;}
      else {Rin=0;Rfull=0;}
      EA=1;
   
   }
}


main()
{
//变量初始化
Rin=0;
Rfull=0;
//串口初始化
SCON=0x50;
TMOD=0x21;
TH1=0xfa;
TL1=0xfa;
TR1=1;

//开中断
EA=1;
ES=1;

for(;;)
  {
     if(Rfull)
      {
         P1=0x0a;
         Rfull=0;
       }
  }
}

相关帖子

沙发
谈的元| | 2011-4-23 22:20 | 只看该作者
建议:全部用中断接收,处理更简单

使用特权

评论回复
板凳
江陵龙少|  楼主 | 2011-4-23 22:24 | 只看该作者
说的是!我这样绕的弯多了,不简洁
谢谢 谈的元

使用特权

评论回复
地板
原野之狼| | 2011-4-23 22:48 | 只看该作者
估计楼主是为了检测出帧发送完后的时间标致
全部用中断也能搞定 关键在你程序怎么写

使用特权

评论回复
5
abin0415| | 2011-4-24 19:06 | 只看该作者
你可以下载到单片机来验证一下。应该可以。

使用特权

评论回复
6
江陵龙少|  楼主 | 2011-4-25 22:39 | 只看该作者
试验结果出来了,希望对大家有借鉴意义。

这个程序是不行的,逻辑上没有问题,但是实际中不行
原因就在for循环里的局部变量i的值上,我用红色标出。
我用电脑的com1和单片机的串口通信,波特率为9600,单片机晶体22.1184M下:
当i的值大于350以上时,串口通信正常,这个200是不行的。

初步分析,原因为:9600的波特率,接收1个字节约1ms,晶体为22.1184M,
1个机器周期约0.5us,假设i从200减到0用了400条指令,等待下一字节的时间只有200us,
所以,根本收不到第2个字节。

使用特权

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

本版积分规则

个人签名:佩服2个头陀:苦头陀和伙工头陀

85

主题

279

帖子

2

粉丝