大佬們,請耐心幫我看看,我在試著實現一個串口接收字符串的數據,然后經過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)
}
}
}
|