打印
[应用相关]

stm32串口通讯问题

[复制链接]
778|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Brand2|  楼主 | 2017-10-25 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;
                }
        }
               
}
沙发
734774645| | 2017-10-25 10:44 | 只看该作者
如果软件没问题,看看是不是硬件没有接好。

使用特权

评论回复
板凳
Soraka| | 2017-10-25 10:58 | 只看该作者
用仿真器仿真啊,这样不就能找到问题所在了吗

使用特权

评论回复
地板
Garen2| | 2017-10-25 11:09 | 只看该作者
USART_ReceiveData(USART1)
这条只能用一次,把收到的数据先存起来,然后做判断

使用特权

评论回复
5
Ryze| | 2017-10-25 11:23 | 只看该作者
我用静态变量存起来,结果是,比如第一次发1,能够计算,第二次发12也能计算,同样发的字符串越长也能计算,但是如果发了123,再发1,或者12,短的字符串就不能够计算了,这是怎么回事啊

使用特权

评论回复
6
Varus| | 2017-10-25 11:35 | 只看该作者
程序太乱了。首先一个大问题就是,你的j变量用的太多了,在很多地方用。

使用特权

评论回复
7
Cjy_JDxy| | 2017-10-25 16:23 | 只看该作者
中断太长了,应该在主程序里处理

使用特权

评论回复
8
Snow7| | 2017-10-25 16:38 | 只看该作者
收到的数据都存起来在一个数组中,然后在“收”不忙的时候,把数据转发出去。只要你能完成这个功能,你的计算基本不成问题,一般在主程序中做数据处理,中断中不作处理,只收发数据和置标志位的工作。

使用特权

评论回复
9
android2| | 2017-10-25 17:11 | 只看该作者
程序没你这么写的,进中断处理程序后,先把中断关掉(如果只是单任务,不关中断也可以),但是清中断标志位的程序必须是在收发完处理之后 ,中断返回之间。

使用特权

评论回复
10
拉克丝| | 2017-10-25 17:18 | 只看该作者
退出的时候定义的静态数组没有处理好

使用特权

评论回复
11
lefeng| | 2017-10-25 17:25 | 只看该作者
参考一下

USART收发.zip

688.36 KB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

824

帖子

2

粉丝