下面是代码部分部分
//主函数部分
int main(void)
{
GPIOInit();//GPIO初始化
USART3_Init();
USART_PutStr(USART3, "program haven be load\r\n");
delay_s(1);
while(1)
{
test1();
}
//测试代码部分
void test1(void)
{
unsigned char buf[5];
delay_s(1);//原始
uart3_Read(buf, sizeof(buf));
USART_PutStr(USART3, buf );
if( strcmp((const char *)buf, u19) == 0)
{
GPIO_SetBits(GPIOC, GPIO_Pin_11);
}
else if( strcmp((const char *)buf, d19) == 0)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_11);
}
else if( strcmp((const char *)buf, u20) == 0)
{
GPIO_SetBits(GPIOC, GPIO_Pin_10);
}
else if( strcmp((const char *)buf, d20) == 0)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_11);
}
memset(buf, 0, sizeof(buf));
}
//缓冲区结构体以及中断服务函数部分
#define GET_TESTFLAG (test_flag)
static volatile struct _uart3_param_tag{
unsigned char head;
unsigned char rear;
char buffer[UART3_MAXBUFLEN+1];
}g_uart3_param;
void USART3_IRQHandler(void)
{
//digitalLo(IO_OUT1_GPIO_Port,IO_OUT1_Pin);
unsigned char Res;
unsigned char ResFlag;
if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
{
USART_ReceiveData(USART3);
USART_ClearFlag(USART3, USART_FLAG_ORE);
}
if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
Res=USART_ReceiveData(USART3);
if( (g_uart3_param.head+1) % UART3_MAXBUFLEN == g_uart3_param.rear )
{
}
else
{
g_uart3_param.buffer[g_uart3_param.head] = Res;
g_uart3_param.head++;
if(g_uart3_param.head >= UART3_MAXBUFLEN)
{
//g_uart3_param.buffer[g_uart3_param.head] = '\0';
g_uart3_param.head = 0;
}
}
}
}
//从串口缓存队列中读取数据
unsigned char uart3_Read(void *vbuf,unsigned char len)
{
unsigned char i = 0;
char *buf = (char *)vbuf;
for(i=0; i<len; i++)
{
if(g_uart3_param.rear == g_uart3_param.head)
{
break;
}
buf[i] = g_uart3_param.buffer[g_uart3_param.rear];
g_uart3_param.rear ++;
if(g_uart3_param.rear >= UART3_MAXBUFLEN)
g_uart3_param.rear = 0;
__nop();
}
return i;
}
//单片机向串口调试助手发数据
void USART_PutChar(USART_TypeDef* USARTx, uint16_t Data)
{
GPIO_SetBits(GPIOD, DE_Pin);//设置高电平
delay_ms(1);
USART_GetFlagStatus(USARTx, USART_FLAG_TC); //避免第一次发送数据的时候丢失首字节的错误
USART_SendData(USARTx, Data);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET){}
GPIO_ResetBits(GPIOD, DE_Pin);//设置低电平
delay_ms(1);
}
void USART_PutStr(USART_TypeDef* USARTx, char *str)
{
unsigned int i = 0;
while(*str != '\0' && i < 500)
{
USART_PutChar(USARTx, *str++);
i++;
}
}
结果时不时出现乱码,但是又时候可以点灯灭灯,有时候不行