287 lines
8.0 KiB
C
287 lines
8.0 KiB
C
#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 = 1; // 北斗重发次数
|
|
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, NULL) < 0) {
|
|
return -1;
|
|
}
|
|
|
|
/* 设置接收函数 */
|
|
McuDrvBeiDouHtySetRecv();
|
|
/* 设置接收 */
|
|
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;
|
|
return -1;
|
|
}
|
|
if (strstr(Rbuf, "OK") != NULL && strstr(Rbuf, "BDS SET") != NULL) {
|
|
/* 设置成功 */
|
|
break;
|
|
} else {
|
|
//continue;
|
|
return -1;
|
|
}
|
|
}
|
|
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;
|
|
int h;
|
|
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);
|
|
for (h = 0; h < 70; h++) {
|
|
HAL_Delay(1000);
|
|
}
|
|
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;
|
|
}
|
|
|
|
/* 设置北斗接收 */
|
|
void McuDrvBeiDouHtySetRecv(void)
|
|
{
|
|
McuBspUartSetRecvCallback(MCU_DRV_BEIDOU_HTY_UART_ID, McuDrvBeiDouHtyRecv);
|
|
}
|
|
|
|
/* 配置保存 */
|
|
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;
|
|
return -1;
|
|
}
|
|
if (strstr(Rbuf, "OK") != NULL && strstr(Rbuf, "SAVE") != NULL) {
|
|
break;
|
|
} else {
|
|
//continue;
|
|
return -1;
|
|
}
|
|
}
|
|
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;
|
|
return -1;
|
|
}
|
|
if (strstr(Rbuf, "OK") != NULL && strstr(Rbuf, "MODE SET") != NULL) {
|
|
/* 设置成功 */
|
|
break;
|
|
} else {
|
|
//continue;
|
|
return -1;
|
|
}
|
|
}
|
|
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;
|
|
}
|