[PIC®/AVR®/dsPIC®产品] 关于PIC串口接收数据一点点疑问

[复制链接]
4286|11
 楼主| dengxbin 发表于 2014-7-10 15:20 | 显示全部楼层 |阅读模式
在研究PIC16F73单片机串口通信中,在其异步串行模式下,发现手册上写着:
Flag bit RCIF is a read only bit which is cleared by the hardware.It is cleared when the RCREG register has been read and is empty.The RCREG is a double buffered register(i.e.,it is a two deep FIFO).It is possible for two bytes of data to be received and transferred to the RCREG FIFO.
应该大致说一旦读取了RCREG寄存器就清除了RCIF的状态,现有几点不太清楚:
1.由于RCREG寄存器是个两字节的寄存器,是不是只有接受了两字节数据RCIF标志位才会被置1?假如上位机只发送0xfe会置位RCIF么?
2.如果RCREG未满的情况下读取RCREG是不是也会清空RCIF的值?
3.按此情况检测到RCREG==1时,应该连续取两次才是清空RCREG的值,
unchar UCD0=RCREG
unchar UCD1=RCREG
这样子的话哪个数据数据是先发送的?(难道跟大小端模式有关?)
还望各位不吝赐教~

lanmp 发表于 2014-7-10 15:25 | 显示全部楼层
1. 会。只要不空就不会clear。
2. 是。空了就会clear。
3.不对,应该读一次检测一次RCIF。
FIFO是先入先出,先来的先读出来,后来的后读出来,和大小端模式没关系。
 楼主| dengxbin 发表于 2014-7-10 15:41 | 显示全部楼层
lanmp 发表于 2014-7-10 15:25
1. 会。只要不空就不会clear。
2. 是。空了就会clear。
3.不对,应该读一次检测一次RCIF。

关于1,是不是FLAG 只是检测RCREG是否为空?只要非空为1?
lanmp 发表于 2014-7-10 16:12 | 显示全部楼层
dengxbin 发表于 2014-7-10 15:41
关于1,是不是FLAG 只是检测RCREG是否为空?只要非空为1?

 楼主| dengxbin 发表于 2014-7-10 16:29 | 显示全部楼层
本帖最后由 dengxbin 于 2014-7-10 17:48 编辑
lanmp 发表于 2014-7-10 16:12

。。。。好像不对劲。。RCREG是个16位寄存器,每次传输8位,使得RCIF置0,那岂不是16位与8位无异了么。。。
lanmp 发表于 2014-7-11 11:45 | 显示全部楼层
dengxbin 发表于 2014-7-10 16:29
。。。。好像不对劲。。RCREG是个16位寄存器,每次传输8位,使得RCIF置0,那岂不是16位与8位无异了么。。 ...

您从哪里看到RCREG是16位寄存器的?
lanmp 发表于 2014-7-11 11:48 | 显示全部楼层
我怀疑这世界上就没有16位的串口寄存器。
 楼主| dengxbin 发表于 2014-7-11 11:51 | 显示全部楼层
lanmp 发表于 2014-7-11 11:45
您从哪里看到RCREG是16位寄存器的?

The RCREG is a double buffered register(i.e.,it is a two deep FIFO).It is possible for two bytes of data to be received
不知道是不是我理解错误,还望指教
 楼主| dengxbin 发表于 2014-7-11 12:02 | 显示全部楼层
lanmp 发表于 2014-7-11 11:48
我怀疑这世界上就没有16位的串口寄存器。

公司以前有个程序,用的就是这个芯片,它就是连续取了两次值,大致如下
unsigned char ucReC0= 0;
unsigned char ucReC0= 0;
ucReC0        = RCREG        ;
ucReC1        = RCREG        ;
ucReC        = ( ( ucReC0 > ucReC1 )? ucReC0 : ucReC1 );
TXREG        = ucReC        ;
取了两次数据值,再去判断哪个是想要的值
lanmp 发表于 2014-7-11 13:32 | 显示全部楼层
dengxbin 发表于 2014-7-11 11:51
The RCREG is a double buffered register(i.e.,it is a two deep FIFO).It is possible for two bytes ...

你的理解有误。
lanmp 发表于 2014-7-11 13:34 | 显示全部楼层
dengxbin 发表于 2014-7-11 12:02
公司以前有个程序,用的就是这个芯片,它就是连续取了两次值,大致如下
unsigned char ucReC0= 0;
unsign ...

写这个程序的人也不懂。不过这段程序对于只有一个字节数据的情况也可以用。
忘记梦 发表于 2014-7-11 16:18 | 显示全部楼层
查看一下寄存器,如果寄存器里没有告诉你高低位的读写,那就是读取一次,我记得中断标志位是自动清除的,只是去检测标志位就可以了,当置位了就去读取就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

98

帖子

3

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