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

关于PIC串口接收数据一点点疑问

[复制链接]
3849|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?

使用特权

评论回复
5
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位无异了么。。。

使用特权

评论回复
6
lanmp| | 2014-7-11 11:45 | 只看该作者
dengxbin 发表于 2014-7-10 16:29
。。。。好像不对劲。。RCREG是个16位寄存器,每次传输8位,使得RCIF置0,那岂不是16位与8位无异了么。。 ...

您从哪里看到RCREG是16位寄存器的?

使用特权

评论回复
7
lanmp| | 2014-7-11 11:48 | 只看该作者
我怀疑这世界上就没有16位的串口寄存器。

使用特权

评论回复
8
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
不知道是不是我理解错误,还望指教

使用特权

评论回复
9
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        ;
取了两次数据值,再去判断哪个是想要的值

使用特权

评论回复
10
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 ...

你的理解有误。

使用特权

评论回复
11
lanmp| | 2014-7-11 13:34 | 只看该作者
dengxbin 发表于 2014-7-11 12:02
公司以前有个程序,用的就是这个芯片,它就是连续取了两次值,大致如下
unsigned char ucReC0= 0;
unsign ...

写这个程序的人也不懂。不过这段程序对于只有一个字节数据的情况也可以用。

使用特权

评论回复
12
忘记梦| | 2014-7-11 16:18 | 只看该作者
查看一下寄存器,如果寄存器里没有告诉你高低位的读写,那就是读取一次,我记得中断标志位是自动清除的,只是去检测标志位就可以了,当置位了就去读取就可以了

使用特权

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

本版积分规则

11

主题

98

帖子

3

粉丝