203 lines
6.1 KiB
C
203 lines
6.1 KiB
C
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <sys/time.h> // gettimeofday
|
||
#include <sys/stat.h>
|
||
#include <string.h>
|
||
#include <unistd.h>
|
||
#include <sys/types.h>
|
||
#include <fcntl.h>
|
||
#include <sys/mman.h>
|
||
#include <sys/ioctl.h>
|
||
#include <sys/socket.h>
|
||
#include <netinet/in.h>
|
||
#include <arpa/inet.h>
|
||
#include <netdb.h>
|
||
#include <errno.h>
|
||
|
||
#include "serial.h"
|
||
#include "uartinf.h"
|
||
|
||
char _rx_data[1024];
|
||
unsigned char jingdu[] = {0x01, 0x03, 0x00, 0xcf, 0x00, 0x03,0x35,0xf4};
|
||
unsigned char weidu[] = {0x01, 0x03, 0x00, 0xd2, 0x00, 0x03,0xa5,0xf2};
|
||
|
||
int *switch_memory_open(void) {
|
||
char buf[128];
|
||
int fd;
|
||
sprintf(buf, "/video_mode");
|
||
fd = shm_open(buf, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
|
||
if(fd < 0) { perror("shm_open"); exit(1); }
|
||
if (ftruncate(fd, 4096) == -1) { perror("ftruncate"); exit(1); }
|
||
int *retval = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||
return retval;
|
||
}
|
||
|
||
void send_specified_bytes(UART_INTF uart_type,unsigned char *data) {
|
||
// 定义要发送的字节数组:0x01 0x03 0x00 0xcf 0x00 0x03
|
||
//unsigned char data[] = {0x01, 0x03, 0x00, 0xcf, 0x00, 0x03};
|
||
// 计算数组长度(共6个字节)
|
||
//int len = sizeof(data) / sizeof(data[0]);
|
||
|
||
// 使用uart_write_len发送指定长度的字节序列
|
||
int ret = uart_write_len(uart_type, (char*)data, 8);
|
||
if (ret > 0) {
|
||
// printf("成功发送 %d 字节\n", ret);
|
||
} else {
|
||
printf("发送失败,返回值: %d\n", ret);
|
||
}
|
||
}
|
||
// 提取并解析经度(正值=东经,负值=西经)
|
||
void parse_longitude(unsigned char *data) {
|
||
// 提取方向标识(第4-5位:0x00 0x45/0x00 0x57)
|
||
uint16_t dir_flag = (uint16_t)data[3] << 8 | data[4];
|
||
|
||
// 提取经度数值字节(第6-9位:0x0 0xae 0x1 0x0),拼接为0x00AE0100
|
||
uint32_t lon_val = (uint32_t)data[5] << 24 |
|
||
(uint32_t)data[6] << 16 |
|
||
(uint32_t)data[7] << 8 |
|
||
(uint32_t)data[8];
|
||
|
||
// 计算基础经度值(小数点左移5位)
|
||
double longitude = (double)lon_val / 100000.0;
|
||
|
||
// 根据方向设置正负(东经=正,西经=负)
|
||
if (dir_flag == 0x0057) {
|
||
longitude = -longitude; // 西经取负
|
||
}else if(dir_flag == 0x0053){
|
||
longitude = -longitude;
|
||
}
|
||
else if ((dir_flag != 0x0045)||(dir_flag != 0x004E)) {
|
||
printf("警告:未知方向标识 0x%04X\n", dir_flag);
|
||
}
|
||
|
||
// 打印结果(含方向说明和数值)
|
||
printf("原始经度值:0x%08X(十进制:%u)\n", lon_val, lon_val);
|
||
//printf("方向标识:0x%04X -> %s\n", dir_flag,
|
||
// dir_flag == 0x0045 ? "东经" : (dir_flag == 0x0057 ? "西经" : "未知"));
|
||
printf("实际经度:%.5f°\n", longitude);
|
||
}
|
||
int main (int argc, char *argv[])
|
||
{
|
||
int n_read;
|
||
int i;
|
||
|
||
int *buffer;
|
||
|
||
int *switch_mode;
|
||
switch_mode= switch_memory_open();
|
||
|
||
n_read = uart_init(ROUTE_UART, "/dev/ttyAMA4", 9600, 'N');
|
||
if(n_read <=0 ) {
|
||
printf("open /dev/ttyAMA4 failed\n");
|
||
return -1;
|
||
}
|
||
while(1){
|
||
// send_specified_bytes(ROUTE_UART,jingdu);
|
||
n_read = uart_read(ROUTE_UART, _rx_data);
|
||
|
||
if(n_read >0){
|
||
//printf("%s\n",_rx_data);
|
||
printf("jingdu 0x%02x 0x%2x 0x%2x 0x%2x 0x%2x 0x%2x 0x%2x 0x%2x \n",_rx_data[0],_rx_data[1],_rx_data[3],_rx_data[4],_rx_data[5],_rx_data[6],_rx_data[7],_rx_data[8]);
|
||
// parse_longitude(_rx_data);
|
||
}
|
||
// usleep(100000);
|
||
// send_specified_bytes(ROUTE_UART,weidu);
|
||
// n_read = uart_read(ROUTE_UART, _rx_data);
|
||
// if(n_read >0){
|
||
//printf("%s\n",_rx_data);
|
||
//printf("weidu 0x%2x 0x%2x 0x%2x 0x%2x 0x%2x 0x%2x 0x%2x 0x%2x \n",_rx_data[0],_rx_data[1],_rx_data[3],_rx_data[4],_rx_data[5],_rx_data[6],_rx_data[7],_rx_data[8]);
|
||
// parse_longitude(_rx_data);
|
||
|
||
// }
|
||
usleep(2000000);
|
||
}
|
||
}
|
||
|
||
# if 0
|
||
|
||
fd_param = shm_open("/param.txt",O_RDWR|O_CREAT|O_EXCL,0777);
|
||
if(fd_param < 0){
|
||
fd_param = shm_open("/param.txt",O_RDWR,0777);
|
||
}else
|
||
ftruncate(fd_param,4096);
|
||
buffer_param= mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,fd_param,0);
|
||
|
||
|
||
while(1){
|
||
|
||
n_read = uart_get(ROUTE_UART, _rx_data);
|
||
|
||
if(n_read >0){
|
||
printf("%s\n",_rx_data);
|
||
|
||
if(!strncmp("VGA",_rx_data,3)){
|
||
printf("%s\n",_rx_data);
|
||
// sscanf(_rx_data,"VGA:%d RSSI:%f RSSI1:%f RSSI2:%f",&num,&rssi,&rssi1,&rssi2);
|
||
|
||
|
||
buffer_rssi = strstr(_rx_data,"RSSI:");
|
||
buffer_rssi1 = strstr(_rx_data,"RSSI1:");
|
||
buffer_rssi2 = strstr(_rx_data,"RSSI2:");
|
||
|
||
if( buffer_rssi && buffer_rssi1 && buffer_rssi2){
|
||
|
||
strncpy(bit,buffer_rssi+5,6);
|
||
rssi = atof(bit);
|
||
strncpy(bit,buffer_rssi1+6,6);
|
||
rssi1 = atof(bit);
|
||
|
||
strncpy(bit,buffer_rssi2+6,6);
|
||
rssi2 = atof(bit);
|
||
|
||
buffer_param[0] = rssi;
|
||
buffer_param[1] = rssi1;
|
||
buffer_param[2] = rssi2;
|
||
buffer_param[4] = 1434000;
|
||
buffer_param[6] = 0;
|
||
}
|
||
|
||
printf("+++++%f %f %f %d\n", rssi,rssi1,rssi2,1434000);
|
||
|
||
}else{
|
||
|
||
buffer=strstr(_rx_data,"%)");
|
||
buffer_rssi = strstr(_rx_data,"RSSI:");
|
||
buffer_rssi1 = strstr(_rx_data,"RSSI1:");
|
||
buffer_rssi2 = strstr(_rx_data,"RSSI2:");
|
||
if(buffer_rssi && buffer && n_read >30){
|
||
printf("%s\n",buffer);
|
||
//sscanf(_rx_data,"%d(%d) :VGA:%d RSSI:%f RSSI1:%f RSSI2:%f(air:vga:%d RSSI1: %d RSSI2: %d err:%d\%)%dkbps",&num,&num1,&vga,&rssi,&rssi1,&rssi2,&vga1,&air_rssi1,&air_rssi2,&err,&bitrate);
|
||
|
||
strncpy(bit,buffer+2,4);
|
||
bitrate=atoi(bit);
|
||
|
||
strncpy(bit,buffer_rssi+5,4);
|
||
rssi = atof(bit);
|
||
strncpy(bit,buffer_rssi1+6,4);
|
||
rssi1 = atof(bit);
|
||
|
||
strncpy(bit,buffer_rssi2+6,4);
|
||
rssi2 = atof(bit);
|
||
|
||
|
||
|
||
printf("%f %f %f %d %d %d %d %d %d\n",rssi,rssi1,rssi2,snr,freq,vga1,air_rssi1,air_rssi2,bitrate);
|
||
buffer_param[0] = rssi;
|
||
buffer_param[1] = rssi1;
|
||
buffer_param[2] = rssi2;
|
||
buffer_param[3] = 30;
|
||
buffer_param[4] = 1434000;
|
||
buffer_param[5] = bitrate;
|
||
buffer_param[6] = 1;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
#endif
|
||
|