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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版