论坛元老
 
- 积分
- 7464
- 金钱
- 7464
- 注册时间
- 2015-1-15
- 在线时间
- 1368 小时
|
发表于 2019-3-27 17:13:59
|
显示全部楼层
推荐楼主这样处理串口数据比较好:
#define cHEADP 0
#define cSTATUSP 1
#define cADDRP 2
#define cLENP 3
#define cDATAP 4
#define cFRAME_HEAD1 0xDD
#define cFRAME_HEAD2 0x77
#define cFRAME_R_STATUS 0xA5
#define cFRAME_W_STATUS 0x5A
#define cFRAME_BASE_INFO 0x03
#define cFRAME_BATTERY_VOLT 0x04
#define cFRAME_BOARD_VER 0x05
typedef struct
{
uint8_t frameFlag;
uint8_t rx_len;
uint8_t rx_buf[200];
uint8_t rx_index;
uint8_t tx_len;
uint8_t tx_buf[200];
uint8_t tx_index;
}CommMsg_Type;
CommMsg_Type Comm_Msg;
void USART1_IRQHandler(void)
{
uint8_t value = 0;
if(USART1->SR & 0x00000008)
USART1->SR |= 0x00000008;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
value = USART_ReceiveData(USART1);
switch( Comm_Msg.rx_index )
{
case cHEADP: // 帧头
{
if(cFRAME_HEAD1 == value)
{
Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
}
break;
}
case cSTATUSP: // 功能
{
if(cFRAME_R_STATUS == value || cFRAME_W_STATUS == value)
{
Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
}
else
{
Comm_Msg.rx_index = 0;
}
break;
}
case cADDRP: // 地址
{
if(cFRAME_BASE_INFO == value || cFRAME_BATTERY_VOLT == value || cFRAME_BOARD_VER == value)
{
Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
}
else
{
Comm_Msg.rx_index = 0;
}
break;
}
case cLENP: // 长度
{
if(value < sizeof(Comm_Msg.rx_buf)/sizeof(uint8_t))
{
Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
}
else
{
Comm_Msg.rx_index = 0;
}
break;
}
default:
{
if(Comm_Msg.rx_index >= sizeof(Comm_Msg.rx_buf)/sizeof(uint8_t))
{
Comm_Msg.rx_index = 0;
}
else
{
if(Comm_Msg.rx_index >= (Comm_Msg.rx_buf[cLENP] + 6))
{
if(cFRAME_HEAD2 == value)
{
Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
Comm_Msg.rx_len = Comm_Msg.rx_index;
Comm_Msg.rx_index = 0;
Comm_Msg.frameFlag = true;
}
else
{
Comm_Msg.rx_index = 0;
}
}
else
{
Comm_Msg.rx_buf[Comm_Msg.rx_index++] = value;
}
}
break;
}
}
}
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_TC);
if(Comm_Msg.tx_index < (Comm_Msg.tx_len - 1))
{
USART1->DR = Comm_Msg.tx_buf[Comm_Msg.tx_index++];
}
else
{
USART1->DR = Comm_Msg.tx_buf[Comm_Msg.tx_index++];
Comm_Msg.tx_index = 0;
Comm_Msg.tx_len = 0;
USART_ITConfig(USART1, USART_IT_TC, DISABLE);
}
}
}
static void vComm_Task(void *pvParameters)
{
// 接收一帧有效数据,处理接收数据
if(true == Comm_Msg.frameFlag)
{
Comm_Msg.frameFlag = false;
memcpy(Comm_Msg.tx_buf, Comm_Msg.rx_buf, Comm_Msg.rx_len);
Comm_Msg.tx_len = Comm_Msg.rx_len;
Comm_Msg.rx_len = 0;
Comm_Msg.tx_index = 0;
USART1->DR = Comm_Msg.tx_buf[Comm_Msg.tx_index++];
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
}
gpio_trigger(&gpio_handlers[eLED4]);
} |
|