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

217 lines
6.1 KiB
C
Raw Normal View History

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