OpenEdv-开源电子网

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

stm32串口接收数据存放数组的困惑

[复制链接]

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-7-26
在线时间
13 小时
发表于 2015-7-26 21:21:37 | 显示全部楼层 |阅读模式
5金钱
如题,想通过串口发送字符串存在数组里面,然后在串口助手上打印出来,一开始计数值没有清零导致数据总是会被覆盖,调试了好久终于搞定,但是我在仿真窗口 观察数组数据发现了问题,数据并没有存放在数组里面,而是每个字符轮流存在了数组首地址,而且打印数组大小的确只有首地址有,这样子本来是要对数据进一步 处理的现在没法进行,向诸位请教下,问题出在哪里?代码如下,貌似count++,没有什么作用

[mw_shl_code=c,true]void USART1_IRQHandler(void) { u8 RxSize=0,RxCount=0; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART1,USART_IT_RXNE); RxBuf[RxCount++] = USART_ReceiveData(USART1); } RxSize=RxCount; USART_ClearFlag(USART1,USART_FLAG_TC); for(RxCount=0;RxCount<RxSize;RxCount++) printf("%c",RxBuf[RxCount]); }[/mw_shl_code]

最佳答案

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

你得明白局部变量的特性。 就知道为什么了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-26 21:21:38 | 显示全部楼层
你得明白局部变量的特性。
就知道为什么了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-7-26
在线时间
13 小时
 楼主| 发表于 2015-7-26 22:12:38 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
extern u8 RxBuf[],RxCount,TestBuf[],TestCount;
谢原子哥,局部变量用完就释放了,可是我之前已经定义为静态了,而且变量还在作用域内,怎么会呢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-26 22:15:59 | 显示全部楼层
回复【3楼】xiaotianst:
---------------------------------
你自己看代码,哪里是静态?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-7-26
在线时间
13 小时
 楼主| 发表于 2015-7-26 22:23:00 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
搞错了,不是叫静态,extern声明了全局变量,为什么字符串只存放在数组首地址呢?而且明明是存完才打印的,现在看来是存一个字符就退出再进中断了
回复

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
428
金钱
428
注册时间
2014-1-28
在线时间
8 小时
发表于 2015-7-26 23:02:04 | 显示全部楼层
回复【5楼】xiaotianst:
---------------------------------

恕我愚钝:
1. USART1_IRQHandler,是每次接收1个字节后 或者 每次发送1个字节后,就进去这个中断函数执行一次。
2. 那么,你每次执行这个函数时,都会把RxSize和RxCount都赋值为0。
3. 所以,你只会输出1个字符。
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-7-26
在线时间
13 小时
 楼主| 发表于 2015-7-26 23:06:57 | 显示全部楼层
回复【6楼】LuoKen:
---------------------------------
恩,那么如何才能接受整个字符串呢,求不吝赐教,想的头痛,如果counter不清零会导致受到的是乱了,而且size也一直在增加
回复

使用道具 举报

1

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-7-16
在线时间
3 小时
发表于 2015-7-27 11:13:03 | 显示全部楼层
回复【7楼】xiaotianst:
---------------------------------
 我觉得这不是有关串口的问题,而是有关C语言基础的问题...
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-7-26
在线时间
13 小时
 楼主| 发表于 2015-7-27 20:00:19 | 显示全部楼层
回复【8楼】joe_knight:
---------------------------------
恩,C语言是学的不怎么好,后来想了想。的确程序逻辑上是有问题,但是好像硬件上也不对,向串口发送字符串的时候,串口是接收到一个字符就进入一次中断,那么字符串末尾的\0还发不发过去呢,后来我修改了程序,对\0检测,作为字符串接收完成标志,发现进不去,好像并不会发送\0,所以需要自己定义一个帧尾的识别符。修改程序如下
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
RxBuf[RxCount]=USART_ReceiveData(USART1);
}
  if(RxBuf[RxCount]==' ')
{
RxSize=RxCount;
printf("RxCount=%d\n",RxCount);
RxCount=0;
// printf("RxCount=%d\n",RxCount);

printf("RxSize=%d\n",RxSize);

}
else 
{
// printf("RxCount=%d\n",RxCount);
RxCount+=1;

}
所以现在想请教下,向串口发送字符串的时候,\0会不会发过去?
回复

使用道具 举报

1

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-7-16
在线时间
3 小时
发表于 2015-7-28 09:27:50 | 显示全部楼层
回复【9楼】xiaotianst:
---------------------------------
用串口调试助手,一般后边都会添加\r\n,你用这个作帧尾标识符,如果你自己写的发送程序,你想发什么就发什么;
另外你程序里判断接收到空格是什么情况?
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-7-26
在线时间
13 小时
 楼主| 发表于 2015-7-28 20:19:54 | 显示全部楼层
回复【10楼】joe_knight:
---------------------------------
哦,难怪,我以为串口发送字符串后面是以\0结尾,但是程序里面没有检测到,所以自己定义了一个结束标识符,判断字符串发送完成的,谢啦
回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-5-7
在线时间
19 小时
发表于 2019-2-25 11:25:42 | 显示全部楼层
学习了
回复

使用道具 举报

3

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2019-5-22
在线时间
30 小时
发表于 2019-7-24 15:42:38 | 显示全部楼层
想问一下改了哪里解决的
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-7-23
在线时间
1 小时
发表于 2019-7-29 15:27:11 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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