1.立项
本来我提交的试用项目是农业大棚传感器数据无线化,但是农业大棚项目内有温湿度数据,有坛友已经实现,我要是在做一个同样的,有重复之嫌,遂拿出另外一个Idea来实现,这个Ideal主要是为了实现无人机野外飞丢找寻,本人本身是一个飞友。现在某宝上是基于4G来实现。4G使用时需要流量卡支持,需要额外掏一笔流量费。其次如果在4G信号覆盖不了的地方飞丢,这玩意就失去了作用,我要实现一个基于Sub-1G无线方案的,在任何地方飞丢都可以找到你的无人机。

2.准备材料
TKB-620开发板*2
Ulox neo-7n8*1 ,支持nmea-183输出,使用$GPRMC定位信息
3.代码实现
GPS模块使用开发板上STM32F103RC的UART5接口(对应开发板上的J18),注意此接口不支持DMA。

串口配置和GPS数据解析如下:
`
static uint8_t gpsUartDmaRxBuf[GPS_DMA_RX_BUF_SIZE];
uint16_t point1 = 0;
GpsData_t gpsData;
void parseGpsBuffer(void);
void errorLog(int num);
void GPSUartInit(uint32_t baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
USART_DeInit(UART5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(UART5, &USART_InitStructure);
USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
memset(gpsUartDmaRxBuf, 0, GPS_DMA_RX_BUF_SIZE);
point1 = 0;
USART_Cmd(UART5, ENABLE);
}
void parseGpsBuffer()
{
char *subString;
char *subStringNext;
char i = 0;
char usefullBuffer[2];
double temp;
if (gpsData.isGetData)
{
gpsData.isGetData = false;
for (i = 0 ; i <= 6 ; i++)
{
if (i == 0)
{
if ((subString = strstr(gpsData.GPS_Buffer, ",")) == NULL)
{
errorLog(1);
}
}
else
{
subString++;
if ((subStringNext = strstr(subString, ",")) != NULL)
{
switch(i)
{
case 1:
memcpy(gpsData.UTCTime, subString, subStringNext - subString);
break;
case 2:
memcpy(usefullBuffer, subString, subStringNext - subString);
break;
case 3:
memcpy(gpsData.latitude, subString, subStringNext - subString);
temp = atof(gpsData.latitude);
gpsData.dLatitude = nmea_ndeg2degree(temp);
sprintf(gpsData.latitude,"%.3f",gpsData.dLatitude);
break;
case 4:
memcpy(gpsData.N_S, subString, subStringNext - subString);
break;
case 5:
memcpy(gpsData.longitude, subString, subStringNext - subString);
temp = atof(gpsData.longitude);
gpsData.dLongitude = nmea_ndeg2degree(temp);
sprintf(gpsData.longitude,"%.3f",gpsData.dLongitude);
break;
case 6:
memcpy(gpsData.E_W, subString, subStringNext - subString);
break;
default:
break;
}
subString = subStringNext;
gpsData.isParseData = true;
if(usefullBuffer[0] == 'A')
{
gpsData.isUsefull = true;
}
else if(usefullBuffer[0] == 'V')
{
gpsData.isUsefull = false;
break;
}
}
else
{
errorLog(2);
}
}
}
}
}
void errorLog(int num)
{
printf("ERROR%d\\\\r\\\\n",num);
}
void UART5_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)
{
Res =UART5->DR;
if(Res == '$')
{
point1 = 0;
}
gpsUartDmaRxBuf[point1++] = Res;
if(gpsUartDmaRxBuf[0] == '$' && gpsUartDmaRxBuf[4] == 'M' && gpsUartDmaRxBuf[5] == 'C')
{
if(Res == '\\\\n')
{
memset(gpsData.GPS_Buffer, 0, GPS_Buffer_Length);
memcpy(gpsData.GPS_Buffer, gpsUartDmaRxBuf, point1);
gpsData.isGetData = true;
point1 = 0;
memset(gpsUartDmaRxBuf, 0, GPS_DMA_RX_BUF_SIZE);
}
}
if(point1 >= GPS_DMA_RX_BUF_SIZE)
{
point1 = GPS_DMA_RX_BUF_SIZE;
}
}
}
OLED菜单代码:
`
show_param_t show_param[] =
{
{
.screenIdx = 0,
.screen_param =
{
{.x_base = 0, .y_base = 0, .string = "1.Rate Mode: 6", .modifyPos = 12, .modify = 1},
{.x_base = 0, .y_base = 1, .string = " Freq:473100000", .modifyPos = 7, .modify = 1},
{.x_base = 0, .y_base = 2, .string = " Txp:15", .modifyPos = 6, .modify = 1},
{.x_base = 0, .y_base = 3, .string = " Tx Count:100", .modifyPos = 11, .modify = 0},
{.x_base = 0, .y_base = 4, .string = " WakeOnRadio:N ", .modifyPos = 14, .modify = 1},
{.x_base = 0, .y_base = 5, .string = " ", .modifyPos = 11, .modify = 0},
{.x_base = 0, .y_base = 6, .string = " ", .modifyPos = 14, .modify = 0},
{.x_base = 0, .y_base = 7, .string = " ", .modifyPos = 14, .modify = 0},
}
},
{
.screenIdx = 1,
.screen_param =
{
{.x_base = 0, .y_base = 0, .string = "2.Tx Count:100", .modifyPos = 11, .modify = 0},
{.x_base = 0, .y_base = 1, .string = " Send:0", .modifyPos = 7, .modify = 1},
{.x_base = 0, .y_base = 2, .string = " Rate Mode:13", .modifyPos = 12, .modify = 1},
{.x_base = 0, .y_base = 3, .string = " Freq:473100000", .modifyPos = 7, .modify = 1},
{.x_base = 0, .y_base = 4, .string = " Txp:15", .modifyPos = 6, .modify = 1},
{.x_base = 0, .y_base = 5, .string = " ", .modifyPos = 11, .modify = 0},
{.x_base = 0, .y_base = 6, .string = " ", .modifyPos = 11, .modify = 0},
{.x_base = 0, .y_base = 7, .string = " ", .modifyPos = 11, .modify = 0},
}
},
{
.screenIdx = 2,
.screen_param =
{
{.x_base = 0, .y_base = 0, .string = "3.Rssi:-80 ", .modifyPos = 7, .modify = 0},
{.x_base = 0, .y_base = 1, .string = " Snr:20 ", .modifyPos = 6, .modify = 0},
{.x_base = 0, .y_base = 2, .string = " Rx Count:100", .modifyPos = 11, .modify = 0},
{.x_base = 0, .y_base = 3, .string = " Loss:100%", .modifyPos = 7, .modify = 0},
{.x_base = 0, .y_base = 4, .string = " Rate Mode:13", .modifyPos = 12, .modify = 1},
{.x_base = 0, .y_base = 5, .string = " Freq:473100000", .modifyPos = 7, .modify = 1},
{.x_base = 0, .y_base = 6, .string = " Txp:15", .modifyPos = 6, .modify = 1}
}
},
{
.screenIdx = 3,
.screen_param =
{
{.x_base = 0, .y_base = 0, .string = "4.RF Ver:2.0.0 ", .modifyPos = 9, .modify = 0},
{.x_base = 0, .y_base = 1, .string = " McuVer:2.0.3 ", .modifyPos = 9, .modify = 0},
{.x_base = 0, .y_base = 2, .string = " ", .modifyPos = 8, .modify = 0},
{.x_base = 0, .y_base = 3, .string = " ", .modifyPos = 9, .modify = 0}
}
},
{
.screenIdx = 4,
.screen_param =
{
{.x_base = 0, .y_base = 0, .string = "5.GPS Display ", .modifyPos = 0, .modify = 0},
{.x_base = 0, .y_base = 1, .string = "Longitudes: ", .modifyPos = 0, .modify = 0},
{.x_base = 0, .y_base = 2, .string = "Invalid", .modifyPos = 0, .modify = 0},
{.x_base = 0, .y_base = 3, .string = "Latitude:", .modifyPos = 0, .modify = 0},
{.x_base = 0, .y_base = 4, .string = "Invalid", .modifyPos = 0, .modify = 0},
}
}
};
OLED显示代码:
`
void ScreenRefresh(void)
{
u8 screenIdx;
u8 str[12];
u8 rowIdx;
u8 modifyPos = 0;
u8 xPos = 0;
u8 yPos = 0;
u8 *pStr = NULL;
if(gpsData.isUsefull&&sys_param.screenIdx==4)
{
sys_param.screen_refresh = 1;
}
if (!sys_param.screen_refresh)
{
return;
}
else
{
sys_param.screen_refresh = 0;
}
OLED_Clear();
screenIdx = sys_param.screenIdx;
rowIdx = sys_param.rowIdx % SHOW_LINE_MAX;
switch (screenIdx)
{
case 0:
sprintf((char *)str, "%d", sys_param.rateMode);
modifyPos = show_param[screenIdx].screen_param[0].modifyPos;
memset(&show_param[screenIdx].screen_param[0].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[0].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[0].x_base;
yPos = show_param[screenIdx].screen_param[0].y_base;
pStr = show_param[screenIdx].screen_param[0].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.freq);
modifyPos = show_param[screenIdx].screen_param[1].modifyPos;
memset(&show_param[screenIdx].screen_param[1].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[1].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[1].x_base;
yPos = show_param[screenIdx].screen_param[1].y_base;
pStr = show_param[screenIdx].screen_param[1].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.txpIdx);
modifyPos = show_param[screenIdx].screen_param[2].modifyPos;
memset(&show_param[screenIdx].screen_param[2].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[2].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[2].x_base;
yPos = show_param[screenIdx].screen_param[2].y_base;
pStr = show_param[screenIdx].screen_param[2].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.txTargetCnt);
modifyPos = show_param[screenIdx].screen_param[3].modifyPos;
memset(&show_param[screenIdx].screen_param[3].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[3].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[3].x_base;
yPos = show_param[screenIdx].screen_param[3].y_base;
pStr = show_param[screenIdx].screen_param[3].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
modifyPos = show_param[screenIdx].screen_param[4].modifyPos;
memset(&show_param[screenIdx].screen_param[4].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[4].string[modifyPos],
sys_param.worType == WOR_TYPE_NONE ? "N" : sys_param.worType == WOR_TYPE_MASTER ? "M" : "S", 1);
xPos = show_param[screenIdx].screen_param[4].x_base;
yPos = show_param[screenIdx].screen_param[4].y_base;
pStr = show_param[screenIdx].screen_param[4].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
xPos = show_param[screenIdx].screen_param[5].x_base;
yPos = show_param[screenIdx].screen_param[5].y_base;
pStr = show_param[screenIdx].screen_param[5].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
xPos = show_param[screenIdx].screen_param[6].x_base;
yPos = show_param[screenIdx].screen_param[6].y_base;
pStr = show_param[screenIdx].screen_param[6].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
xPos = show_param[screenIdx].screen_param[7].x_base;
yPos = show_param[screenIdx].screen_param[7].y_base;
pStr = show_param[screenIdx].screen_param[7].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
break;
case 1:
sprintf((char *)str, "%d", sys_param.txTargetCnt);
modifyPos = show_param[screenIdx].screen_param[0].modifyPos;
memset(&show_param[screenIdx].screen_param[0].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[0].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[0].x_base;
yPos = show_param[screenIdx].screen_param[0].y_base;
pStr = show_param[screenIdx].screen_param[0].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.txSentCnt);
modifyPos = show_param[screenIdx].screen_param[1].modifyPos;
memset(&show_param[screenIdx].screen_param[1].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[1].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[1].x_base;
yPos = show_param[screenIdx].screen_param[1].y_base;
pStr = show_param[screenIdx].screen_param[1].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.rateMode);
modifyPos = show_param[screenIdx].screen_param[2].modifyPos;
memset(&show_param[screenIdx].screen_param[2].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[2].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[2].x_base;
yPos = show_param[screenIdx].screen_param[2].y_base;
pStr = show_param[screenIdx].screen_param[2].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.freq);
modifyPos = show_param[screenIdx].screen_param[3].modifyPos;
memset(&show_param[screenIdx].screen_param[3].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[3].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[3].x_base;
yPos = show_param[screenIdx].screen_param[3].y_base;
pStr = show_param[screenIdx].screen_param[3].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.txpIdx);
modifyPos = show_param[screenIdx].screen_param[4].modifyPos;
memset(&show_param[screenIdx].screen_param[4].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[4].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[4].x_base;
yPos = show_param[screenIdx].screen_param[4].y_base;
pStr = show_param[screenIdx].screen_param[4].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
break;
case 2:
sprintf((char *)str, "%d", sys_param.rssi);
modifyPos = show_param[screenIdx].screen_param[0].modifyPos;
memset(&show_param[screenIdx].screen_param[0].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[0].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[0].x_base;
yPos = show_param[screenIdx].screen_param[0].y_base;
pStr = show_param[screenIdx].screen_param[0].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.snr);
modifyPos = show_param[screenIdx].screen_param[1].modifyPos;
memset(&show_param[screenIdx].screen_param[1].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[1].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[1].x_base;
yPos = show_param[screenIdx].screen_param[1].y_base;
pStr = show_param[screenIdx].screen_param[1].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.rx_count);
modifyPos = show_param[screenIdx].screen_param[2].modifyPos;
memset(&show_param[screenIdx].screen_param[2].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[2].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[2].x_base;
yPos = show_param[screenIdx].screen_param[2].y_base;
pStr = show_param[screenIdx].screen_param[2].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%.2f%%", sys_param.rxPktLossRate);
modifyPos = show_param[screenIdx].screen_param[3].modifyPos;
memset(&show_param[screenIdx].screen_param[3].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[3].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[3].x_base;
yPos = show_param[screenIdx].screen_param[3].y_base;
pStr = show_param[screenIdx].screen_param[3].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.rateMode);
modifyPos = show_param[screenIdx].screen_param[4].modifyPos;
memset(&show_param[screenIdx].screen_param[4].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[4].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[4].x_base;
yPos = show_param[screenIdx].screen_param[4].y_base;
pStr = show_param[screenIdx].screen_param[4].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.freq);
modifyPos = show_param[screenIdx].screen_param[5].modifyPos;
memset(&show_param[screenIdx].screen_param[5].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[5].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[5].x_base;
yPos = show_param[screenIdx].screen_param[5].y_base;
pStr = show_param[screenIdx].screen_param[5].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
sprintf((char *)str, "%d", sys_param.txpIdx);
modifyPos = show_param[screenIdx].screen_param[6].modifyPos;
memset(&show_param[screenIdx].screen_param[6].string[modifyPos], ' ', 16 - modifyPos);
memcpy(&show_param[screenIdx].screen_param[6].string[modifyPos], str, strlen((char *)str));
xPos = show_param[screenIdx].screen_param[6].x_base;
yPos = show_param[screenIdx].screen_param[6].y_base;
pStr = show_param[screenIdx].screen_param[6].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
break;
case 3:
xPos = show_param[screenIdx].screen_param[0].x_base;
yPos = show_param[screenIdx].screen_param[0].y_base;
pStr = show_param[screenIdx].screen_param[0].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
xPos = show_param[screenIdx].screen_param[1].x_base;
yPos = show_param[screenIdx].screen_param[1].y_base;
pStr = show_param[screenIdx].screen_param[1].string;
OLED_ShowString(xPos, yPos, pStr, (rowIdx == yPos) && sys_param.rowSelected ? 0 : 1);
break;
case 4:
if(gpsData.isUsefull)
{
xPos = show_param[screenIdx].screen_param[0].x_base;
yPos = show_param[screenIdx].screen_param[0].y_base;
pStr = show_param[screenIdx].screen_param[0].string;
OLED_ShowString(xPos, yPos, pStr, 1);
xPos = show_param[screenIdx].screen_param[1].x_base;
yPos = show_param[screenIdx].screen_param[1].y_base;
pStr = show_param[screenIdx].screen_param[1].string;
OLED_ShowString(xPos, yPos, pStr, 1);
xPos = show_param[screenIdx].screen_param[2].x_base;
yPos = show_param[screenIdx].screen_param[2].y_base;
memset(str,0,12);
strcat((char *)str, gpsData.E_W);
strcat((char *)str, ":");
strcat((char *)str, gpsData.longitude);
pStr = str;
OLED_ShowString(xPos, yPos, pStr, 1);
xPos = show_param[screenIdx].screen_param[3].x_base;
yPos = show_param[screenIdx].screen_param[3].y_base;
pStr = show_param[screenIdx].screen_param[3].string;
OLED_ShowString(xPos, yPos, pStr, 1);
xPos = show_param[screenIdx].screen_param[4].x_base;
yPos = show_param[screenIdx].screen_param[4].y_base;
memset(str,0,12);
strcat((char *)str, gpsData.N_S);
strcat((char *)str, ":");
strcat((char *)str, gpsData.latitude);
pStr = str;
OLED_ShowString(xPos, yPos, pStr, 1);
gpsData.isUsefull = false;
}
else
{
xPos = show_param[screenIdx].screen_param[0].x_base;
yPos = show_param[screenIdx].screen_param[0].y_base;
pStr = show_param[screenIdx].screen_param[0].string;
OLED_ShowString(xPos, yPos, pStr, 1);
xPos = show_param[screenIdx].screen_param[1].x_base;
yPos = show_param[screenIdx].screen_param[1].y_base;
pStr = show_param[screenIdx].screen_param[1].string;
OLED_ShowString(xPos, yPos, pStr, 1);
xPos = show_param[screenIdx].screen_param[2].x_base;
yPos = show_param[screenIdx].screen_param[2].y_base;
pStr = show_param[screenIdx].screen_param[2].string;
OLED_ShowString(xPos, yPos, pStr, 1);
xPos = show_param[screenIdx].screen_param[3].x_base;
yPos = show_param[screenIdx].screen_param[3].y_base;
pStr = show_param[screenIdx].screen_param[3].string;
OLED_ShowString(xPos, yPos, pStr, 1);
xPos = show_param[screenIdx].screen_param[4].x_base;
yPos = show_param[screenIdx].screen_param[4].y_base;
pStr = show_param[screenIdx].screen_param[4].string;
OLED_ShowString(xPos, yPos, pStr, 1);
}
break;
default:
OLED_ShowString(0, 0, "ERROR SHOW", 1);
break;
}
}
GPS定位数据发送:
注意:TK8620发送数据只支持0-9,A-F字符串数据,所以要将-N_S:%s,latitude:%s,E_W:%s,longitude:%s,转换为16进制字符串。
`
void Send_GPS(void)
{
char cmd[128];
char temp[64]="";
char buffer[128];
if(gpsData.isUsefull)
{
memset(cmd,0,128);
memset(buffer,0,128);
sprintf(cmd, "AT+SENDB=0001020304");
sprintf(temp, "-N_S:%s,latitude:%s,E_W:%s,longitude:%s,", gpsData.N_S,gpsData.latitude,gpsData.E_W,gpsData.longitude);
Data2Str((uint8_t*)temp,buffer,strlen(temp));
strcat(cmd,buffer);
strcat(cmd,"\\\\r\\\\n");
Send_AtCmd(cmd);
}
}
主函数实现:
`
int main(void)
{
OLED_Init();
OLED_Clear();
PeripheralInit();
ExtiInit();
ExtiCbRegister(WorCb);
key_init();
TimerCbRegister(TIM3, autoSendPeriod);
printf("*************************************************************\\\\r\\\\n");
printf("* This is example of async p2p AT demo by using AT CMD *\\\\r\\\\n");
printf("* Compile time %s %s \\\\r\\\\n", __DATE__, __TIME__);
printf("*************************************************************\\\\r\\\\n");
GPSUartInit(9600);
while (1)
{
FSM_Manager();
parseGpsBuffer();
printGpsBuffer();
Send_GPS();
ScreenRefresh();
KeyInfoUpdate();
if (sys_param.autoSendEn)
{
sys_param.autoSendEn = 0;
Send_GPS_Example();
if (sys_param.txSentCnt < sys_param.txTargetCnt)
{
TimerInit(TIM3, &(TimerInitCfg){.psc = 36000, .arr = 2000 * SEND_TIMEOUT, .mode = TIMER_CNTMODE_ONESHOT});
}
else
{
sys_param.txTargetCnt = 0;
}
sys_param.screen_refresh = 1;
}
if (sys_param.wor)
{
sys_param.wor = 0;
printf("wakeup on radio\\\\r\\\\n");
sys_param.fsmState = FSM_GET_VER;
sys_param.rx_count = 1;
sys_param.screen_refresh = 1;
}
}
}
4.成果展示
