OpenEdv-开源电子网

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

串口转发时接收到的数据有丢失的问题

[复制链接]

11

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2012-11-6
在线时间
7 小时
发表于 2014-11-21 15:25:37 | 显示全部楼层 |阅读模式
5金钱
串口进行数据转发,RX收到1个字节后立即通过TX转发出去,测试下来的收发情况如下:

15:08:47.027 1234567890 1234567890

15:08:47.031 1234567890 123567890


15:08:47.220 1234567890 1234567890

15:08:47.224 1234567890 124567890


15:08:47.438 1234567890 1234567890

15:08:47.442 1234567890 124567890


15:08:47.610 1234567890 1234567890

15:08:47.614 1234567890 123567890

可以看出都是第二列数据的第三或第四个没接收到,分析后认为可能是发送占用时间过长导致来不及接收,但是尝试调低波特率后情况仍然相同,又测试注释掉while((USART2->SR&0X40)==0);后接收就会正常,想探究原因究竟何在?


[mw_shl_code=c,true]void uart2_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<<2; //使能PORTA口时钟 RCC->APB1ENR|=1<<17; //使能串口时钟 GPIOA->CRL&=0XFFFF00FF;//IO状态设置 GPIOA->CRL|=0X00008B00;//IO状态设置 RCC->APB1RSTR|=1<<17; //复位串口2 RCC->APB1RSTR&=~(1<<17);//停止复位 //波特率设置 USART2->BRR=mantissa; // 波特率设置 //USART2->CR1|=0X200C; //1位停止,无校验位. USART2->CR1|=0X360C; //1位停止,奇校验 #ifdef EN_USART1_RX //如果使能了接收 //使能接收中断 USART2->CR1|=1<<8; //PE中断使能 USART2->CR1|=1<<5; //接收缓冲区非空中断使能 MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级 #endif } void USART2_IRQHandler(void) { u8 res; if(USART2->SR&(1<<5))//接收到数据 { res=USART2->DR; USART2->DR=res;//转发 while((USART2->SR&0X40)==0);//等待发送结束 注:加上这句后接受到的数据不完整! return; } } [/mw_shl_code]

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

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2014-11-21 16:57:24 | 显示全部楼层
1.应该不是这句原因,你注释掉这句然后将收发送数据加长看会不会出现丢失数据现象,在2400波特率下排除波特率的影响
2.接收中断中的这个return让我懵了。
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

31

主题

161

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2013-4-22
在线时间
7 小时
发表于 2014-11-21 17:26:30 | 显示全部楼层
回复【2楼】龙之谷:
---------------------------------
 冒昧问一句,中断中返回,程序会跑到哪去了,应该不会在跳到现场吧
http://www.tudou.com/programs/view/h5G_H9Kpk04/?bid=03&pid=1&resourceId=375113802_03_05_01
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2014-11-21 20:10:31 | 显示全部楼层
回复【3楼】华夏小川:
---------------------------------
1.这个就不太清楚了,按照return作用,应该是跳出函数,也就是应该在此应无任何跳转作用
2.函数定义void,你却又加个return,没有warning么
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-21 23:25:29 | 显示全部楼层
回复【3楼】华夏小川:
---------------------------------
和你不加return一样的效果。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 19:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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