194 lines
4.8 KiB
C
194 lines
4.8 KiB
C
#include "EC800M.h"
|
|
|
|
char GPSDATA[GPSDATA_LENGTH];
|
|
int GPSDATA_LEN;
|
|
|
|
// 重置数据缓冲区
|
|
void reset_data()
|
|
{
|
|
memset(GPSDATA, 0, GPSDATA_LENGTH);
|
|
GPSDATA_LEN = 0;
|
|
}
|
|
|
|
void uart_send_string(const char *str)
|
|
{
|
|
size_t len = strlen(str);
|
|
uart_write_blocking(GPS_UART, (const uint8_t *)str, len);
|
|
}
|
|
|
|
void uart_read_string()
|
|
{
|
|
while (uart_is_readable(GPS_UART)) {
|
|
char c = uart_getc(GPS_UART);
|
|
|
|
if (GPSDATA_LEN < GPSDATA_LENGTH - 1) {
|
|
GPSDATA[GPSDATA_LEN++] = c;
|
|
GPSDATA[GPSDATA_LEN] = '\0';
|
|
}
|
|
|
|
sleep_ms(1);
|
|
}
|
|
}
|
|
|
|
void uart_read_string_until_response(const char *expected_response)
|
|
{
|
|
reset_data();
|
|
|
|
int response_len = strlen(expected_response);
|
|
char response_buffer[270]; // 假设响应不会超过 270 个字符
|
|
|
|
int i = 0;
|
|
while (1) {
|
|
while (uart_is_readable(GPS_UART)) {
|
|
char c = uart_getc(GPS_UART);
|
|
GPSDATA[i++] = c;
|
|
GPSDATA[i] = '\0'; // 添加字符串结束符
|
|
|
|
if (strstr(GPSDATA, expected_response) != NULL) {
|
|
return; // 找到了预期的响应,退出循环
|
|
}
|
|
}
|
|
sleep_ms(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数据
|
|
void EC800M_GPS_DATA_PARSING(char *GPS_DATA, GPS_ * gps_)
|
|
{
|
|
int i = 1;
|
|
char *p = strchr(GPS_DATA, ':');
|
|
char *p1 = strstr(p + 2, "\r\n");
|
|
char GPS_DATA_[p1 - p];
|
|
memset(gps_->time, 0, 10);
|
|
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_);
|
|
|
|
char *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';
|
|
|
|
long double N, E;
|
|
N = atof(gps_->N);
|
|
E = atof(gps_->E);
|
|
//printf("GPS : %.9lf, %.9lf\n", N, E);
|
|
//printf("GPS : %.6lf, %.6lf\n", convertToDecimal(N), convertToDecimal(E));
|
|
|
|
// 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;
|
|
}
|
|
|
|
// 初始化EC800M串口
|
|
int EC800M_INIT()
|
|
{
|
|
uart_init(GPS_UART, 2400);
|
|
gpio_set_function(GPS_UART_TX, GPIO_FUNC_UART); // UART1_TX
|
|
gpio_set_function(GPS_UART_RX, GPIO_FUNC_UART); // UART1_RX
|
|
int __unused actual = uart_set_baudrate(GPS_UART, GPS_UART_BAUD_RATE);
|
|
uart_set_hw_flow(GPS_UART, false, false);
|
|
uart_set_format(GPS_UART, GPS_DATA_BITS, GPS_STOP_BITS, UART_PARITY_NONE);
|
|
//uart_set_fifo_enabled(GPS_UART, false);
|
|
|
|
uart_send_string("AT+QGPSCFG=\"outport\",\"uartdebug\"\r\n");
|
|
sleep_ms(100);
|
|
uart_read_string();
|
|
|
|
uart_send_string("AT+QGPSCFG=\"nmeasrc\",1\r\n");
|
|
sleep_ms(100);
|
|
uart_read_string();
|
|
|
|
uart_send_string("AT+QGPSCFG=\"gpsnmeatype\",63\r\n");
|
|
sleep_ms(100);
|
|
uart_read_string();
|
|
|
|
uart_send_string("AT+QGPSCFG=\"gnssconfig\",1\r\n");
|
|
sleep_ms(100);
|
|
uart_read_string();
|
|
|
|
uart_send_string("AT+QGPSCFG=\"autogps\",0\r\n");
|
|
sleep_ms(100);
|
|
uart_read_string();
|
|
|
|
uart_send_string("AT+QGPSCFG=\"apflash\",0\r\n");
|
|
sleep_ms(100);
|
|
uart_read_string();
|
|
|
|
uart_send_string("AT+QGPS=1\r\n");
|
|
sleep_ms(100);
|
|
uart_read_string();
|
|
|
|
// 打印第一次初始化输出
|
|
printf("%s %d\n", GPSDATA, strlen(GPSDATA));
|
|
|
|
return 0;
|
|
}
|
|
|
|
void EC800M(void *p)
|
|
{
|
|
printf("EC800M\n");
|
|
|
|
EC800M_INIT();
|
|
GPS_ gps_;
|
|
memset(gps_.time, 0, 10);
|
|
memset(gps_.N, 0, 20);
|
|
memset(gps_.E, 0, 20);
|
|
|
|
while (1) {
|
|
|
|
uart_send_string("AT+QGPSLOC=0\r\n");
|
|
uart_read_string_until_response("OK");
|
|
sleep_ms(300);
|
|
printf("%s %d\n", GPSDATA, strlen(GPSDATA));
|
|
|
|
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("\r\n");
|
|
|
|
watchdog_update(); // 喂狗
|
|
sleep_ms(3000);
|
|
}
|
|
|
|
return;
|
|
}
|