|
@@ -41,7 +41,12 @@
|
|
|
#define LaDarUARTx UART0
|
|
|
#define LaDarUARTx_IRQn UART0_IRQn
|
|
|
|
|
|
-#define RADAR_RX_BUFF_LENGTH 9
|
|
|
+#define RADAR_RX_BUFF_LENGTH 7
|
|
|
+#define RADAR_MAX_BUFFERSIZE 32
|
|
|
+
|
|
|
+#define RadarCmd_NULL (0)
|
|
|
+#define RadarCmd_AirHeight (1)
|
|
|
+#define RadarCmd_Trans (2)
|
|
|
|
|
|
uint8_t g_radarRxDataBuff[RADAR_RX_BUFF_LENGTH];
|
|
|
uint16_t g_radarRxDataIndex;
|
|
@@ -52,15 +57,27 @@ uint16_t g_radarTxDataIndex;
|
|
|
|
|
|
|
|
|
static uint8_t * p_float;
|
|
|
-static float tmp_v;
|
|
|
-static uint16_t _crc = 0;
|
|
|
+//static float tmp_v;
|
|
|
+static int16_t tmp_v;
|
|
|
+//static uint16_t _crc = 0;
|
|
|
+
|
|
|
+static uint8_t recvbuffer_len = 0;
|
|
|
+static uint8_t databuffer_len = 0;
|
|
|
+static uint8_t trans_recvbuffer[RADAR_MAX_BUFFERSIZE] = {0}; //透传指令暂存buffer
|
|
|
+static uint8_t trans_databuffer[RADAR_MAX_BUFFERSIZE] = {0}; //透传回应数据暂存buffer
|
|
|
+
|
|
|
+#define WAITTING_TIMEOUT (100) //单位 ms
|
|
|
+static uint8_t cmd_radar = RadarCmd_NULL;
|
|
|
+uint8_t waiting_time_ladar =0; //等待数据时间, ms
|
|
|
|
|
|
|
|
|
static float airHeight = 0;
|
|
|
static uint8_t _status = 0;
|
|
|
|
|
|
|
|
|
-uint8_t radar_cmd[8] = {0x7F, 0x04, 0x0A, 0x0F, 0x00, 0x02, 0x48, 0x0E};
|
|
|
+
|
|
|
+//uint8_t radar_cmd[8] = {0x7F, 0x04, 0x0A, 0x0F, 0x00, 0x02, 0x48, 0x0E};
|
|
|
+uint8_t radar_cmd[8] = {0xFF, 0x03, 0x00, 0x01, 0x00, 0x01, 0xC0, 0x14};
|
|
|
//static uint8_t radar_cmd[32];
|
|
|
//uint8_t
|
|
|
|
|
@@ -81,51 +98,58 @@ static int TransmitData(uint8_t *pdata, uint16_t length);
|
|
|
static void UartEventCallback(void *device, uint32_t wpara, uint32_t lpara)
|
|
|
{
|
|
|
uint8_t data = 0;
|
|
|
+ uint16_t _crc = 0;
|
|
|
UART_Type *uart_Device = (UART_Type *)device;
|
|
|
|
|
|
/*rx interrupt*/
|
|
|
if ((uart_Device->IER & UART_IER_ERXNE_Msk) && (wpara & UART_LSR0_DR_Msk))
|
|
|
{
|
|
|
- data = uart_Device->RBR;
|
|
|
- g_radarRxDataBuff[g_radarRxDataIndex++] = data;
|
|
|
-
|
|
|
- if (g_radarRxDataIndex >= RADAR_RX_BUFF_LENGTH)
|
|
|
- {
|
|
|
- g_radarRxDataIndex = 0;
|
|
|
- _crc = crc16(g_radarRxDataBuff, 7);
|
|
|
-
|
|
|
- if( _crc == (((uint16_t)g_radarRxDataBuff[7]<<8) | g_radarRxDataBuff[8])){
|
|
|
+ data = uart_Device->RBR;
|
|
|
+ waiting_time_ladar =0;
|
|
|
+
|
|
|
+ if(RadarCmd_AirHeight == cmd_radar){
|
|
|
+ g_radarRxDataBuff[g_radarRxDataIndex++] = data;
|
|
|
+ if (g_radarRxDataIndex >= RADAR_RX_BUFF_LENGTH)
|
|
|
+ {
|
|
|
+ g_radarRxDataIndex = 0;
|
|
|
+ _crc = crc16(g_radarRxDataBuff, RADAR_RX_BUFF_LENGTH-2);
|
|
|
|
|
|
- if((g_radarRxDataBuff[3] == 0xFF)&&(g_radarRxDataBuff[4] == 0xFF)&&(g_radarRxDataBuff[5] == 0xFF)&&(g_radarRxDataBuff[6] == 0xFF)){
|
|
|
- _status = STATUS_EXCEED;
|
|
|
- airHeight = 0;
|
|
|
- }else if((g_radarRxDataBuff[3] == 0xFE)&&(g_radarRxDataBuff[4] == 0xFE)&&(g_radarRxDataBuff[5] == 0xFE)&&(g_radarRxDataBuff[6] == 0xFE)){
|
|
|
- _status = STATUS_BLIND;
|
|
|
- airHeight = 0;
|
|
|
- }else if((g_radarRxDataBuff[3] == 0xFD)&&(g_radarRxDataBuff[4] == 0xFD)&&(g_radarRxDataBuff[5] == 0xFD)&&(g_radarRxDataBuff[6] == 0xFD)){
|
|
|
- _status = STATUS_WEAK;
|
|
|
- airHeight = 0;
|
|
|
- }else{
|
|
|
- _status = STATUS_NORMAL;
|
|
|
- p_float = (uint8_t*)&tmp_v;
|
|
|
+ if( _crc == (((uint16_t)g_radarRxDataBuff[5]<<8) | g_radarRxDataBuff[6])){
|
|
|
+ _status = STATUS_NORMAL;
|
|
|
+ tmp_v = (int16_t)(g_radarRxDataBuff[3]<<8)|g_radarRxDataBuff[4];
|
|
|
+ airHeight = tmp_v/1000.0;
|
|
|
|
|
|
- p_float[0] = g_radarRxDataBuff[4];
|
|
|
- p_float[1] = g_radarRxDataBuff[3];
|
|
|
- p_float[2] = g_radarRxDataBuff[6];
|
|
|
- p_float[3] = g_radarRxDataBuff[5];
|
|
|
+ }else{
|
|
|
+ _status = STATUS_DataError;
|
|
|
+ airHeight = 0.0;
|
|
|
+ }
|
|
|
|
|
|
- airHeight = tmp_v;
|
|
|
+ //读空高命令结束
|
|
|
+ cmd_radar = RadarCmd_NULL;
|
|
|
|
|
|
- }
|
|
|
-
|
|
|
+// ladar_printfLen = snprintf((char*)ladar_printfBuff, 64, "Radar st[%d], airheight: %f m [%x][%x][%x][%x][%x][%x][%x]\r\n",
|
|
|
+// _status, airHeight,
|
|
|
+// g_radarRxDataBuff[0],
|
|
|
+// g_radarRxDataBuff[1],
|
|
|
+// g_radarRxDataBuff[2],
|
|
|
+// g_radarRxDataBuff[3],
|
|
|
+// g_radarRxDataBuff[4],
|
|
|
+// g_radarRxDataBuff[5],
|
|
|
+// g_radarRxDataBuff[6]);
|
|
|
+// rs485_TransmitData((uint8_t*)ladar_printfBuff, ladar_printfLen);
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
+ }else if(RadarCmd_Trans == cmd_radar){
|
|
|
+
|
|
|
+ if(databuffer_len < RADAR_MAX_BUFFERSIZE){
|
|
|
+ trans_databuffer[databuffer_len++]=data;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-// ladar_printfLen = snprintf((char*)ladar_printfBuff, 64, "Radar[%d] airheight: %f m\r\n",_status, airHeight);
|
|
|
-// rs485_TransmitData((uint8_t*)ladar_printfBuff, ladar_printfLen);
|
|
|
-
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/*tx interrupt*/
|
|
@@ -151,7 +175,7 @@ static void uart0_Initialize(void)
|
|
|
{
|
|
|
UART_ConfigType uartConfig = {0};
|
|
|
|
|
|
- uartConfig.baudrate = 9600;
|
|
|
+ uartConfig.baudrate = 115200;
|
|
|
uartConfig.dataBits = UART_WORD_LEN_8BIT;
|
|
|
uartConfig.stopBits = UART_STOP_1BIT;
|
|
|
uartConfig.parity = UART_PARI_NO;
|
|
@@ -188,21 +212,10 @@ int TransmitData(uint8_t *pdata, uint16_t length)
|
|
|
g_radarTxDataIndex = 0;
|
|
|
UART_SetTXEInterrupt(LaDarUARTx, ENABLE);
|
|
|
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-//static void set_collectfreq(uint16_t interval){
|
|
|
-// uint16_t len = 0;
|
|
|
-// len = (uint16_t)snprintf((char*)radar_cmd, 32, "AT+COLLECTFREQ=%d\n", interval);
|
|
|
-// TransmitData(radar_cmd, len);
|
|
|
-//}
|
|
|
-
|
|
|
-//static void read_airheight(){
|
|
|
-// uint16_t len = 0;
|
|
|
-// len = (uint16_t)snprintf((char*)radar_cmd, 32, "AT+REALAIRHEIGHT\n");
|
|
|
-// TransmitData(radar_cmd, len);
|
|
|
-//}
|
|
|
-
|
|
|
|
|
|
void Radar_Init(void)
|
|
|
{
|
|
@@ -213,14 +226,117 @@ void Radar_Init(void)
|
|
|
|
|
|
}
|
|
|
|
|
|
-uint8_t Radar_MR(void)
|
|
|
+//uint8_t Radar_ReadAirHeight(void)
|
|
|
+//{
|
|
|
+//// uint16_t crc = 0;
|
|
|
+////
|
|
|
+//// //清空、接收缓冲
|
|
|
+//// g_radarRxDataIndex = 0;
|
|
|
+
|
|
|
+//// radar_cmd[0] = 0xFF,
|
|
|
+//// radar_cmd[1] = 0x03,
|
|
|
+//// radar_cmd[2] = 0x00,
|
|
|
+//// radar_cmd[3] = 0x01,
|
|
|
+//// radar_cmd[4] = 0x00,
|
|
|
+//// radar_cmd[5] = 0x01,
|
|
|
+
|
|
|
+//// crc = crc16(radar_cmd, 6);
|
|
|
+//// radar_cmd[6] = (uint8_t)((crc>>8) & 0x00ff);
|
|
|
+//// radar_cmd[7] = (uint8_t)(crc & 0x00ff);
|
|
|
+//
|
|
|
+// TransmitData(radar_cmd, 8);
|
|
|
+
|
|
|
+// return 0;
|
|
|
+//}
|
|
|
+
|
|
|
+void Radar_CheckResponse(void)
|
|
|
+{
|
|
|
+ if(RadarCmd_NULL != cmd_radar){
|
|
|
+ if(waiting_time_ladar >= WAITTING_TIMEOUT){
|
|
|
+ //通信命令结束
|
|
|
+ cmd_radar = RadarCmd_NULL;
|
|
|
+
|
|
|
+ if(RadarCmd_AirHeight == cmd_radar){
|
|
|
+ _status = STATUS_NoResponse;
|
|
|
+ airHeight = 0.0;
|
|
|
+ g_radarRxDataIndex = 0;
|
|
|
+
|
|
|
+// ladar_printfLen = snprintf((char*)ladar_printfBuff, 64, "Radar_CheckResponse st[%d], airheight: %f m \r\n", _status, airHeight);
|
|
|
+// rs485_TransmitData((uint8_t*)ladar_printfBuff, ladar_printfLen);
|
|
|
+
|
|
|
+ }else {
|
|
|
+ recvbuffer_len = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void Radar_SendRequest(void)
|
|
|
+{
|
|
|
+ if(RadarCmd_NULL != cmd_radar){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(recvbuffer_len > 0){
|
|
|
+ //有透传数据需要发送
|
|
|
+ cmd_radar = RadarCmd_Trans;
|
|
|
+ TransmitData(trans_recvbuffer, recvbuffer_len);
|
|
|
+ waiting_time_ladar = 0;
|
|
|
+ //清空接收缓存
|
|
|
+ databuffer_len=0;
|
|
|
+ memset(trans_databuffer, 0, RADAR_MAX_BUFFERSIZE);
|
|
|
+
|
|
|
+ }else{
|
|
|
+ //读取空高数据
|
|
|
+ cmd_radar = RadarCmd_AirHeight;
|
|
|
+ TransmitData(radar_cmd, 8);
|
|
|
+ waiting_time_ladar = 0;
|
|
|
+ g_radarRxDataIndex = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void Radar_SendData(uint8_t* pData, uint8_t data_len)
|
|
|
{
|
|
|
- //清空、接收缓冲
|
|
|
- g_radarRxDataIndex = 0;
|
|
|
- TransmitData(radar_cmd, 8);
|
|
|
+ if(data_len > RADAR_MAX_BUFFERSIZE){
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(RadarCmd_Trans == cmd_radar){ //上一个透传指令还没结束
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ memcpy(trans_recvbuffer, pData, data_len);
|
|
|
+ recvbuffer_len = data_len;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void Radar_ReadData(uint8_t* pBuffer, uint8_t read_len)
|
|
|
+{
|
|
|
+ if(read_len > RADAR_MAX_BUFFERSIZE){
|
|
|
+ read_len = RADAR_MAX_BUFFERSIZE;
|
|
|
+ }
|
|
|
+
|
|
|
+ memcpy(pBuffer, trans_databuffer, read_len);
|
|
|
+
|
|
|
+ //清空接收缓存
|
|
|
+ databuffer_len=0;
|
|
|
+ memset(trans_databuffer, 0, RADAR_MAX_BUFFERSIZE);
|
|
|
|
|
|
- return 0;
|
|
|
}
|
|
|
+
|
|
|
+//uint8_t Radar_SetInstallHeight(uint16_t install_height)
|
|
|
+//{
|
|
|
+// //清空、接收缓冲
|
|
|
+// g_radarRxDataIndex = 0;
|
|
|
+// TransmitData(radar_cmd, 8);
|
|
|
+//
|
|
|
+// return 0;
|
|
|
+//}
|
|
|
+
|
|
|
+
|
|
|
uint8_t Radar_GetHeight(float* height)
|
|
|
{
|
|
|
*height = airHeight;
|