Files

203 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 <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