20230731_XiaoFuZi_emb/ZheDaXiaoFuZi/Src/Usr/Driver/Ldrv/BeiDouHTY/BeiDouHtyDrv.c

269 lines
7.6 KiB
C
Raw Normal View History

#include "BeiDouHtyDrv.h"
#include "McuBspUart.h"
#include "McuBspGPIO.h"
#include "McuTaskFlash.h"
#include "ZthyToolCheck.h"
#include <stdio.h>
#include <string.h>
#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;
}