即将放年假了,公司目前也没有什么事情是我可做的,便买了一块便宜的stm32板子重新系统学下单片机。目前学到了串口轮询接收字符串,例程是stm32板子自带的看门狗例程,可以把看门狗的实现函数和头文件注释掉,以免影响编译。
板子主控:stm32rct6,他们的库函数其实都差不多,适当修改下即可。主要实现代码如下:
while(1)
{
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == 1) //USART_FLAG_RXNE判断数据,== 1则有数据
{ for(i=0;i<5;i++){
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == 0);
USART1_ReceiveData[i] = USART_ReceiveData(USART1); //通过USART1串口接收字符
USART_ClearFlag(USART1,USART_FLAG_RXNE); //接收后先清空标志位
}
}
if( USART1_ReceiveData[0]=='o' && USART1_ReceiveData[1]=='p' && USART1_ReceiveData[2]=='e' && USART1_ReceiveData[3]=='n') //如果数据为1,LED1灯电平翻转
{
printf("\r\n open light \r\n");
LED0 =0;
}
else if( 'c' == USART1_ReceiveData[0] && USART1_ReceiveData[1]=='l' && USART1_ReceiveData[2]=='o' && USART1_ReceiveData[3]=='s' && USART1_ReceiveData[4]=='e') //如果数据为2,LED2灯电平翻转
{
printf("\r\n close light \r\n");
LED0=1;
}
/*else{
printf("\r\n input error \r\n");
}
*/
//USART1_ReceiveData = 0; //数据清零
}
usart,h
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "sys.h"
//1,增加了对UCOSII的支持
#define USART_REC_LEN 200 //定义最大接收字节数 200
#define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART_RX_STA; //接收状态标记
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
void USART1_Init();
#endif
usart.c
#include "sys.h"
#include "usart.h"
//
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h" //ucos 使用
#endif
//加入以下代码,支持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;
}
#