OpenEdv-开源电子网

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

再请教关于串口的一个问题

[复制链接]

28

主题

86

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-5-19
在线时间
64 小时
发表于 2017-5-24 11:26:15 | 显示全部楼层 |阅读模式
10金钱
RT,我想实现的功能是,串口1向串口2发送一个字符串,然后通过串口2打印出来,我这么写的
                        for(t=0;t<len;t++)
                {
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        USART_SendData(USART1, p[t]);
                        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
                        buf[t] =USART_ReceiveData(USART2);
                        USART_ClearFlag(USART2, USART_IT_RXNE);
                       
                       
                }
               
                                for(t=0;t<len;t++)
                        {
                                while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
                                USART_SendData(USART2, buf[t]);
                               
                        }

然后串口打印出来的数据不完整,串口1发送的字符串长是12位,但是串口2只能打印出7位,请问一下是什么原因?

最佳答案

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

if改成while带超时退出的,或者直接发送完等2ms(或以上)再进行判断,用中断主要是可以应付突发传输免得丢包,再就是节省CPU
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-5-24 11:26:16 来自手机 | 显示全部楼层
18323054303 发表于 2017-5-25 22:06
我不想把接收写到中断服务函数里面,想在main里面实现这个。。。请教一下怎么写才好

if改成while带超时退出的,或者直接发送完等2ms(或以上)再进行判断,用中断主要是可以应付突发传输免得丢包,再就是节省CPU
回复

使用道具 举报

28

主题

86

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-5-19
在线时间
64 小时
 楼主| 发表于 2017-5-24 12:34:52 | 显示全部楼层
顶一下,求大神帮忙解答一下。。。
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13197
金钱
13197
注册时间
2012-11-26
在线时间
3820 小时
发表于 2017-5-24 13:09:54 | 显示全部楼层
逻辑混乱,还是先理理逻辑吧!
回复

使用道具 举报

28

主题

86

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-5-19
在线时间
64 小时
 楼主| 发表于 2017-5-24 17:15:30 | 显示全部楼层
jermy_z 发表于 2017-5-24 13:09
逻辑混乱,还是先理理逻辑吧!

大兄弟,我确实不知道该怎么做,能不能给提供下思路。。。
回复

使用道具 举报

3

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2013-12-24
在线时间
28 小时
发表于 2017-5-24 17:18:39 | 显示全部楼层
这特么写的什么代码啊!!!?中断和DMA都不用 ……
回复

使用道具 举报

28

主题

86

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-5-19
在线时间
64 小时
 楼主| 发表于 2017-5-24 17:47:11 | 显示全部楼层
wmaxwell 发表于 2017-5-24 17:18
这特么写的什么代码啊!!!?中断和DMA都不用 ……

我想的就是把串口1接收到的字符串,一位一位的存到数组里面,再把这个数组打印出来。。。要用什么东西。。。不是很明白
回复

使用道具 举报

28

主题

86

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-5-19
在线时间
64 小时
 楼主| 发表于 2017-5-24 23:37:51 | 显示全部楼层
本帖最后由 18323054303 于 2017-5-24 23:45 编辑
wmaxwell 发表于 2017-5-24 17:18
这特么写的什么代码啊!!!?中断和DMA都不用 ……

兄弟,我串口2接收数据的时候好像并未发生中断啊。。。我if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)这一句下面的东西好像没执行
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2017-5-25 08:29:27 | 显示全部楼层
本帖最后由 oyixi001 于 2017-5-25 08:31 编辑
18323054303 发表于 2017-5-24 23:37
兄弟,我串口2接收数据的时候好像并未发生中断啊。。。我if(USART_GetITStatus(USART2, USART_IT_RXNE) ! ...

你接收要么用中断,要么用DMA。
你用的查询法也不是不可以,但是你用了if(USART_GetITStatus(USART2, USART_IT_RXNE)来检查,你有没有想过一个问题:
上面串口一刚发送,你下面串口2就检查有没有收到,怎么会不出错呢?所以,一定要用的话,可以换用while试试,就是说一直在循环反复检查串口2有没有接收完标志,然后在这循环里要加上超时退出,不然可能死在这个循环里,或者在你的if前加上一小段延时1ms啥的。
我没有试嗷,看了你的代码感觉差不多是这么回事。
回复

使用道具 举报

3

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2013-12-24
在线时间
28 小时
发表于 2017-5-25 10:20:42 | 显示全部楼层
18323054303 发表于 2017-5-24 17:47
我想的就是把串口1接收到的字符串,一位一位的存到数组里面,再把这个数组打印出来。。。要用什么东西。 ...

我建议你上传完整的工程  你的代码有点少   不方便分析
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-5-25 11:03:49 | 显示全部楼层
你会串口吗?????
回复

使用道具 举报

28

主题

86

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-5-19
在线时间
64 小时
 楼主| 发表于 2017-5-25 17:34:16 | 显示全部楼层
oyixi001 发表于 2017-5-25 08:29
你接收要么用中断,要么用DMA。
你用的查询法也不是不可以,但是你用了if(USART_GetITStatus(USART2, U ...

兄弟,我明白你的意思,我是不想把串口2发送,放到中断服务函数里面,想在main函数里面做,但是if(USART_GetITStatus(USART2, USART_IT_RXNE)放在main里面好像又要出事
回复

使用道具 举报

28

主题

86

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-5-19
在线时间
64 小时
 楼主| 发表于 2017-5-25 17:35:25 | 显示全部楼层
沧海 发表于 2017-5-25 11:03
你会串口吗?????

新手学习中,见笑了。。。
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-5-25 21:52:54 来自手机 | 显示全部楼层
这代码有点鬼畜啊,串口速度比较低一般都是dma和中断方式接受的……不过就这段的问题应该就是速度慢了,串口1没发送完就过了if,当前解决方法是发送完加延时。但是实际应用最好别这么干
回复

使用道具 举报

28

主题

86

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2015-5-19
在线时间
64 小时
 楼主| 发表于 2017-5-25 22:06:21 | 显示全部楼层
cromarti 发表于 2017-5-25 21:52
这代码有点鬼畜啊,串口速度比较低一般都是dma和中断方式接受的……不过就这段的问题应该就是速度慢了,串 ...

我不想把接收写到中断服务函数里面,想在main里面实现这个。。。请教一下怎么写才好
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-5-25 22:26:09 来自手机 | 显示全部楼层
18323054303 发表于 2017-5-25 22:06
我不想把接收写到中断服务函数里面,想在main里面实现这个。。。请教一下怎么写才好

发送完之后加2ms的延时或者改成带超时判断的while
回复

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-5-26 07:53:36 | 显示全部楼层
18323054303 发表于 2017-5-25 17:35
新手学习中,见笑了。。。

你不用中断能知道数据什么时候接受完毕??不会被覆盖??
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2017-5-26 08:56:26 | 显示全部楼层
18323054303 发表于 2017-5-25 17:34
兄弟,我明白你的意思,我是不想把串口2发送,放到中断服务函数里面,想在main函数里面做,但是if(USART ...

是啊,所以我给你写了这么多。让你用while也可以么诶。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-20 22:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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