智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3576|回复: 11
打印 上一主题 下一主题

新手串口程序不理解,求教大虾,急!!

[复制链接]

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
威望
243
贡献
76
兑换币
0
注册时间
2012-3-12
在线时间
24 小时
毕业学校
王庄中学
跳转到指定楼层
1#
发表于 2012-3-15 21:44:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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,然后又重新进入中断吗?啊。。头大,理解不了。求大虾帮助新手弱弱理解。。。。。

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
威望
243
贡献
76
兑换币
0
注册时间
2012-3-12
在线时间
24 小时
毕业学校
王庄中学
2#
 楼主| 发表于 2012-3-15 22:27:48 | 只看该作者
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
威望
243
贡献
76
兑换币
0
注册时间
2012-3-12
在线时间
24 小时
毕业学校
王庄中学
3#
 楼主| 发表于 2012-3-15 22:28:18 | 只看该作者
高手都隐居了么
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
威望
243
贡献
76
兑换币
0
注册时间
2012-3-12
在线时间
24 小时
毕业学校
王庄中学
4#
 楼主| 发表于 2012-3-15 22:28:47 | 只看该作者
顶起
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
威望
243
贡献
76
兑换币
0
注册时间
2012-3-12
在线时间
24 小时
毕业学校
王庄中学
5#
 楼主| 发表于 2012-3-15 22:29:38 | 只看该作者
再顶
回复 支持 反对

使用道具 举报

7

主题

293

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3350
威望
1454
贡献
676
兑换币
140
注册时间
2011-8-12
在线时间
610 小时
6#
发表于 2012-3-15 23:44:31 | 只看该作者
唉~~怪可怜的。说一下自己的理解。
有没有听过“写一清零”,即“W1C”,就是有些寄存器,你向它写入1,它就清零。“SCI1SR1_RDRF=1;”就是这样。
“dd = SCI1SR1;//读清除”,应该是读了它之后就会清零

“while(!(SCI1SR1&0x20)); //RDRE=1可写入”,应该是等待RDRE==1,应该是等待寄存器接收到数据之后,才读寄存器。
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
威望
243
贡献
76
兑换币
0
注册时间
2012-3-12
在线时间
24 小时
毕业学校
王庄中学
7#
 楼主| 发表于 2012-3-16 10:42:15 | 只看该作者
月下听蝉 发表于 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();         。是这样吗

回复 支持 反对

使用道具 举报

7

主题

293

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3350
威望
1454
贡献
676
兑换币
140
注册时间
2011-8-12
在线时间
610 小时
8#
发表于 2012-3-16 11:46:00 | 只看该作者
小个头大心脏 发表于 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






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
威望
243
贡献
76
兑换币
0
注册时间
2012-3-12
在线时间
24 小时
毕业学校
王庄中学
9#
 楼主| 发表于 2012-3-16 13:37:59 | 只看该作者
月下听蝉 发表于 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,从而引起中断?
回复 支持 反对

使用道具 举报

7

主题

293

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3350
威望
1454
贡献
676
兑换币
140
注册时间
2011-8-12
在线时间
610 小时
10#
发表于 2012-3-16 13:50:52 | 只看该作者
给你讲一下思路吧(就拿去饭店吃饭来说),串口数据一来(就好像服务员给你菜单),进入串口中断(但是寄存器还没接受好数据,就好像菜已经上桌了,但是你还没吃完),然后寄存器接受好收据(就好像你吃完了),然后程序才能去读寄存器的数据(服务员才能收你的钱) 。
当然RDRE必须清零,不然寄存器还没接受好,你就读寄存器啦~~就好像你没吃完,服务员就叫你买单然后赶你走啦~~
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-9-21 03:13 , Processed in 0.050063 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表