blob: 1b7eea44c4d2a4f44a1b56b568e26e21e2ca575c [file] [log] [blame]
b.liud440f9f2025-04-18 10:44:31 +08001#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <errno.h>
5#include <fcntl.h>
6#include <termios.h>
7#include <string.h>
8
9#include "mbtk_type.h"
10#include "mbtk_log.h"
11
12#define DATABITS CS8
13#define STOPBITS 0
14#define PARITYON 0
15#define PARITY 0
16
17int uart_baud_get(int baud)
18{
19 int rate = 0;
20 switch(baud)
21 {
22 case 300:
23 rate = B300;
24 break;
25 case 600:
26 rate = B600;
27 break;
28 case 1200:
29 rate = B1200;
30 break;
31 case 2400:
32 rate = B2400;
33 break;
34 case 4800:
35 rate = B4800;
36 break;
37 case 9600:
38 rate = B9600;
39 break;
40 case 19200:
41 rate = B19200;
42 break;
43 case 38400:
44 rate = B38400;
45 break;
46 case 57600:
47 rate = B57600;
48 break;
49 case 115200:
50 rate = B115200;
51 break;
52 case 230400:
53 rate = B230400;
54 break;
55 case 460800:
56 rate = B460800;
57 break;
58 case 921600:
59 rate = B921600;
60 break;
61 case 1500000:
62 rate = B1500000;
63 break;
64 case 2000000:
65 rate = B2000000;
66 break;
67 case 3000000:
68 rate = B3000000;
69 break;
70 case 4000000:
71 rate = B4000000;
72 break;
73 default:
74 rate = B115200;
75 break;
76 }
77
78 return rate;
79}
80
81int gnss_port_open(const char *dev, int flag, int baud, bool tty)
82{
83
84 int fd = -1;
85 if((fd = open(dev, flag)) < 0)
86 {
87 printf("Open %s fail errno = [%d].\n", dev, errno);
88 return -1;
89 }
90
91 printf("Open %s success.\n", dev);
92 if (tty)
93 {
94 int rate = uart_baud_get(baud);
95 /* set newtio */
96 struct termios newtio;
97 memset(&newtio, 0, sizeof(newtio));
98 //(void)fcntl(fd, F_SETFL, 0);
99 /* no flow control for uart by default */
100 newtio.c_cflag = rate | DATABITS | STOPBITS | PARITYON | PARITY | CLOCAL | CREAD;
101 newtio.c_iflag = IGNPAR;
102 //newtio.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
103 newtio.c_oflag = 0;
104 newtio.c_lflag = 0; /* disable ECHO, ICANON, etc... */
105
106 newtio.c_cc[VERASE] = 0x8; /* del */
107 newtio.c_cc[VEOF] = 4; /* Ctrl-d */
108 newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
109 newtio.c_cc[VEOL] = 0xD; /* '\0' */
110
111 tcflush(fd, TCIOFLUSH);
112 tcsetattr(fd, TCSANOW, &newtio);
113 }
114
115 return fd;
116}
117
118int main(int argc, char *argv[])
119{
120 if(argc != 2) {
121 printf("%s <dev>\n", argv[1]);
122 return -1;
123 }
124
125 int fd = gnss_port_open(argv[1], O_RDWR | O_NONBLOCK | O_NOCTTY, 115200, TRUE);
126 if(fd < 0) {
127 printf("gnss_port_open(%s) fail:%d\n", argv[1], errno);
128 return -1;
129 }
130
131 char buff[1024];
132 int len, ret;
133 fd_set fdr;
134 FD_ZERO(&fdr);
135 FD_SET(fd, &fdr);
136
137 while(1) {
138 ret = select(fd + 1, &fdr, NULL, 0, NULL);
139 if (ret < 0)
140 {
141 if (errno == EINTR)
142 {
143 continue;
144 }
145 printf("select error, errno = %d (%s)\n", errno, strerror(errno));
146 break;
147 }
148 else if (ret == 0)
149 {
150 printf("select ret == 0\n");
151 break;
152 }
153
154 if (FD_ISSET(fd, &fdr))
155 {
156 memset(buff, 0, sizeof(buff));
157 len = read(fd, buff, sizeof(buff));
158 if(len > 0) {
159
160
161 } else if(len ==0 ){
162 printf("Read end : len = 0\n");
163 break;
164 } else {
165 if(EAGAIN == errno) {
166 usleep(50000);
167 continue;
168 } else {
169 printf("Read ret = -1 ,errno = %d\n", errno);
170 break;
171 }
172 }
173 }
174 else
175 {
176 printf("Unknown select event.\n");
177 continue;
178 }
179 }
180
181 printf("exit.\n");
182 return 0;
183}
184
185