#include "BeiDouHtyDrv.h" #include "McuBspUart.h" #include "McuBspGPIO.h" #include "McuTaskFlash.h" #include "ZthyToolCheck.h" #include #include #define BEIDOUHTY_RXBUF_LEN 1024 static char gBeiDouHtyRxBuf[BEIDOUHTY_RXBUF_LEN] = {0}; // 能够存放住两帧数据,主要为了容错 static unsigned short gBeiDouHtyRxBufTemp = 0; // 当前接收数据的末期所在位置 static unsigned char gBeiDouHtyRetryCount = 2; // 北斗重发次数 static unsigned char gBeiDouHtyRetryOpenSta = 0; // 北斗模块当前的开关状态 /* 接收函数 */ static void McuDrvBeiDouHtyRecv(unsigned char data); /* 获取BeiDou返回值 */ static int McuDrvBeiDouHtyRead(uint8_t *Buf, uint16_t BufLen); /* 北斗发送 */ static int McuDrvBeiDouHtySendMessage(uint8_t *Buf, uint16_t BufLen); /* 设置保存 */ static int McuDrvBeiDouHtySetSave(void); /* 设置为北斗模式 */ static int McuDrvBeiDouHtySetMode(void); int McuDrvBeiDouHtyInit(void) { /* 初始化串口 */ MCU_BSP_UART_CONF UartConfig = {0}; UartConfig.BaudRate = MCU_DRV_BEIDOU_HTY_UART_BAUDRATE; UartConfig.WordLength = MCU_DRV_BEIDOU_HTY_UART_WORDLEN; UartConfig.StopBits = MCU_DRV_BEIDOU_HTY_UART_STOPBITS; UartConfig.Parity = MCU_DRV_BEIDOU_HTY_UART_PARITY; UartConfig.Mode = MCU_DRV_BEIDOU_HTY_UART_MODE; if (McuBspUartInit(MCU_DRV_BEIDOU_HTY_UART_ID, &UartConfig, NULL, McuDrvBeiDouHtyRecv) < 0) { return -1; } McuBspUartStartRecv(MCU_DRV_BEIDOU_HTY_UART_ID); /* 电源控制 */ McuBspGpioInit(MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PORT, MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PIN, MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_MODE, MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_SPEED, MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PULL, 0, NULL); McuDrvBeiDouHtyClosePower(); HAL_Delay(3000); McuDrvBeiDouHtyOpenPower(); HAL_Delay(5000); /* 设置到北斗模式 */ McuDrvBeiDouHtySetMode(); /* */ return 0; } /* 接收机配置函数 */ int McuDrvBeiDouHtyConfOpposite(char *buf, int buflen) { uint8_t Check; char ConfBuf[64] = {0}; char Rbuf[64] = {0}; sprintf(ConfBuf, "$SET,22,BDS=%s", buf); ZthyToolCheckXor((uint8_t *)(&ConfBuf[1]), strlen(&ConfBuf[1]), &Check); ConfBuf[strlen(ConfBuf)] = '*'; if (((Check & 0xf0) >> 4) >= 10) { ConfBuf[strlen(ConfBuf)] = ((Check & 0xf0) >> 4) + 'A'; } else { ConfBuf[strlen(ConfBuf)] = ((Check & 0xf0) >> 4) + '0'; } if ((Check & 0x0f) >= 10) { ConfBuf[strlen(ConfBuf)] = ((Check & 0xf0) >> 4) + 'A'; } else { ConfBuf[strlen(ConfBuf)] = ((Check & 0xf0) >> 4) + '0'; } ConfBuf[strlen(ConfBuf)] = '\r'; ConfBuf[strlen(ConfBuf)] = '\n'; while (1) { McuDrvBeiDouHtySendMessage((uint8_t *)ConfBuf, strlen(ConfBuf)); HAL_Delay(3000); /* 等待模块返回 */ McuDrvBeiDouHtyRead((uint8_t *)Rbuf, sizeof(Rbuf)); if (strlen(Rbuf) == 0) { continue; } if (strstr(Rbuf, "OK") != NULL && strstr(Rbuf, "BDS SET") != NULL) { /* 设置成功 */ break; } else { continue; } } McuDrvBeiDouHtySetSave(); return 0; } /* 打开电源 */ void McuDrvBeiDouHtyOpenPower(void) { gBeiDouHtyRetryOpenSta = 1; McuBspGpioSetLevel(MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PORT, MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH); HAL_Delay(50); } /* 关闭电源 */ void McuDrvBeiDouHtyClosePower(void) { gBeiDouHtyRetryOpenSta = 0; McuBspGpioSetLevel(MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PORT, MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW); HAL_Delay(50); } /*判断电源模块的当前状态*/ unsigned char McuDrvBeiDouHtyPowerSta(void) { return gBeiDouHtyRetryOpenSta; } /* 北斗发送打包 */ int McuDrvBeiDouHtySendPacket(uint8_t *Buf, uint16_t BufLen) { int i; int j; int k; char Rbuf[BEIDOUHTY_RXBUF_LEN] = {0}; char Txbuf[101] = {0}; if (BufLen >= 100) { BufLen = 100; } for (k = 0; k < BufLen; k++) { Txbuf[2 * k] = (Buf[k] & 0xf0) >> 4; if (Txbuf[2 * k] >= 10) { Txbuf[2 * k] = (Txbuf[2 * k] - 10) + 'A'; } else { Txbuf[2 * k] = '0' + Txbuf[2 * k]; } Txbuf[2 * k + 1] = Buf[k] & 0x0f; if (Txbuf[2 * k + 1] >= 10) { Txbuf[2 * k + 1] = (Txbuf[2 * k + 1] - 10) + 'A'; } else { Txbuf[2 * k + 1] = '0' + Txbuf[2 * k + 1]; } } Txbuf[2 * k] = '\r'; Txbuf[2 * k + 1] = '\n'; k++; for(j = 0; j < gBeiDouHtyRetryCount; j++) { i = 0; McuDrvBeiDouHtySendMessage((uint8_t *)Txbuf, 2 * k); HAL_Delay(70000); while (i < 45) { if (0 > McuDrvBeiDouHtyRead((uint8_t *)Rbuf, sizeof(Rbuf))) { i++; } if (strlen(Rbuf) == 0) { continue; } if (strstr(Rbuf, "ERROR1") != NULL || strstr(Rbuf, "ERROR3") != NULL) { /* 发送失败 */ break; } else if (strstr(Rbuf, "BDS TXD") != NULL && strstr(Rbuf, "OK") != NULL) { return 0; } } } return -1; } /* 设置重发次数 */ int McuDrvBeiDouHtySetRetryCount(uint8_t Count) { if (Count > 3) { return -1; } gBeiDouHtyRetryCount = Count; return 0; } /* 配置保存 */ static int McuDrvBeiDouHtySetSave(void) { char ConfBuf[64] = {0}; char Rbuf[64] = {0}; sprintf(ConfBuf, "$SET,29,SAVE*48\r\n"); while (1) { McuDrvBeiDouHtySendMessage((uint8_t *)ConfBuf, strlen(ConfBuf)); HAL_Delay(3000); McuDrvBeiDouHtyRead((uint8_t *)Rbuf, sizeof(Rbuf)); if (strlen(Rbuf) == 0) { continue; } if (strstr(Rbuf, "OK") != NULL && strstr(Rbuf, "SAVE") != NULL) { break; } else { continue; } } return 0; } /* 设置为北斗模式 */ static int McuDrvBeiDouHtySetMode(void) { char ConfBuf[64] = {0}; char Rbuf[64] = {0}; sprintf(ConfBuf, "$SET,20,MODE=2*4C\r\n"); while (1) { McuDrvBeiDouHtySendMessage((uint8_t *)ConfBuf, strlen(ConfBuf)); HAL_Delay(3000); McuDrvBeiDouHtyRead((uint8_t *)Rbuf, sizeof(Rbuf)); if (strlen(Rbuf) == 0) { continue; } if (strstr(Rbuf, "OK") != NULL && strstr(Rbuf, "MODE SET") != NULL) { /* 设置成功 */ break; } else { continue; } } McuDrvBeiDouHtySetSave(); return 0; } /* 北斗发送 */ static int McuDrvBeiDouHtySendMessage(uint8_t *Buf, uint16_t BufLen) { if (gBeiDouHtyRxBufTemp > 0) { char Rbuf[BEIDOUHTY_RXBUF_LEN] = {0}; McuDrvBeiDouHtyRead((uint8_t *)Rbuf, gBeiDouHtyRxBufTemp); } return McuBspUartSend(MCU_DRV_BEIDOU_HTY_UART_ID, Buf, BufLen); } /* 获取BeiDou返回值 */ static int McuDrvBeiDouHtyRead(uint8_t *Buf, uint16_t BufLen) { int i = 0; while (gBeiDouHtyRxBufTemp < BufLen){ HAL_Delay(10); i++; /* 超时 */ if (i >= 100) { if (gBeiDouHtyRxBufTemp == 0) { return -1; } else { break; } } } for (i = 0; i < gBeiDouHtyRxBufTemp; i++) { Buf[i] = gBeiDouHtyRxBuf[i]; } gBeiDouHtyRxBufTemp = 0; return i; } /* 接收函数 */ static void McuDrvBeiDouHtyRecv(unsigned char data) { if (data == 0) { return; } gBeiDouHtyRxBuf[gBeiDouHtyRxBufTemp] = data; gBeiDouHtyRxBufTemp ++; gBeiDouHtyRxBufTemp = gBeiDouHtyRxBufTemp % BEIDOUHTY_RXBUF_LEN; }