EBIKE-FreeRTOS/Source/EC800M_GPS.c

255 lines
6.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "EC800M_GPS.h"
// 存放GPS数据
char GPSDATA[GPSDATA_LENGTH];
int GPSDATA_LEN;
// 重置GPS数据缓冲区
void gps_reset_data()
{
memset(GPSDATA, 0, GPSDATA_LENGTH);
GPSDATA_LEN = 0;
}
// 初始化 EC800M 串口
int EC800M_UART_INIT()
{
uart_init(EC800M_GPS_UART, GPS_UART_BAUD_RATE);
gpio_set_function(GPS_UART_TX, GPIO_FUNC_UART);
gpio_set_function(GPS_UART_RX, GPIO_FUNC_UART);
uart_set_hw_flow(EC800M_GPS_UART, false, false);
uart_set_format(EC800M_GPS_UART, GPS_DATA_BITS, GPS_STOP_BITS, UART_PARITY_NONE);
return 0;
}
void _gps_uart_send_string(const char *str)
{
size_t len = strlen(str);
uart_write_blocking(EC800M_GPS_UART, (const uint8_t *)str, len);
return;
}
int _gps_uart_read_string()
{
int _time = 0;
int timeout = 3000; // 设置超时时间为7秒单位为毫秒
while (1) {
if (uart_is_readable(EC800M_GPS_UART)) {
char c = uart_getc(EC800M_GPS_UART);
if (GPSDATA_LEN < GPSDATA_LENGTH - 1) {
GPSDATA[GPSDATA_LEN++] = c;
GPSDATA[GPSDATA_LEN] = '\0';
}
} else {
return 0;
}
// 检查是否超时
if (_time >= timeout) {
printf("EC800M _gps_uart_read_string() 读取超时\n");
return -1;
}
sleep_ms(1); // 稍微延迟一下,等待下一个循环
_time++;
}
return 0;
}
int _gps_uart_read_string_until_response(const char *expected_response)
{
gps_reset_data();
int timeout = 3000; // 设置超时时间为7秒单位为毫秒
int i = 0;
int _time = 0;
while (1) {
while (uart_is_readable(EC800M_GPS_UART)) {
char c = uart_getc(EC800M_GPS_UART);
GPSDATA[i++] = c;
GPSDATA[i] = '\0'; // 添加字符串结束符
if (strstr(GPSDATA, expected_response) != NULL) {
GPSDATA_LEN = i;
return 0; // 找到了预期的响应,退出循环
}
}
_time++;
sleep_ms(1); // 等待一小段时间再继续读取
if (_time >= timeout) {
_time = 0;
printf("EC800M _gps_uart_read_string_until_response() 读取超时\n");
return -1;
}
}
}
// GPS 经纬度转10进制
long double convertToDecimal(long double coordinate)
{
int degree = (int)(coordinate / 100);
long double minutes = coordinate - degree * 100;
return degree + minutes / 60;
}
// 解释GPS数据
int EC800M_GPS_DATA_PARSING(char *GPS_DATA, GPS_ * gps_)
{
int i = 1;
char *p;
char *p1;
char *token;
p = strchr(GPS_DATA, ':');
if (p == NULL) {
return -1;
}
p1 = strstr(p + 2, "\r\n");
if (p1 == NULL) {
return -1;
}
char GPS_DATA_[p1 - p];
memset(gps_->time, 0, 20);
memset(gps_->N, 0, 20);
memset(gps_->E, 0, 20);
memset(GPS_DATA_, 0, p1 - p);
memcpy(GPS_DATA_, p + 2, p1 - p - 2 + 1);
GPS_DATA_[p1 - p - 2 + 1] = '\0';
printf("%s\n", GPS_DATA_);
token = strtok(GPS_DATA_, ",");
while (token != NULL) {
if (i == 1) {
strcpy(gps_->time, token);
}
if (i == 2) {
strcpy(gps_->N, token);
}
if (i == 3) {
strcpy(gps_->E, token);
}
token = strtok(NULL, ",");
i++;
}
gps_->N[strlen(gps_->N) - 1] = '\0';
gps_->E[strlen(gps_->E) - 1] = '\0';
// 095921.00
char hours[3] = { 0 };
char minutes[3] = { 0 };
char seconds[9] = { 0 };
char *p2 = gps_->time;
memcpy(hours, p2, 2);
memcpy(minutes, p2 + 2, 2);
memcpy(seconds, p2 + 4, 2);
//printf("GPS 修正时间: %d:%s:%s\n", atoi(hours) + 8, minutes, seconds);
sprintf(gps_->time, "%d:%s:%s", atoi(hours) + 8, minutes, seconds);
sprintf(gps_->N, "%.6lf", convertToDecimal(atof(gps_->N)));
sprintf(gps_->E, "%.6lf", convertToDecimal(atof(gps_->E)));
return 0;
}
// 初始化 EC800M GPS
int EC800M_GPS_INIT()
{
_gps_uart_send_string("AT+QGPSCFG=\"outport\",\"uartdebug\"\r\n");
sleep_ms(100);
if (-1 == _gps_uart_read_string()) {
return -1;
}
_gps_uart_send_string("AT+QGPSCFG=\"nmeasrc\",1\r\n");
sleep_ms(100);
if (-1 == _gps_uart_read_string()) {
return -1;
}
_gps_uart_send_string("AT+QGPSCFG=\"gpsnmeatype\",63\r\n");
sleep_ms(100);
if (-1 == _gps_uart_read_string()) {
return -1;
}
_gps_uart_send_string("AT+QGPSCFG=\"gnssconfig\",1\r\n");
sleep_ms(100);
if (-1 == _gps_uart_read_string()) {
return -1;
}
_gps_uart_send_string("AT+QGPSCFG=\"autogps\",0\r\n");
sleep_ms(100);
if (-1 == _gps_uart_read_string()) {
return -1;
}
_gps_uart_send_string("AT+QGPSCFG=\"apflash\",0\r\n");
sleep_ms(100);
if (-1 == _gps_uart_read_string()) {
return -1;
}
_gps_uart_send_string("AT+QGPS=1\r\n");
sleep_ms(100);
if (-1 == _gps_uart_read_string()) {
return -1;
}
// 打印第一次初始化输出
//printf("%s %d\n", GPSDATA, strlen(GPSDATA));
return 0;
}
void EC800M_GPS(void *p)
{
(void)p;
//while (1) {
printf("EC800M Module GPS\n");
GPS_ gps_;
memset(gps_.time, 0, 20);
memset(gps_.N, 0, 20);
memset(gps_.E, 0, 20);
if (-1 == EC800M_GPS_INIT()) {
printf("EC800M_INIT() 第一次初始化失败\n");
}
_gps_uart_send_string("AT+QGPSLOC=0\r\n");
if (-1 == _gps_uart_read_string_until_response("OK")) {
printf("重启EC800M模块 GPS\n");
EC800M_GPS_INIT();
}
sleep_ms(300);
//printf("%s %d %d\n", GPSDATA, strlen(GPSDATA), GPSDATA_LEN);
if (NULL == strstr(GPSDATA, "ERROR") && GPSDATA_LEN > 0) {
EC800M_GPS_DATA_PARSING(GPSDATA, &gps_);
printf(" T: %s\n N: %s\n E: %s\n", gps_.time, gps_.N, gps_.E);
printf(" NE: %s, %s\n", gps_.N, gps_.E);
}
printf("\n");
//_printTaskStackHighWaterMark();
vTaskDelay(pdMS_TO_TICKS(3000)); // 非阻塞延时
//}
return;
}