OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2668|回复: 3

串口程序求助。

[复制链接]

11

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2016-4-6
在线时间
53 小时
发表于 2016-7-4 11:46:10 | 显示全部楼层 |阅读模式
5金钱
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)
{
  UART3RxCompJudg = VALID_FLAG;   UART3RxCompTime = 0;
  Uart3OverTime = 0;
  if( UART3_RxFullFlag == 0)
    {
      UART3_RxBuf[UART3_RxEnd++] =  USART_ReceiveData(USART3);   /*  保存接收到的数据            */  
   if(UART3_RxEnd >= UART3_RXBUF_SIZE)
      UART3_RxEnd = 0;
   if(UART3_RxEnd == UART3_RxHead)
      UART3_RxFullFlag = 1;
   UART3_RxEmptyFlag = 0;
    }
}
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
}

uint16 Uart3ReadBytes(uint8 *pBuf)
{
uint16 nEnd = 0;  
uint16 Size = 0;
if(UART3_RxEmptyFlag == 0)   //串口0接收数据缓冲区不为空
   {
  nEnd = UART3_RxEnd;    //中断可能改变此值
  UART3_RxFullFlag = 0;
  if(UART3_RxHead < nEnd)   //end > head
    {
   Size = nEnd - UART3_RxHead;
   memcpy(pBuf,(uint8 *)&UART3_RxBuf[0] + UART3_RxHead, Size);
   UART3_RxHead = nEnd;
    }
  else       //head > end     {
   Size = UART3_RXBUF_SIZE + nEnd - UART3_RxHead;
   memcpy(pBuf,(uint8 *)&UART3_RxBuf[0] + UART3_RxHead,UART3_RXBUF_SIZE - UART3_RxHead);
   if(nEnd > 0)
    memcpy(pBuf + UART3_RXBUF_SIZE - UART3_RxHead,(uint8 *)&UART3_RxBuf[0],nEnd);
   UART3_RxHead = nEnd;   
    }
  if(UART3_RxHead == UART3_RxEnd)
   UART3_RxEmptyFlag = 1;  //接收数据缓冲区空
   }
else
  Size = 0;
memset((uint8*)&UART3_RxBuf[0],0x00,512);
return Size;
}
最近看到这段代码,有点不理解,个人初学,多了UART3_RxEnd,UART3_RxHead几个寄存量以及相互比较关系,想请问是什么设计思路,谢谢。

最佳答案

查看完整内容[请看2#楼]

其实就是有个缓存区 UART3_RxEnd:就是写索引 UART3_RxHead:读索引
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

184

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1050
金钱
1050
注册时间
2016-5-13
在线时间
111 小时
发表于 2016-7-4 11:46:11 | 显示全部楼层
其实就是有个缓存区
UART3_RxEnd:就是写索引
UART3_RxHead:读索引
回复

使用道具 举报

11

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2016-4-6
在线时间
53 小时
 楼主| 发表于 2016-7-14 09:45:24 | 显示全部楼层
zhuifeng8911 发表于 2016-7-4 14:59
其实就是有个缓存区
UART3_RxEnd:就是写索引
UART3_RxHead:读索引

谢谢你,我看懂了。我还想请教个问题,关于串口理解的,就是什么时候用这种环形缓冲区接收数据,什么时候用定长缓冲区?
回复

使用道具 举报

5

主题

184

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1050
金钱
1050
注册时间
2016-5-13
在线时间
111 小时
发表于 2016-7-14 15:38:33 | 显示全部楼层
ronan 发表于 2016-7-14 09:45
谢谢你,我看懂了。我还想请教个问题,关于串口理解的,就是什么时候用这种环形缓冲区接收数据,什么时候 ...

如果你发送的数据比较多时,而且你解析的时候比较慢,因为用环形的话会覆盖一些数据,所以这时候应该把缓存区加长。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 06:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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