微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 调了3天了,STM32串口通讯实现简单的计算功能,还是调不出

调了3天了,STM32串口通讯实现简单的计算功能,还是调不出

时间:10-02 整理:3721RD 点击:
求大虾帮助啊,急急急啊,调了3天了,STM32串口通讯实现简单的计算功能,还是调不出,我的配置都正确了,下面是我的it.c里的中断服务函数
#include "stm32f10x_it.h"
#include"stdio.h"
#include "string.h"
static  int j=0;
void USART1_IRQHandler(void)
{
        int i=1,k,m,n=0,index=0;
       
           char str[6]="";
           if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)// 如果是串口接收中断
        {       
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除USARTx的中断待处理位
                USART_ClearFlag(USART1,USART_FLAG_TC);  //清除标志位
                if(USART_ReceiveData(USART1)!=' ')
                {
                        str[j]=USART_ReceiveData(USART1);        // 将接收到的字节发送出去
                        j++;       
                }
                if(USART_ReceiveData(USART1)==' ')
                {
                        m=strlen(str);
                        for(j=0;j<m-1;j++)
                                i=i*10;
                        for(j=0;j<m;j++)
                        {
                                n=(str[j]-48)*i+n;
                                i=i/10;
                        }
                        n=10000-n;
                        k=n;
                        while(n>0)/*index保存x的位数*/
                        {
                        n = n / 10;
                        index++;
                    }
                    for(j=0;j<index;j++)
                        {
                        str[index-j-1] = k % 10 +48;/*记得加'0'*/
                        k = k / 10;
                    }
                    while(  str[j] != '\0')
                    {
                                USART_SendData(USART1 ,str[j] );
                                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
                                j++;
                    }
                        j=0;
                }
        }
               
}

好像很复杂的样子,帮不了你啦,赚点积分嘿嘿

好久没玩STM32了,你也不说你的调不出是乱码啊还是压根就没有收到,你说配置是正常的,但要实验一下的。如果你看收发正常的字符,后面跳过。(你得确保你的串口通信一定要是正常的(包括时钟的配置,针脚的配置还有复用什么的,中断的开启清位等操作))。在确保可以收发正常的单个字符后,你就要看看程序写的是否有逻辑问题了,我看到几处奇怪的地方。
1.while(  str[j] != '\0')之前的j的值是什么,看小编的意思像是将str数组中的全部发出,是这样的吗?
2.str【j】的最后一个字符请确保真的是字符串终止符,否则死循环了就。
3.USART_SendData(USART1 ,str[j] );
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
小编这样一个个发单个字符真的没有问题吗?是不是要每发送一个字符清除一下发送标志位?
还有最后一个问题
str[j]=USART_ReceiveData(USART1);        // 将接收到的字节发送出去
注释与程序不符合。LZ如果是开始编程,可以看看一篇叫《华为技术有限公司c语言编程规范》,因为你的程序看起来有些乱。
我只能说这些建议了。我也是渣渣,其它大神路过请轻拍,最后LZ加油!

参考原子哥视频源程序就好了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top