#include "BeiDouHtyDrv.h" #include "McuBspUart.h" #include "McuBspGPIO.h" #include #include #define BEIDOUHTY_RXBUF_LEN 60 static char gBeiDouHtyRxBuf[BEIDOUHTY_RXBUF_LEN] = {0}; // 能够存放住两帧数据,主要为了容错 static unsigned char gBeiDouHtyRxBufTemp = 0; // 当前接收数据的末期所在位置 static unsigned char gBeiDouHtyRetryCount = 1; // 北斗重发次数 /* 接收函数 */ 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); 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); McuBspGpioSetLevel(MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PORT, MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW); return 0; } /* 接收机配置函数 */ int McuDrvBeiDouHtyConfOpposite(char *buf, int buflen) { uint8_t Sum; unsigned int i; uint8_t Check; char ConfBuf[64] = {0}; char Rbuf[64] = {0}; sprintf(ConfBuf, "SET,22,BDS=%s", buf); ConfBuf[strlen(ConfBuf)] = '*'; for (i = 0; i < strlen(ConfBuf) - 1; i++) { Sum = Sum + ConfBuf[i]; } Check = (Sum & 0xf0) >> 4; if (Check >= 10) { Check = (Check - 10) + 'A'; } else { Check = '0' + Check; } ConfBuf[strlen(ConfBuf)] = Check; Check = Sum & 0x0f; if (Check >= 10) { Check = (Check - 10) + 'A'; } else { Check = '0' + Check; } ConfBuf[strlen(ConfBuf)] = Check; ConfBuf[strlen(ConfBuf)] = '\r'; ConfBuf[strlen(ConfBuf)] = '\n'; McuDrvBeiDouHtySendMessage((uint8_t *)ConfBuf, strlen(ConfBuf)); /* 等待模块返回 */ i = 0; while (i < 2) { McuDrvBeiDouHtyRead((uint8_t *)Rbuf, sizeof(Rbuf)); i++; } if (strlen(Rbuf) == 0) { return -1; } if (strstr(Rbuf, "OK") != NULL && strstr(Rbuf, "BDS SET") != NULL) { /* 设置成功 */ } else { return -1; } /* 进行配置保存 */ memset(ConfBuf, 0, sizeof(ConfBuf)); memset(Rbuf, 0, sizeof(Rbuf)); sprintf(ConfBuf, "SET,29,SAVE*48\r\n"); McuDrvBeiDouHtySendMessage((uint8_t *)ConfBuf, strlen(ConfBuf)); /* 等待模块返回 */ i = 0; while (i < 2) { McuDrvBeiDouHtyRead((uint8_t *)Rbuf, sizeof(Rbuf)); i++; } if (strlen(Rbuf) == 0) { return -1; } if (strstr(Rbuf, "OK") != NULL && strstr(Rbuf, "SAVE") != NULL) { /* 设置成功 */ } else { return -1; } return 0; } /* 打开电源 */ void McuDrvBeiDouHtyOpenPower(void) { McuBspGpioSetLevel(MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PORT, MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PIN, MCU_BSP_GPIO_OUT_HIGH); } /* 关闭电源 */ void McuDrvBeiDouHtyClosePower(void) { McuBspGpioSetLevel(MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PORT, MCU_DRV_BEIDOU_HTY_CTRL_POWER_GPIO_PIN, MCU_BSP_GPIO_OUT_LOW); } /* 北斗发送打包 */ int McuDrvBeiDouHtySendPacket(uint8_t *Buf, uint16_t BufLen) { int i; int j; int k; char Rbuf[64] = {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]; } } for(j = 0; j < gBeiDouHtyRetryCount; j++) { i = 0; McuDrvBeiDouHtySendMessage((uint8_t *)Txbuf, 2 * k); while (i >= 45) { if (0 > McuDrvBeiDouHtyRead((uint8_t *)Rbuf, sizeof(Rbuf))) { i++; } if (strlen(Rbuf) == 0) { return -1; } if (strstr(Rbuf, "ERROR1") != NULL || strstr(Rbuf, "ERROR3") != NULL) { /* 发送失败 */ break; } else if (strstr(Rbuf, "BDS TXD\r\nOK") != NULL) { return 0; } } } return -1; } /* 设置重发次数 */ int McuDrvBeiDouHtySetRetryCount(uint8_t Count) { if (Count > 3) { return -1; } gBeiDouHtyRetryCount = Count; return 0; } /* 北斗发送 */ static int McuDrvBeiDouHtySendMessage(uint8_t *Buf, uint16_t BufLen) { gBeiDouHtyRxBufTemp = 0; //发送前清空接收 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 >= 200) { 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) { gBeiDouHtyRxBuf[gBeiDouHtyRxBufTemp] = data; gBeiDouHtyRxBufTemp ++; gBeiDouHtyRxBufTemp = gBeiDouHtyRxBufTemp % BEIDOUHTY_RXBUF_LEN; }