217 lines
6.1 KiB
C
217 lines
6.1 KiB
C
#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;
|
|
}
|