uart 读取数据状态

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Abel_W
Level 3
Level 3
Distributor - Intron(GC)
10 likes given 100 sign-ins 25 replies posted

Hi,community

     想问一下 spi 的 SPI_SpiIsBusBusy() 的这个API在 UART 中怎么实现,读取多个字节的时候该怎么判断 UART 的上一个字节已经读完了?

0 点赞
1 解答
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

可以这么操作,先把 RX buffer Size 改的比 N 稍大一些

Vison_Zhang_0-1677727331031.png

然后把代码改成

cnt = UART_SpiUartGetRxBufferSize();
if(cnt >=N)
{
for(i=0; i<N; i++)
{
uartrev[i] = UART_UartGetByte();
}
}

这样就可以一次性读取到N个字节。

RX Buffer Size 设置成 >8 的数值以后,UART 组件就会自动在内存中按照指定长度设置一个数组 buffer, 并且使能 RX not empty 中断,当 RX FIFO 接受到数据以后,UART 会在后台中断中将数据移到 buffer 中,然后做数据累加器加1,所以 UART_SpiUartGetRxBufferSize 读取到的就是现在这个 buffer 有多少数据,然后读取之后就会在后台自动清除掉,这些动作都是组件在后台自动完成的,不需要用户参与,非常方便

在原帖中查看解决方案

0 点赞
6 回复数
Abel_W
Level 3
Level 3
Distributor - Intron(GC)
10 likes given 100 sign-ins 25 replies posted

wangjiazheng_0-1677638000689.png

如果在读 uart 数据之前没有一个延时,比如说我发两个字节 55 AA,那么buff会被赋值两次,结果为revbuff[0]=55,revbuff[1]=00\第二次赋值结果为revbuff[0]=AA,revbuff[1]=00。请问一下这是什么情况,这个延时函数实际上是在等待什么呢?是在CY8CKIT-042 上运行的,没有其它功能影响,只是想用uart接收数据

 

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

问题出在 if(UART_SpiUartGetRxBufferSize()!=0) 这个语句判断上,只要 RX FIFO 中有数据,那么这个条件就会满足,假设此时之传入了1个数据,但是进入 if 之后却对 FIFO 执行了两次快读,那么第二次得到的数据就是 00, 因为此时 FIFO 为空,你的第二个数据还没有传输到 FIFO 中

0 点赞
Abel_W
Level 3
Level 3
Distributor - Intron(GC)
10 likes given 100 sign-ins 25 replies posted

Hi,vison

   那么想要接受N个字节的时候,程序需要怎么写呢。if(UART_SpiUartGetRxBufferSize()==N)?

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

可以这么操作,先把 RX buffer Size 改的比 N 稍大一些

Vison_Zhang_0-1677727331031.png

然后把代码改成

cnt = UART_SpiUartGetRxBufferSize();
if(cnt >=N)
{
for(i=0; i<N; i++)
{
uartrev[i] = UART_UartGetByte();
}
}

这样就可以一次性读取到N个字节。

RX Buffer Size 设置成 >8 的数值以后,UART 组件就会自动在内存中按照指定长度设置一个数组 buffer, 并且使能 RX not empty 中断,当 RX FIFO 接受到数据以后,UART 会在后台中断中将数据移到 buffer 中,然后做数据累加器加1,所以 UART_SpiUartGetRxBufferSize 读取到的就是现在这个 buffer 有多少数据,然后读取之后就会在后台自动清除掉,这些动作都是组件在后台自动完成的,不需要用户参与,非常方便

0 点赞
Abel_W
Level 3
Level 3
Distributor - Intron(GC)
10 likes given 100 sign-ins 25 replies posted

Hi,Vison

  非常感谢,这样可以正常工作。但还是存有疑问,必须使用中断,不能完全使用轮询的方式来完成 uart 接收么。

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

可以啊,但是需要你自己去定义一个 buffer,  然后发现 RX FIFO 中有数据就读出来放在 自己的 buffer 中,同时管理一下放置在 buffer 的哪个位置。 

0 点赞