本文是对 ATGM336H-5N GNSS模块的发送功能实现,已经验证过功能,供大家参考
配置的目标:
- 只使用北斗定位;
- 只接收RMC类型的数据帧
说明:
- 使用芯片为 STMF103C8T6芯片
- 使用芯片为了 杭州中科微电子有限公司 的因此发送的属于私有协议内容,不能套用在其它公司的GNSS模块上。
- 原理是相同的;
文档说明
配置发送帧使用CAS03标识:
设置更新频率使用GAS02标识:
配置使用的定位系统使用CAS04标识:
代码实现
宏定义
#define USARTx USART3
#define USARTx_CLK_ENABLE() RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE)
#define USARTx_TX_GPIO_CLK_ENABLE() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)
#define USARTx_TX_GPIO_PORT GPIOB
#define USARTx_TX_PIN GPIO_Pin_10
#define USARTx_RX_GPIO_CLK_ENABLE() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)
#define USARTx_RX_GPIO_PORT GPIOB
#define USARTx_RX_PIN GPIO_Pin_11
#define USARTx_IRQn USART3_IRQn
#define USARTx_IRQHanlder USART3_IRQHandler
发送函数
void GPS_SendBuffer(char *str, uint8_t len)
{
uint8_t i;
for (i = 0; i < len; ++i)
{
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, str[i]);
}
}
GPS配置
/*
* 消息接收控制,0表示不接收,1~9表示每秒接收几次
*/
#define nGGA 0
#define nGLL 0
#define nGSA 0
#define nGSV 0
#define nRMC 1
#define nVTG 0
#define nZDA 0
#define nANT 0
#define nDHV 0
#define nLPS 0
#define nUTC 0
#define nGST 0
#define nTIM 0
#define PCAS02 0
#define PCAS03 1
#define PCAS04 2
#define PCALEN PCAS04 + 1
uint8_t CheckSum(uint8_t *data, uint8_t length);
void GPS_Config(void)
{
static char *initStr[] = {
"$PCAS02,1000*%X\r\n", /* 设置发送频率为每秒一次 */
"$PCAS03,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,,,%d,%d,,,,%d*%s\r\n", /* 设置接收消息的类型 */
"$PCAS04,2*%X\r\n", /* 仅使用北斗定位 */
};
uint8_t i;
uint8_t strLen = 0, checkSum = 0;
char sendStr1[70] = {0};
char sendStr2[70] = {0};
for (i = 0; i < PCALEN; ++i)
{
switch (i)
{
case PCAS03:
sprintf(sendStr1, initStr[i], nGGA, nGLL, nGSA, nGSV, nRMC, nVTG, nZDA, nANT, nDHV, nLPS, nUTC, nGST, nTIM, "%X");
checkSum = CheckSum(sendStr1 + 1, strlen(sendStr1) - 6);
sprintf(sendStr2, sendStr1, checkSum);
break;
default:
checkSum = CheckSum(initStr[i] + 1, strlen(initStr[i]) - 6);
sprintf(sendStr2, initStr[i], checkSum);
break;
}
GPS_SendBuffer(sendStr2, strlen(sendStr2));
}
}
uint8_t CheckSum(uint8_t *data, uint8_t length)
{
uint8_t usBcc = 0; // Initial value
while(length--)
{
usBcc ^= *data++;
}
return usBcc;
}
其它省略实现省略。最后效果如下: