OpenEdv-开源电子网

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

stm32f103串口查询发接收只能收一个

[复制链接]

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-11-3
在线时间
0 小时
发表于 2013-11-3 10:28:35 | 显示全部楼层 |阅读模式
这两天用f103做串口收发,一发送时能通过反复写usart->DR来触发写信号,但是收的时候只要读了usart->DR,状态寄存器的中rxen信号就被清除了,导致问题是收多个字节数据时只能收到第一个字节,其他的数据都丢了。求好心人能不能给指导一下。我的代码是这样的。
void uart4_init(u32 pclk2,u32 bound)
{    
float temp;
u16 mantissa;
u16 fraction;   
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分  
  mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<4;   //使能PORTC口时钟 
RCC->APB1ENR|=1<<19;  //使能串口4时钟 
GPIOC->CRH&=0XFFFF00FF;//IO状态设置
GPIOC->CRH|=0X00008B00;//IO状态设置PC10复用推挽输出PC11上拉输入
 
RCC->APB1RSTR|=1<<19;   //复位串口4
RCC->APB1RSTR&=~(1<<19);//停止复位     
//波特率设置
  UART4->BRR=mantissa; // 波特率设置  
UART4->CR1|=0X200C;  //1位停止,无校验位.
}

void RS422_Receive_Char_1(void)
{
  u8 res=0xFF;    
if(UART4->SR&(1<<5))//接收到数据
{  
res=UART4->DR;  
RS422_Rec[RS422_RX_CNT]=res; //记录接收到的值
RS422_RX_CNT++;
}  
}

stm32初学中
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2013-11-3 10:49:52 | 显示全部楼层
你该想想是RXNE的问题,还是你自己思路的问题?
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-11-3
在线时间
0 小时
 楼主| 发表于 2013-11-3 14:52:17 | 显示全部楼层
回复【2楼】styleno1:
-------------------------------
我想不明白的是中断中用同样的方法,可以收到想要的所有字节的数,所以感觉是不是要在查询中加一个延时反复读会好一些
stm32初学中
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-3 19:50:25 | 显示全部楼层
你查询的速度不够快吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-11-3
在线时间
0 小时
 楼主| 发表于 2013-11-3 20:06:58 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,我直接用for循环
for(i=0;i<10;i++)
{
if(UART4->SR&(1<<5))//接收到数据
{  
res=UART4->DR;   
RS422_Rec[RS422_RX_CNT]=res; //记录接收到的值
RS422_RX_CNT++;
}  
}
这样做会不会有别的东西干扰而导致查询速度下降。
stm32初学中
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-3 22:24:06 | 显示全部楼层
这样你的i++,一下就跑完了....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-11-3
在线时间
0 小时
 楼主| 发表于 2013-11-3 23:05:09 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
那我怎么能够读到下一个高电平啊
stm32初学中
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-4 11:32:39 | 显示全部楼层
回复【7楼】crazymachael:
---------------------------------
下一次收到数据的时候.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-11-3
在线时间
0 小时
 楼主| 发表于 2013-11-4 11:52:31 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
关键是我读一次UART4->DR,rnex信号直接就被拉低了,我再就读不了了。等到main函数回来的时候就没有数了,这个怎么解决啊
stm32初学中
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-4 20:01:26 | 显示全部楼层
你参考下我们的接收吧,你又要查询,又要处理其他事情,怎么搞....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-11-3
在线时间
0 小时
 楼主| 发表于 2013-11-5 11:35:37 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
好吧,我现在参考开发板上的dma例程,用dma接收可以完成。但是程序要一直往里面喂数,一直是死循环。有什么可以查的标志量没有,谢谢原子哥
stm32初学中
回复 支持 反对

使用道具 举报

19

主题

302

帖子

2

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2011-11-22
在线时间
10 小时
发表于 2013-11-5 11:39:55 | 显示全部楼层
中断接收是最好的选择,不一定DMA啊
世界如此美好,好好珍惜每一天吧!
回复 支持 反对

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-11-3
在线时间
0 小时
 楼主| 发表于 2013-11-6 00:07:55 | 显示全部楼层
回复【12楼】dzng11:
---------------------------------
我用原子哥的例程实现中断了,但是本着学习的精神还想钻研下dma看看怎么用,学习学习嘛
stm32初学中
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2020-3-30
在线时间
8 小时
发表于 2020-7-30 21:29:04 | 显示全部楼层
有没有DMA的串口中断例程?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 06:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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