#include "stm32f0xx.h"
#include "stm32f0xx_tim.h"
#include "stm32f0xx_exti.h"
#include "stm32f0xx_syscfg.h"
#include "stm32f0xx_flash.h"
#include <stdio.h>
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_usart.h"
#include <string.h>
#define HEADER_BYTE 0xAA
#define ENDING_BYTE 0xCC
#define DATA_PACKET_SIZE 4
typedef char bool;
#define true 1
#define false 0
void USART1_Init(void);
void USART1_IRQHandler(void);
u8 COM1_RecvFin=0;
u8 Start_Receiving=0;
u8 i=0;
unsigned char data[10];
int fputc(int ch, FILE *f)
{
while (!(USART1->ISR & USART_FLAG_TXE));
USART1->TDR = ch;
return (ch);
}
//重定向输入数据
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(USART1);
}
//发送字符
void USART1_Send_Char(unsigned char c)
{
while(!((USART1->ISR)&USART_FLAG_TXE));
USART1->TDR=c;
}
//发送字符串
void USART1_Send_String(char *s )
{
while (*s)
USART1_Send_Char(*s++);
}
//接收一个字节的函数
uint8_t USART1_ReceiveByte(void)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);
return USART_ReceiveData(USART1);
}
void USART1_Init(void)
{
// ʡ GPIO ʼ ʱ ô
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// ʹ GPIOAʱ Ӻ USART1ʱ
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// GPIO ʼ ...
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);
//GPIO ʼ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// USART1 NVIC
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// ô
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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);
// ʹ USART1
USART_Cmd(USART1, ENABLE);//使能USART1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//配置USART1的中断
// USART1 NVIC
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler(void)
{
u8 shujv;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
{
shujv=USART_ReceiveData(USART1);
if(shujv==HEADER_BYTE)
{
i=0;
Start_Receiving=1;//开始接收数据包
}else if(shujv==ENDING_BYTE && i==DATA_PACKET_SIZE-1)
{
COM1_RecvFin=1;
Start_Receiving=0;
i=0;
}
if(Start_Receiving==1)
{
data[i]=shujv;
i++;
}
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}
}
uint8_t current_byte;
int main(void)
{
USART1_Init();
while(1)
{
if(COM1_RecvFin==1)
{
COM1_RecvFin=0;
printf("cmd:%02X\r\n",data[1]);
printf("data:%02X\r\n",data[2]);
//USART_SendData(USART1, data[1]);
//USART_SendData(USART1,data[2]);
}
}
}
为什么我运行上面代码串口命令解析包头为aa包尾为cc如果按照下图不应该打印0102吗?为什么会出现0104