你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32串口接收数据的疑问

[复制链接]
at89 提问时间:2015-7-26 21:09 /
如题,想通过串口发送字符串存在数组里面,然后在串口助手上打印出来,一开始计数值没有清零导致数据总是会被覆盖,调试了好久终于搞定,但是我在仿真窗口观察数组数据发现了问题,数据并没有存放在数组里面,而是每个字符轮流存在了数组首地址,而且打印数组大小的确只有首地址有,这样子本来是要对数据进一步处理的现在没法进行,向诸位请教下,问题出在哪里?代码如下,貌似count++,没有什么作用


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]);
}

收藏 评论8 发布时间:2015-7-26 21:09

举报

8个回答
yinlian 回答时间:2015-7-27 08:46:06
    这段代码有很多问题:
     1.下面这段代码:
         RxSize=RxCount;
         USART_ClearFlag(USART1,USART_FLAG_TC);
        for(RxCount=0;RxCount<RxSize;RxCount++)
         printf("%c",RxBuf[RxCount]);
        这段代码是在串口1的中断函数里吗?如果是,那么每次接收中断都会执行这段代码,所以,你看到接收到的字符只存在字符串的首地址就是对的;因为每收到一个数据,他就会打印出去,同时RxCount就会清零。也就是 你每次接收到的数据都是第一个数据。
      
        2.RxCout这个变量是局部动态变量,退出中断函数后就消失了,所以你每次进入中断函数,RxCount都会重新定义并赋值为0 。那么你调试看到的现象也可以解释了。
小蚂蚁快溜跑 回答时间:2015-7-27 13:15:26
同意楼上的观点。能把你的整个工程发给我看看吗?我用的334老是不能接收
回答时间:2015-7-27 14:58:00
2楼回复很全面。RxCount局部变量,导致RxCount永远是第一个。
at89 回答时间:2015-7-27 17:09:04
安 发表于 2015-7-27 14:58
2楼回复很全面。RxCount局部变量,导致RxCount永远是第一个。

恩,后来想了想,逻辑上是不对,我把自己的思路验证下再来和诸位讨论哈
at89 回答时间:2015-7-27 20:03:06
小蚂蚁快溜跑 发表于 2015-7-27 13:15
同意楼上的观点。能把你的整个工程发给我看看吗?我用的334老是不能接收

其他的旧书串口的配置了,和例程里面一样的,修改的就是中断里面的啊
at89 回答时间:2015-7-27 20:08:11
安 发表于 2015-7-27 14:58
2楼回复很全面。RxCount局部变量,导致RxCount永远是第一个。

恩,重新修改了逻辑,之前我是以为发送字符串过去会全部接收的,硬件上还是没弄清楚,修改之后就可以啦,贴出代码一起讨论下。有个问题时本来想用\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;
                       
                }
回答时间:2015-7-28 15:39:04
\0并不是空格,是0x00。
at89 回答时间:2015-7-28 20:22:07
安 发表于 2015-7-28 15:39
\0并不是空格,是0x00。

恩,空格是我自己定义的结束标志,用\0有问题,初始化未赋值的话都是\0,不好判断,搞定啦,谢啦

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版