OpenEdv-开源电子网

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

STM32F103串口数据丢失

[复制链接]

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-5
在线时间
0 小时
发表于 2015-12-14 10:16:54 | 显示全部楼层 |阅读模式
5金钱
目前使用串口。中断标志为USART_IT_RXNE,传回PC的判断是
USART_SendData(USART1, ch);//
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
pc是不断的发送数据的,但返回数据是根据我的一个需求来定的,就是我把PC发来的数据存在缓冲区,我从缓冲区再取走,发送到PC。取走的时间是根据数据内容来定的,但从返回的来看,有一部分数据丢失。---不是数据处理失误引起的。

我的判断是,当有数据的时候,就会产生中断。也就是中断是不停的产生,而数据取走再返还给PC却是有时间延迟的。我返还一个字符,其实已经接到2个字符了。然后接收数据缓冲区的数据会被覆盖。

我的意思是有没有办法阻挡中断的产生?数据还没处理完呢再发数据的话缓冲区肯定会爆仓或覆盖一些未处理的数据。

最佳答案

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

回复【13楼】Geiger: --------------------------------- 现实中,我是这么做的,没有问题。实际上,利用缓冲区,将两个进程(一个接收,一个处理)分开,并异步执行,是标准的做法。 你所讲的数据丢失情况,如果没有流控,是没办法解决的。这需要上位机能处理你的反馈信号。 我是搞网络通信的,如果发送方的发送速度大于接收方的接收速度,必须加入流量控制才行。而你的上位机不是你能修改的。那么就没辙了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-12-14 10:16:55 | 显示全部楼层
回复【13楼】Geiger:
---------------------------------
现实中,我是这么做的,没有问题。实际上,利用缓冲区,将两个进程(一个接收,一个处理)分开,并异步执行,是标准的做法。

你所讲的数据丢失情况,如果没有流控,是没办法解决的。这需要上位机能处理你的反馈信号。

我是搞网络通信的,如果发送方的发送速度大于接收方的接收速度,必须加入流量控制才行。而你的上位机不是你能修改的。那么就没辙了。
有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11555
金钱
11555
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-12-14 10:43:01 | 显示全部楼层
可以增大PC发送命令的间隔,看丢不丢?

如果不是程序错误,那么就要重新调整机制。
要么PC不要太频繁地发,要么缓冲器要够大。
回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-5
在线时间
0 小时
 楼主| 发表于 2015-12-14 11:03:35 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
是有道理。
缓冲区够大这个不现实感觉。我一般发数据都是文本格式的。一个文本有可能好多兆大小。
调整机制是方向。但是不知道如何调整。最理想的设想是我缓冲区有空了,就可以接收数据。如果没空,你要发,我不接,你就阻塞那里,等待我的接收;接收完了你继续发。
可是,如何搞呢?搞哪一块呢?
回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-5
在线时间
0 小时
 楼主| 发表于 2015-12-14 11:32:20 | 显示全部楼层
回复【4楼】yklstudent:
---------------------------------
数据会丢失吗?屏蔽后又开启。
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-11-26
在线时间
2 小时
发表于 2015-12-14 11:37:11 | 显示全部楼层
我现在通过lwip协议 把串口的数据发送到服务器 发现只能发送上电后串口接收到的第一组数据 觉得和你遇到的问题有点类似 串口中断优先级也改了 数据缓冲区的大小也足够 不知道你的问题解决没 我们可以交流一下
回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-5
在线时间
0 小时
 楼主| 发表于 2015-12-14 11:50:16 | 显示全部楼层
回复【6楼】六子93:
---------------------------------
如果说你只是把接收到的数据存起来的话,你的这个就用普通的串口实验就能解决的吧?你的问题应该是有结束符的判断。比如abc\ndef\n,如果按照“实验xxx串口实验”里的,你这样只能接收到abc,def就扔到了。
如果是这样的话,你需要写环形数组,并把结束符的判断去掉。
回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-5
在线时间
0 小时
 楼主| 发表于 2015-12-14 12:01:47 | 显示全部楼层
回复【8楼】yklstudent:
---------------------------------
是啊     想来想去,如果能和pc交流,什么时候发送什么时候不要发,该多好。
可惜串口工具不是我写的,上位机也不是我写的。它们并没有开放api和相关设置。
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-12-14 13:59:38 | 显示全部楼层
接收中断里把接收的字符放入缓冲区。

另开一个计时器,中断优先级比接收中断的优先级低,在计时器中断中,处理缓冲区里收到的数据,包括发送数据。

这样,在有新的数据收到时,就不会丢失了。

如果在接收中断里缓存并处理数据、发送数据,那中断服务运行时间太长,必然导致后续到达的数据无法被及时处理而丢失。
有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2015-11-26
在线时间
2 小时
发表于 2015-12-14 14:20:48 | 显示全部楼层
回复【7楼】Geiger:
---------------------------------
我给串口发过来的每一个数据 结束符都是\r\n 应该每更新一次数据就会接收到一个\r\n
回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-5
在线时间
0 小时
 楼主| 发表于 2015-12-14 16:52:06 | 显示全部楼层
回复【11楼】六子93:
---------------------------------
是的     \r\n是结束符判断           你写一个环形数组,并且无结束符判断就行了
回复

使用道具 举报

9

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-5
在线时间
0 小时
 楼主| 发表于 2015-12-14 16:59:03 | 显示全部楼层
回复【10楼】dragon7799:
---------------------------------
你这样一讲,就分两种数据丢失情况了。
一是,数据来的太快,未及时取走,丢失。
二是,数据来的太快,未及时处理,在缓冲区新数据覆盖未处理的数据,造成这些‘未处理’的数据丢失。
是这样理解的吗?
你说的这种,可能就是第二种会出现的问题吧。
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-12-14 22:24:29 | 显示全部楼层
如果,你的上位机发送是突发性质的,可以将接收循环队列弄的大些。但是如果是持续的,那么没有流控是不可能完美解决的。
有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 07:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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