智能车制作

标题: 新手串口程序不理解,求教大虾,急!! [打印本页]

作者: 小个头大心脏    时间: 2012-3-15 21:44
标题: 新手串口程序不理解,求教大虾,急!!
uchar SciRead()
{
if(SCI1SR1_RDRF==1)        
  {                     
    SCI1SR1_RDRF=1;        
    return SCI1DRL;        
   }
}这是串口接收数据,其中SCI1SR1_RDRF=1;   这句怎么解释SCI1SR1_RDRF不就是因为等于1 才进入循环体的吗?为什么还要给它赋值1呢?
还有这个:
#pragma CODE_SEG NON_BANKED
void  interrupt 21 Sci0Read(void)
{
  dd = SCI1SR1;                //读清除
  while(!(SCI1SR1&0x20));      //RDRE=1可写入
  Get_Data();         
}
这句dd = SCI1SR1;是将这寄存器清0了吗?如果清0了那就一直执行下一句while,直到下一次数据发过来使得RDRF又被置1,然后又重新进入中断吗?啊。。头大,理解不了。求大虾帮助新手弱弱理解。。。。。

作者: 小个头大心脏    时间: 2012-3-15 22:27

作者: 小个头大心脏    时间: 2012-3-15 22:28
高手都隐居了么
作者: 小个头大心脏    时间: 2012-3-15 22:28
顶起
作者: 小个头大心脏    时间: 2012-3-15 22:29
再顶
作者: 月下听蝉    时间: 2012-3-15 23:44
唉~~怪可怜的。说一下自己的理解。
有没有听过“写一清零”,即“W1C”,就是有些寄存器,你向它写入1,它就清零。“SCI1SR1_RDRF=1;”就是这样。
“dd = SCI1SR1;//读清除”,应该是读了它之后就会清零

“while(!(SCI1SR1&0x20)); //RDRE=1可写入”,应该是等待RDRE==1,应该是等待寄存器接收到数据之后,才读寄存器。
作者: 小个头大心脏    时间: 2012-3-16 10:42
月下听蝉 发表于 2012-3-15 23:44
唉~~怪可怜的。说一下自己的理解。
有没有听过“写一清零”,即“W1C”,就是有些寄存器,你向它写入1,它 ...

敢问前辈:
      第二个问题中
      进入这个串口中断“void  interrupt 21 Sci0Read(void)” 不是因为RDRF==1(即SCI1SR1等于0x20时)才进入的吗?
如果是的话,先对它读清除“dd = SCI1SR1;                //读清除”,然后执行“while(!(SCI1SR1&0x20)); ”,等到下个数据发送来之后,RDRF又被置1,然后执行Get_Data();         。是这样吗


作者: 月下听蝉    时间: 2012-3-16 11:46
小个头大心脏 发表于 2012-3-16 10:42
敢问前辈:
      第二个问题中
      进入这个串口中断“void  interrupt 21 Sci0Read(void)” 不是因 ...

进入这个串口中断“void  interrupt 21 Sci0Read(void)” 不是因为RDRF==1(即SCI1SR1等于0x20时)才进入的吗?
应该不是,这不是中断标志位。
file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\494267320\QQ\WinTemp\RichOle\B$CK9P{GRBZ(YZI%BBDTDWG.jpg


file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\494267320\QQ\WinTemp\RichOle\B$CK9P{GRBZ(YZI%BBDTDWG.jpg


[attach]20760[/attach]




作者: 小个头大心脏    时间: 2012-3-16 13:37
月下听蝉 发表于 2012-3-16 11:46
进入这个串口中断“void  interrupt 21 Sci0Read(void)” 不是因为RDRF==1(即SCI1SR1等于0x20时)才进入 ...

书上说:
         “  SCI控制寄存器2(SCICR2)中的RIE位是接收器满中断使能位,RIE使能接收数据寄存器满标志RDRF或者溢出标志OR来产生中断申请。”
       也就是说接收到数据后RDRF置1,引起RIE置1,从而引起中断?

作者: 月下听蝉    时间: 2012-3-16 13:50
给你讲一下思路吧(就拿去饭店吃饭来说),串口数据一来(就好像服务员给你菜单),进入串口中断(但是寄存器还没接受好数据,就好像菜已经上桌了,但是你还没吃完),然后寄存器接受好收据(就好像你吃完了),然后程序才能去读寄存器的数据(服务员才能收你的钱) 。
当然RDRE必须清零,不然寄存器还没接受好,你就读寄存器啦~~就好像你没吃完,服务员就叫你买单然后赶你走啦~~
作者: 小个头大心脏    时间: 2012-3-16 13:57
月下听蝉 发表于 2012-3-16 13:50
给你讲一下思路吧(就拿去饭店吃饭来说),串口数据一来(就好像服务员给你菜单),进入串口中断(但是寄存 ...

哦。。。谢谢前辈耐心讲解啊
作者: 月下听蝉    时间: 2012-3-16 14:28
小个头大心脏 发表于 2012-3-16 10:42
敢问前辈:
      第二个问题中
      进入这个串口中断“void  interrupt 21 Sci0Read(void)” 不是因 ...

哈哈,哥们,不要叫前辈,我也是这一届才搞的,大家一起交流而已,我也只是看了你的程序来讲的,我不用这单片机。我对这些寄存器还没你熟悉。这样说来,我讲错了,不好意思啊,道个歉,应该是像你讲的那样。








欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2