OpenEdv-开源电子网

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

关于STM32的串口问题

[复制链接]

2

主题

14

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-1-16
在线时间
4 小时
发表于 2017-2-13 16:12:41 | 显示全部楼层 |阅读模式
10金钱
今天回过头去复习巩固以前的知识,发现了我在串口通信上的问题,根据视频教程上源代码[mw_shl_code=applescript,true]rec = USART_ReceiveData(USART1);
USART_SendData(USART1,rec);
[/mw_shl_code]
通过串口调试助手,输入一行,然后他就输出一行,但是我改了下源代码
[mw_shl_code=applescript,true]rec = USART_ReceiveData(USART1);
USART_SendData(USART1,rec);
USART_SendData(USART1,rec);
[/mw_shl_code]
理论上应该是输出叠字的,但是却只输出了原字符串,有没有大神带带我,求解决方法

最佳答案

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

像楼主测这么个完全没意义的东西,浪费时间,串口发送前,判断是否空闲,非空闲就等着吧
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13197
金钱
13197
注册时间
2012-11-26
在线时间
3820 小时
发表于 2017-2-13 16:12:42 | 显示全部楼层
像楼主测这么个完全没意义的东西,浪费时间,串口发送前,判断是否空闲,非空闲就等着吧
学无止境
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13197
金钱
13197
注册时间
2012-11-26
在线时间
3820 小时
发表于 2017-2-13 16:16:30 | 显示全部楼层
叠字是什么东西?
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-1-16
在线时间
4 小时
 楼主| 发表于 2017-2-13 16:18:41 | 显示全部楼层
jermy_z 发表于 2017-2-13 16:16
叠字是什么东西?

就是我输入12345,然后他输出1122334455
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
发表于 2017-2-13 16:20:33 | 显示全部楼层
本帖最后由 Anthony_brave 于 2017-2-13 16:34 编辑

你的串口发送函数里面  有发送条件,就是在接收到字符之后才能发送。发送完之后需要再接收才能发送。所以

举个例子 :你输入一个字符,有个标志位(比如A)变成1。在运行第一个发送函数时里面是要求A=1时才能发送,发送完毕之后A变成0。所以你运行第二个发送函数时依然要求A=1时才能发送,但是此时A=0,所以不能发送。   所以你输入一个字符,输出的只有一个字符。
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-1-16
在线时间
4 小时
 楼主| 发表于 2017-2-13 16:29:23 | 显示全部楼层
Anthony_brave 发表于 2017-2-13 16:20
你的串口发送函数里面  有发送条件,就是在接收到字符之后才能发送。发送完之后需要再接收才能发送。所以
...

兄弟 那怎么改呢?
串口发送函数
[mw_shl_code=applescript,true]void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}
[/mw_shl_code]
里面直接就是改DR寄存器的值啊
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-1-16
在线时间
4 小时
 楼主| 发表于 2017-2-13 16:35:51 | 显示全部楼层
我又改了下中断函数
[mw_shl_code=applescript,true]void USART1_IRQHandler(void)
{
        char rec;
        if(USART_GetFlagStatus(USART1,USART_IT_RXNE) != RESET)
        {
                rec = USART_ReceiveData(USART1);
                USART_SendData(USART1,rec);
                delay_ms(1);
                USART_SendData(USART1,rec);
                delay_ms(1);
        }
}[/mw_shl_code]
然后我输入12345,它能输出1122.........
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-1-16
在线时间
4 小时
 楼主| 发表于 2017-2-13 16:36:41 | 显示全部楼层
xiayifeng2017 发表于 2017-2-13 16:35
我又改了下中断函数
[mw_shl_code=applescript,true]void USART1_IRQHandler(void)
{

为什么在2这里断了???
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-1-16
在线时间
4 小时
 楼主| 发表于 2017-2-13 16:37:54 | 显示全部楼层
是不是接收到2的时候USART_IT_RXNE被清0了????
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13197
金钱
13197
注册时间
2012-11-26
在线时间
3820 小时
发表于 2017-2-13 17:02:09 | 显示全部楼层
串口输出需要时间的,你得等待串口空闲
回复

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2017-2-13 17:06:24 | 显示全部楼层
发送完成后加上这句
USART_SendData(USART1,rec);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-1-16
在线时间
4 小时
 楼主| 发表于 2017-2-13 17:16:39 | 显示全部楼层
jermy_z 发表于 2017-2-13 17:02
像楼主测这么个完全没意义的东西,浪费时间,串口发送前,判断是否空闲,非空闲就等着吧

谢谢大神的提示,不过又有新问题了,为什么暂停一毫秒后,它只输出了1122, 后面就没了,我改成50us后能输出112244,我隐隐感觉是发送端的问题.......
回复

使用道具 举报

70

主题

6769

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13197
金钱
13197
注册时间
2012-11-26
在线时间
3820 小时
发表于 2017-2-13 17:17:37 | 显示全部楼层
xiayifeng2017 发表于 2017-2-13 17:16
谢谢大神的提示,不过又有新问题了,为什么暂停一毫秒后,它只输出了1122, 后面就没了,我改成50us后能 ...

在串口里用延迟函数本来就是作死
学无止境
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-1-16
在线时间
4 小时
 楼主| 发表于 2017-2-13 17:20:06 | 显示全部楼层
aben 发表于 2017-2-13 17:06
发送完成后加上这句
USART_SendData(USART1,rec);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SE ...

这个我试了试,输入12345,输出112244.。。。
不过这个方法我记下来了 谢谢
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-1-16
在线时间
4 小时
 楼主| 发表于 2017-2-13 17:24:34 | 显示全部楼层
jermy_z 发表于 2017-2-13 17:17
在串口里用延迟函数本来就是作死

其实我也觉得在作死,不过学习嘛,多死几次也没什么
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2017-2-13 17:57:57 | 显示全部楼层
楼主在搞笑,你向外发送数据不需要时间么,你得等待标志位,等上一个数据发送完后才能发送第二个数据。
回复

使用道具 举报

1

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2017-2-9
在线时间
19 小时
发表于 2017-2-14 15:20:56 | 显示全部楼层
楼主的想法很有趣,我也试了试,确实发现了一些问题  我的中断函数如下:
  if(USART_GetITStatus(USART2,USART_IT_RXNE))
  {
      count++;
      receiveData = USART_ReceiveData(USART2);
        USART_SendData(USART2,receiveData);
        while(!(USART_GetFlagStatus(USART2,USART_FLAG_TXE)));
        USART_SendData(USART2,count);
        while(!(USART_GetFlagStatus(USART2,USART_FLAG_TXE)));
  }
这就现象就有趣了,发送01返回0101  发送0102返回01020203、发送010203,返回010402050306、发送01020304返回010702080309、发送0102030405返回010a20b030c050d。有趣了,计数的值在不断的增加,但是在发送01020304的时候只返回到03,04丢失了,而计数的值累加到09,在发送01-05时,04依然丢失,但是计数的值是从09开始计数,也就是说在发送01020304时,USART只进入了三次中断(也就是010203分别进入了中断),而在接受04的时候没有进入中断,也就是说根本就没有接收到04这个值。那这个值去哪里了呢?为什么这个值会丢失?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-24 07:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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