基本功能描述:
上位机发送指令控制STM32
情况一:命令为3个字符
起始符 命令符 结束符 功能
0x2f 0x34 0xcc 温度数据返回
0x2f 0x32 0xcc led亮
0x2f 0x33 0xcc led灭
我是通过串口中断来实现串口数据的接收的。
中断程序如下:如果接收到的指令正确,改变全局变量USART_RX_STA 的值,让它等于0x80。
if(USART_RX_STA != 0x80)
{
if(data == 0x2f) //起始符
{
memset(RecvBuf, 0, sizeof(RecvBuf));
RecvBuf[0] = data;
USART_RX_STA = 0;
USART_SendData(USART1, data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
else if(data == 0x39) //结束符
{
if(RecvBuf[0] != 0x2f)
{
memset(RecvBuf, 0, sizeof(RecvBuf));
return;
}
RecvBuf[2] = data;
USART_RX_STA = 0x80;
USART_SendData(USART1, data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
else
{
RecvBuf[1] = data;
USART_SendData(USART1, data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
}
主函数程序:
while(1)
{
if(USART_RX_STA == 0x80)
{
switch(RecvBuf[1])
{
case 0x30:
break;
case 0x31:
break;
case 0x32:
GPIO_SetBits(GPIOD, GPIO_Pin_2);
break;
case 0x33:
GPIO_ResetBits(GPIOD, GPIO_Pin_2);
break;
case 0x34:
temp=DS18B20_Get_Temp();
memset(SendBuf, 0, sizeof(SendBuf));
SendBuf[0] = 0x2f;
SendBuf[1] = 0x34;
if(temp<0)
{
temp=-temp;
SendBuf[2] = Number[11];
}
else
{
SendBuf[2] = Number[10];
}
SendBuf[3] = Number[temp/100%10];
SendBuf[4] = Number[temp/10%10];
SendBuf[5] = '.';
SendBuf[6] = Number[temp%10];
SendBuf[7] = 0x04;
SendBuf[8] = 0xcc;
for(i = 0; i < 9; ++i)
{
USART_SendData(USART1, SendBuf);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
break;
default:
break;
}
USART_RX_STA = 0;
}
else
{
delay_ms(200);
}
}
}
问题是:程序开始还可以正确执行,但是执行一段时间,再发送指令,它就没有响应了。
全局变量是在mian.c文件里定义,然后在中断程序里extern了一下。我也不知道这个程序可能出了什么问题,望大虾指点一二!
|