找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2211|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

STM32串口接收字符串控制繼電器的代碼問題,求大佬幫我看看

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:475866 發(fā)表于 2019-3-11 19:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
大佬們,請耐心幫我看看,我在試著實(shí)現(xiàn)一個(gè)串口接收字符串的數(shù)據(jù),然后經(jīng)過ARM的比對開啟繼電器,不知道我這樣寫能實(shí)現(xiàn)否?我編譯過代碼了,沒有問題,但是好像數(shù)據(jù)收不到也傳不出去。
功能如下:stm32接收到一組字符串 “0+25.4 ”進(jìn)入數(shù)組,然后用公式計(jì)算得出數(shù)值ch=25.4,再與原來的aimtemp的數(shù)據(jù)比大小,如果大于aimtemp,那么就開啟繼電器,否則不開啟,然后把字符串“0+25.4”透過傳輸口發(fā)送。如果收到的字符串是“1+25.4”,那么將計(jì)算后的值(ch=25.4)放到aimtemp中,然后把“1+25.4”的字符串發(fā)送出去。
我開了一個(gè)數(shù)組,這樣行嗎,我有實(shí)現(xiàn)到每收到一個(gè)數(shù)據(jù)就中斷,然后處理完再接受第二個(gè)數(shù)據(jù)嗎?
我接收的數(shù)據(jù)們,是使用完就被扔掉了嗎,還是存在哪里了?

單片機(jī)源程序:
#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;
        //時(shí)鐘
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        

           USART_DeInit(USART1);  
        
//開一個(gè)連接繼電器的端口
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)
                        }
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:466164 發(fā)表于 2019-3-13 21:23 | 只看該作者
實(shí)驗(yàn)一下不就行了,還沒學(xué)STM32。定義一個(gè)合適變量,每次自動(dòng)放里面,中斷一次覆蓋一次,否則你數(shù)組得多大,用過了要也沒用。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表