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

上位机发送数据,STM103F用串口接收,

[复制链接]
韩宇陌 提问时间:2017-10-31 20:34 /
悬赏1ST金币已解决
上位机发送了三个数据,STM32用串口接收。应该是输出三个数据后就停止输出,但是用串口调试助手调试,输出一直循环输出。如果加上一个跳出循环的语句,if(m==1)。则不能输出数据。大家帮忙看看,问题出哪了
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "math.h"
#include "stdio.h"
#include "dynamixel_two.h"
#include "usmart.h"
#include "driver.h"

#include<stdlib.h>
#include<stdio.h>

//ALIENTEK Mini STM32开发板范例代码3
//串口实验   


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
//ALIENTEK Mini STM32开发板范例代码3
//串口实验   

int main(void)
{        
        u8 t=0;
    u8 k;
    u8 l=0;
    u8 n=0;
        u8 m=0;
        u8 d[3]={0};        
        u8 len=0;
        u8 a[4]={0};
        u8 b[8]={0};
        float w=0;
    u8 i;
        delay_init();                     //延时函数初始化        
        NVIC_Configuration();// 设置中断优先级分组
        uart_init(115200);         //串口初始化为115200
        LED_Init();                           //初始化与LED连接的硬件接口

while (1)
                {
         
                    if(USART_RX_STA&0x8000)
                        {
                                                   
                           len=USART_RX_STA&0x3fff;
                           i=0;
                        for(t=0;t<len;t++)
                          {   
                        
                                 if(USART_RX_BUF[t]==' ')
                                  { i++;t++;}
                                 switch (i)
                           {
                                 case 0:
                                            
                                          a[l]=USART_RX_BUF[t];
                                          l++;
                                          printf("%c",a[l]);
                                           break;
                                  case 1:
                                        b[m]=USART_RX_BUF[t];
                                          m++;
                                          printf("%c",b[m]);
                                          break;
                                  case 2:
                                            d[n]=USART_RX_BUF[t];
                                            n++;
                                          printf("%c",d[n]);
                                           break;
                                         }
                  
                           if(m==1)
                          break;                 
        
           }   
           
   }
        
   }

#include "sys.h"
#include "usart.h"         
//////////////////////////////////////////////////////////////////////////////////         
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_UCOS
#include "includes.h"                                        //ucos 使用         
#endif
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//串口1初始化                  
//正点原子@ALIENTEK
//修改日期:2012/8/18
//版本:V1.5
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.3修改说明
//支持适应不同频率下的串口波特率设置.
//加入了对printf的支持
//增加了串口接收命令功能.
//修正了printf第一个字符丢失的bug
//V1.4修改说明
//1,修改串口初始化IO的bug
//2,修改了USART_RX_STA,使得串口最大接收字节数为2的14次方
//3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(不大于2的14次方)
//4,修改了EN_USART1_RX的使能方式
//V1.5修改说明
//1,增加了对UCOSII的支持
//////////////////////////////////////////////////////////////////////////////////           


//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB         
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif

/*使用microLib的方法*/
/*
int fputc(int ch, FILE *f)
{
        USART_SendData(USART1, (uint8_t) ch);

        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}        

    return ch;
}
int GetKey (void)  {

    while (!(USART1->SR & USART_FLAG_RXNE));

    return ((int)(USART1->DR & 0x1FF));
}
*/


//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误           
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,        接收完成标志
//bit14,        接收到0x0d
//bit13~0,        接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记         



//初始化IO 串口1
//bound:波特率
void uart_init(u32 bound){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
          USART_InitTypeDef USART_InitStructure;
          NVIC_InitTypeDef NVIC_InitStructure;
         
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟
           USART_DeInit(USART1);  //复位串口1
         //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9

    //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10

   //Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
          NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

   //USART 初始化设置

         USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
         USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
         USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
         USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

    USART_Init(USART1, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART1, ENABLE);                    //使能串口
USART_ClearFlag(USART1, USART_FLAG_TC);  
}
#if EN_USART1_RX   //如果使能了接收
void USART1_IRQHandler(void)                        //串口1中断服务程序
        {
u8 Res;
#ifdef OS_TICKS_PER_SEC                 //如果时钟节拍数定义了,说明要使用ucosII了.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 结尾)
               
                {
                Res =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
               
               
                if((USART_RX_STA&0x8000)==0)//接收未完成
                        {
                        if((USART_RX_STA&0x4000))//接收到了0x0d
                        {
                                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x8000;        //接收完成了
                                }
                        else //还没收到0X0D
                                {        
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                        {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收         
                                        }

                                }
                        }                    

                }
#ifdef OS_TICKS_PER_SEC                 //如果时钟节拍数定义了,说明要使用ucosII了.
        OSIntExit();                                                                                          
#endif

                                
                }
        

#endif        

                        
        

        





最佳答案

查看完整内容

break加到了for循环,这就会跳出for循环。
收藏 评论3 发布时间:2017-10-31 20:34

举报

3个回答
回答时间:2017-10-31 20:35:00
break加到了for循环,这就会跳出for循环。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

freeelectron 回答时间:2017-11-1 08:50:27
先用串口终端调试通过,再用上位机吧

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

韩宇陌 回答时间:2017-11-1 09:14:58
freeelectron 发表于 2017-11-1 08:50
先用串口终端调试通过,再用上位机吧

串口调试助手调试正常,发送一次就可以停止,

所属标签

相似问题

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