|
|
@@ -94,11 +94,77 @@ void SYStick_INT(void) interrupt 10
|
|
|
*/
|
|
|
void COM1_INT_Handler(void) interrupt 13
|
|
|
{
|
|
|
+ static uint8_t recv_index = 0;
|
|
|
+ uint8_t byte = 0x00, expected_len = 0;
|
|
|
+ uint16_t dataLen = 0x00;
|
|
|
+
|
|
|
if (TI)
|
|
|
{ TI = 0; }
|
|
|
|
|
|
if (RI)
|
|
|
- { RI = 0; }
|
|
|
+ {
|
|
|
+ byte = UT_DR;
|
|
|
+ RI = 0;
|
|
|
+ #if (CONTROL_MODE == UARTMODE)
|
|
|
+ {
|
|
|
+ // 安全写入检查
|
|
|
+ if (recv_index >= MAX_FRAME_LEN)
|
|
|
+ {
|
|
|
+ recv_index = 0;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 状态机处理
|
|
|
+ // 阶段1:等待帧头
|
|
|
+ if (recv_index == 0)
|
|
|
+ {
|
|
|
+ if (byte == FRAME_HEADER)
|
|
|
+ { RecvBuffer[recv_index++] = byte; }
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 阶段2:接收功能码和长度
|
|
|
+ if (recv_index < DATA_OFFSET)
|
|
|
+ {
|
|
|
+ RecvBuffer[recv_index++] = byte;
|
|
|
+
|
|
|
+ // 校验长度字段有效性
|
|
|
+ if (recv_index == DATA_OFFSET)
|
|
|
+ {
|
|
|
+ dataLen = ((uint16_t)RecvBuffer[5] << 8) | RecvBuffer[4];
|
|
|
+
|
|
|
+ // 检查长度字节
|
|
|
+ if (dataLen > (MAX_FRAME_LEN - DATA_OFFSET - CRC_OFFSET))
|
|
|
+ { recv_index = 0; }
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 阶段3:接收数据区
|
|
|
+ dataLen = ((uint16_t)RecvBuffer[5] << 8) | RecvBuffer[4];
|
|
|
+ expected_len = DATA_OFFSET + dataLen + CRC_OFFSET;
|
|
|
+
|
|
|
+ if (recv_index < expected_len)
|
|
|
+ {
|
|
|
+ RecvBuffer[recv_index++] = byte;
|
|
|
+
|
|
|
+ // 完整帧接收完成
|
|
|
+ if (recv_index == expected_len)
|
|
|
+ {
|
|
|
+ RecMessageFalg = true;
|
|
|
+ recv_index = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 异常情况复位
|
|
|
+ recv_index = 0;
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -124,7 +190,7 @@ void DAM_INT_Handler(void) interrupt 15
|
|
|
{
|
|
|
if (ReadBit(DMA0_CR0, DMAIF))
|
|
|
{
|
|
|
- memset(&DebugDat, 0, 64);
|
|
|
+ memset(&DebugDat, 0, MAX_FRAME_LEN);
|
|
|
ClrBit(DMA0_CR0, DMAIF);
|
|
|
}
|
|
|
|