V1.0
This commit is contained in:
@@ -0,0 +1,232 @@
|
||||
#include "uart.h"
|
||||
#include "xc_hal.h"
|
||||
#include "check.h"
|
||||
|
||||
|
||||
#define RAD_HEAD1 0xFA
|
||||
#define RAD_HEAD2 0x3C
|
||||
#define RAD_REAR1 0x3D
|
||||
#define RAD_REAR2 0xFB
|
||||
|
||||
#define TEST_HEAD1 0x2B
|
||||
#define TEST_HEAD2 0x2B
|
||||
#define TEST_REAR1 0xE4
|
||||
#define TEST_REAR2 0xC7
|
||||
|
||||
//数据协议类型
|
||||
#define TYPE_RAD 1
|
||||
#define TYPE_TEST 2
|
||||
|
||||
uint8_t port_txbuff[40] = {0};
|
||||
uint8_t port_rxdata[32] = {0};
|
||||
|
||||
volatile uint8_t rxcnt = 0;
|
||||
volatile uint8_t rxstat = 0;
|
||||
volatile uint8_t rxtype = 0;
|
||||
volatile uint8_t rxflag = 0;
|
||||
volatile uint8_t rxwait = 0;
|
||||
volatile uint8_t radar_wait = 0;
|
||||
|
||||
void uart_tick(void)
|
||||
{
|
||||
if(rxwait > 0 && --rxwait == 0)
|
||||
{
|
||||
rxstat = 0;
|
||||
}
|
||||
if(radar_wait > 0)
|
||||
{
|
||||
radar_wait--;
|
||||
}
|
||||
}
|
||||
|
||||
//端口接收中断
|
||||
void uart_rxbyte(uint8_t byte)
|
||||
{
|
||||
switch(rxstat)
|
||||
{
|
||||
case 0: //接收帧头1
|
||||
if(byte == RAD_HEAD1)
|
||||
{
|
||||
rxtype = TYPE_RAD;
|
||||
rxstat = 1;
|
||||
}
|
||||
else if(byte == TEST_HEAD1)
|
||||
{
|
||||
rxtype = TYPE_TEST;
|
||||
rxstat = 11;
|
||||
}
|
||||
break;
|
||||
case 1: //接收帧头2
|
||||
rxstat = (byte==RAD_HEAD2) ? 2 : 0;
|
||||
break;
|
||||
case 2:
|
||||
port_rxdata[0] = byte;
|
||||
rxstat = 3;
|
||||
break;
|
||||
case 3:
|
||||
rxstat = (byte==0) ? 4 : 0;
|
||||
break;
|
||||
case 4:
|
||||
rxcnt = 0;
|
||||
port_rxdata[1] = byte;
|
||||
rxstat = (byte!=0)?5:6;
|
||||
break;
|
||||
case 5:
|
||||
port_rxdata[2+rxcnt] = byte;
|
||||
if(++rxcnt >= port_rxdata[1] || rxcnt >= 30)
|
||||
{
|
||||
rxstat = 6;
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
rxstat = 7;
|
||||
break;
|
||||
case 7:
|
||||
rxstat = (byte==RAD_REAR1) ? 8 : 0;
|
||||
break;
|
||||
case 8:
|
||||
if(byte == RAD_REAR2)
|
||||
{
|
||||
rxflag = 1;
|
||||
}
|
||||
rxstat = 0;
|
||||
break;
|
||||
case 11:
|
||||
rxstat = (byte==TEST_HEAD2) ? 12 : 0;
|
||||
break;
|
||||
case 12:
|
||||
port_rxdata[0] = byte;
|
||||
rxstat = 13;
|
||||
break;
|
||||
case 13:
|
||||
rxcnt = 0;
|
||||
port_rxdata[1] = byte;
|
||||
rxstat = (byte!=0)?14:15;
|
||||
break;
|
||||
case 14:
|
||||
port_rxdata[2+rxcnt] = byte;
|
||||
if(++rxcnt >= port_rxdata[1])
|
||||
{
|
||||
rxstat = 15;
|
||||
}
|
||||
break;
|
||||
case 15:
|
||||
rxstat = (byte==TEST_REAR1) ? 16 : 0;
|
||||
break;
|
||||
case 16:
|
||||
if(byte == TEST_REAR2)
|
||||
{
|
||||
rxflag = 1;
|
||||
}
|
||||
rxstat = 0;
|
||||
break;
|
||||
}
|
||||
rxwait = 10;
|
||||
}
|
||||
|
||||
void uart_send(uint8_t *pdata, uint8_t type)
|
||||
{
|
||||
uint8_t txcnt = 0;
|
||||
|
||||
rxflag = 0;
|
||||
if(type == TYPE_RAD)
|
||||
{
|
||||
port_txbuff[txcnt++] = RAD_HEAD1;
|
||||
port_txbuff[txcnt++] = RAD_HEAD2;
|
||||
port_txbuff[txcnt++] = pdata[0];
|
||||
port_txbuff[txcnt++] = 0x00;
|
||||
port_txbuff[txcnt++] = pdata[1];
|
||||
for(uint8_t i = 0; i < pdata[1]; i++)
|
||||
{
|
||||
port_txbuff[txcnt++] = pdata[2+i];
|
||||
}
|
||||
port_txbuff[txcnt++] = CRC8_SAE(port_txbuff+2, pdata[1]+3);
|
||||
port_txbuff[txcnt++] = RAD_REAR1;
|
||||
port_txbuff[txcnt++] = RAD_REAR2;
|
||||
}
|
||||
else if(type == TYPE_TEST)
|
||||
{
|
||||
port_txbuff[txcnt++] = TEST_HEAD1;
|
||||
port_txbuff[txcnt++] = TEST_HEAD2;
|
||||
port_txbuff[txcnt++] = pdata[0];
|
||||
port_txbuff[txcnt++] = pdata[1];
|
||||
for(uint8_t i = 0; i < pdata[1]; i++)
|
||||
{
|
||||
port_txbuff[txcnt++] = pdata[2+i];
|
||||
}
|
||||
port_txbuff[txcnt++] = TEST_REAR1;
|
||||
port_txbuff[txcnt++] = TEST_REAR2;
|
||||
}
|
||||
hal_uart_send(port_txbuff, txcnt);
|
||||
}
|
||||
|
||||
uint8_t radcmd_map[] = {0x11, 0x12, 0xB3, 0x14, 0x15, 0x16, 0x17};
|
||||
uint8_t tstcmd_map[] = {0x01, 0x02, 0x03};
|
||||
|
||||
static uint8_t check_radcmd(uint8_t cmd)
|
||||
{
|
||||
for(uint8_t i = 0; i < sizeof(radcmd_map); i++)
|
||||
{
|
||||
if(cmd == radcmd_map[i])
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint8_t check_tstcmd(uint8_t cmd)
|
||||
{
|
||||
for(uint8_t i = 0; i < sizeof(tstcmd_map); i++)
|
||||
{
|
||||
if(cmd == tstcmd_map[i])
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void uart_recv(void (*func)(uint8_t *, uint8_t))
|
||||
{
|
||||
if(rxflag != 0)
|
||||
{
|
||||
rxflag = 0;
|
||||
if(rxtype == TYPE_RAD && check_radcmd(port_rxdata[0]))
|
||||
{
|
||||
(*func)(port_rxdata, rxtype);
|
||||
if(port_rxdata[0] != 0x12)
|
||||
{
|
||||
uart_send(port_rxdata, TYPE_RAD);
|
||||
}
|
||||
}
|
||||
if(rxtype == TYPE_TEST && check_tstcmd(port_rxdata[0]))
|
||||
{
|
||||
(*func)(port_rxdata, rxtype);
|
||||
uart_send(port_rxdata, TYPE_TEST);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t uart_trx(uint8_t *txdata, uint8_t *rxdata)
|
||||
{
|
||||
uart_send(txdata, TYPE_RAD);
|
||||
|
||||
rxflag = 0;
|
||||
rxtype = 0;
|
||||
radar_wait = 200;
|
||||
while(radar_wait != 0)
|
||||
{
|
||||
if((rxflag != 0) && (rxtype == TYPE_RAD))
|
||||
{
|
||||
rxflag = 0;
|
||||
for(int i = 0; i < port_rxdata[1]+2; i++)
|
||||
{
|
||||
rxdata[i] = port_rxdata[i];
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
//rxflag = 0;
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user