找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1756|回复: 1
收起左侧

STM32串口接收字符串控制继电器的代码问题,求大佬帮我看看

[复制链接]
ID:475866 发表于 2019-3-11 19:27 | 显示全部楼层 |阅读模式
大佬们,请耐心帮我看看,我在试着实现一个串口接收字符串的数据,然后经过ARM的比对开启继电器,不知道我这样写能实现否?我编译过代码了,没有问题,但是好像数据收不到也传不出去。
功能如下:stm32接收到一组字符串 “0+25.4 ”进入数组,然后用公式计算得出数值ch=25.4,再与原来的aimtemp的数据比大小,如果大于aimtemp,那么就开启继电器,否则不开启,然后把字符串“0+25.4”透过传输口发送。如果收到的字符串是“1+25.4”,那么将计算后的值(ch=25.4)放到aimtemp中,然后把“1+25.4”的字符串发送出去。
我开了一个数组,这样行吗,我有实现到每收到一个数据就中断,然后处理完再接受第二个数据吗?
我接收的数据们,是使用完就被扔掉了吗,还是存在哪里了?

单片机源程序:
#include <stdio.h>
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "beep.h"
#include "sys.h"
        int main(void)
{
         GPIO_InitTypeDef GPIO_InitStructure;
         USART_InitTypeDef USART_InitStructure;
         NVIC_InitTypeDef NVIC_InitStructure;
        //时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        

           USART_DeInit(USART1);  
        
//开一个连接继电器的端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
        
          //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATIN
    GPIO_Init(GPIOA, &GPIO_InitStructure);  
        


    USART_InitStructure.USART_BaudRate=9600;
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
    USART_InitStructure.USART_Parity=USART_Parity_No;
    USART_InitStructure.USART_StopBits=USART_StopBits_1;
    USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    USART_Init(USART1,&USART_InitStructure);
    USART_Cmd(USART1,ENABLE);



    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

                 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;               
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               
          NVIC_Init(&NVIC_InitStructure);        

        LED_Init()
  SysTick_Init()
        BEEP_Init();
        
        
  while (1)
  {
        Delay_us(5000);                 
  LED2_REV;        
  }
}


void USART1_IRQHandler(void)
  { u8 i=0;
                int flag;
                float ch=1;
                int aimtemp=35;
                u8 *s;
          char USART_RX_BUF[7];
        
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
        {  
                USART_RX_BUF[i++]=USART_ReceiveData(USART1);
    if (i==8)  i=0;//2»D′D£Ñé
                ch=(USART_RX_BUF[2]-'0')*10+(USART_RX_BUF[3]-'0')*1+(USART_RX_BUF[5]-'0')*0.1;
        
                if(USART_RX_BUF[0]=='1'){
                        flag=1;
                        aimtemp=ch;
                }
               
                if(USART_RX_BUF[0]=='0'){
                        if(ch>aimtemp)
                                GPIO_SetBits(GPIOA,GPIO_Pin_7)
                        else
                                GPIO_ResetBits(GPIOA,GPIO_Pin_7);   
                        flag=1;
                }
               
                if(flag==1){
                        while(*s!='\0' ){
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC )==RESET){
                                        USART_SendData(USART1,*s);
                                        s++;
                                }
                        }
                }
               
                if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) {
                        USART_ClearFlag(USART1, USART_FLAG_ORE)
                        }
        }
}


回复

使用道具 举报

ID:466164 发表于 2019-3-13 21:23 | 显示全部楼层
实验一下不就行了,还没学STM32。定义一个合适变量,每次自动放里面,中断一次覆盖一次,否则你数组得多大,用过了要也没用。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表