#include #include #include // gettimeofday #include #include #include #include #include #include #include #include #include #include #include #include #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