串口通信串口发送指令,控制单片机实现如下响应:(1)串口发送R#(#为数字),红色LED闪烁#次,间隔1秒;
(2)串口发送Red(为数字),红色LED每ms闪烁1次。
说明 :(1)波特率为57600;
(2)闪烁次数#为10以内数字;
(3)闪烁间隔**可为100~9999之间数值;
(4)单片机将上述接收的串口指令,返回给PC并显示。
u8 Uart_Flag =0;
u8 Uart_Num =0;
u8 Uart_RxSTA =0;
u8 USART_RX_BUF[64];
u8 USART_TX_BUF[64];
u8 Uart_TxCnt =0;
u8 Uart_TXFlag =0;
void uart_init(void)
{
//配置接收中断
//接收中断优先级一定要高。
}
void UART_IRQHandler(void)
{
u8 res;
//接收到数据中断
if(USART1->SR&(1<<5))
{
res=USART1->DR;
if((Uart_RxSTA&0x80)==0)//接收未完成
{
if(Uart_RxSTA&0x40)//接收到了0x0d
{
if(res!=0x0a)//接收错误,重新开始
{
Uart_RxSTA=0;
}
else//接收完成了
{
Uart_Num = Uart_RxSTA;//记下接收的字节数
Uart_Flag =1;//接收完成标志
Uart_RxSTA|=0x80; //清接收字节
USART1->CR1|=1<<8; //PE中断使能
USART1->CR1|=1<<7; //发射空中断
}
}
else //还没收到0X0D
{
if(res==0x0d)Uart_RxSTA|=0x40;
else
{
USART_RX_BUF[Uart_RxSTA&0X3F]=res;
Uart_RxSTA++;
if(Uart_RxSTA>63)Uart_RxSTA=0;//接收数据错误,重新开始接收
}
}
}
//发射空中断
if(USART1->SR&(1<<7))
{
//(4)单片机将上述接收的串口指令,返回给PC并显示。
if(Uart_Flag ==1)
{
Uart_Flag =0;
if(Uart_TXFlag ==0)
{
USART_TX_BUF = USART_RX_BUF[Uart_TxCnt] //保存一下数据
}
USART1->DR = (u8)USART_RX_BUF[Uart_TxCnt++];
if(Uart_TxCnt>=Uart_Num)
{
USART1->CR1 &= ~ (1<<8);//PE中断使能(关闭)
USART1->CR1 &= ~ (1<<7);//发射空中断(关闭)
Uart_TxCnt=0;
Uart_RxSTA =0x00;
Uart_TXFlag =1;//这里清Uart_TXFlag,这样数据就不会被覆盖。
}
}
}
}
u8 BlinkNum=0;
u8 BlinkCnt=0;
u8 BlinkFlag=0;
u16 BlinkTIM =0;
//处理串口数据,放在定时器中断中,定时10MS
void Data_RxUart(void)
{
u8 i;
//接收到数据
if(Uart_TXFlag==1)
{
Uart_TXFlag =0;
BlinkCnt =0;
//(1)串口发送R#(#为数字),红色LED闪烁#次,间隔1秒;
if(USART_RX_BUF[0]=='R')
{
BlinkNum = USART_RX_BUF[1];//记下闪烁次数
BlinkFlag =1;
}
}
//计算好闪烁次数
if(BlinkFlag==1)
{
BlinkTIM++;if(BlinkTIM>=100)//间隔1秒;
{
LED_RED =!LED_RED;//红色LED闪烁#次
BlinkCnt++;
if(BlinkCnt>=BlinkNum)
{
BlinkCnt =0;
BlinkFlag =0;//清除闪烁
}
}
}
}