多线程监听串口

  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4 #include <error.h>
  5 #include <sys/types.h>  
  6 #include <sys/stat.h> 
  7 #include <fcntl.h>     
  8 #include <termios.h>    
  9 #include <sys/time.h>
 10 #include <signal.h>
 11 #include <string.h>
 12 #include <poll.h>
 13 #include <pthread.h>
 14 #include <sys/select.h>  
 15 #include <time.h> 
 16 
 17 
 18 int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
 19         B38400, B19200, B9600, B4800, B2400, B1200, B300, };
 20 int name_arr[] = {115200, 38400,  19200,  9600,  4800,  2400,  1200,  300,
 21         38400,  19200,  9600, 4800, 2400, 1200,  300, };
 22 
 23 
 24 int fd_uart1;
 25 int fd_uart2;
 26 int fd_uart3;
 27 int fd_uart4;
 28 
 29 #define UART1  "/dev/ttysWK0"
 30 #define UART2  "/dev/ttysWK1"//"/dev/ttymxc1"
 31 #define UART3  "/dev/ttysWK2"//"/dev/ttymxc2"
 32 #define UART4  "/dev/ttysWK3"//"/dev/ttymxc3"
 33 void delay(int i)
 34 {
 35     int t,k;
 36     for(t=i;t>0;t--)
 37         for(k=50000;k>0;k--);
 38 }
 39 
 40 int init_serial(char *device,int speed)  
 41 {  
 42     int serial_fd = 0,i; 
 43     serial_fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY);  
 44     if (serial_fd < 0) {  
 45         perror("open");  
 46         return -1;  
 47     }  
 48       
 49     //串口主要设置结构体termios <termios.h>  
 50     struct termios options;  
 51       
 52     /**1. tcgetattr函数用于获取与终端相关的参数。 
 53     *参数fd为终端的文件描述符,返回的结果保存在termios结构体中 
 54     */  
 55     tcgetattr(serial_fd, &options);  
 56     /**2. 修改所获得的参数*/  
 57     options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能  
 58     options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位  
 59     options.c_cflag &= ~CRTSCTS;//无硬件流控  
 60     options.c_cflag |= CS8;//8位数据长度  
 61     options.c_cflag &= ~CSTOPB;//1位停止位  
 62     options.c_iflag |= IGNPAR;//无奇偶检验位  
 63     options.c_oflag = 0; //输出模式  
 64     options.c_lflag = 0; //不激活终端模式  
 65     options.c_cc[VTIME] = 1; // 0.1seconds
 66     options.c_cc[VMIN] = 0;
 67     //cfsetospeed(&options, B115200);//设置波特率  
 68     for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)
 69        {
 70                if  (speed == name_arr[i])
 71                {
 72                 /*  设置串口的波特率 */
 73                 cfsetispeed(&options, speed_arr[i]);
 74                 cfsetospeed(&options, speed_arr[i]);
 75             }
 76        }  
 77     /**3. 设置新属性,TCSANOW:所有改变立即生效*/  
 78     tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读  
 79     tcsetattr(serial_fd, TCSANOW, &options);  
 80     return serial_fd;  
 81 }  
 82   
 83 /** 
 84 *串口发送数据 
 85 *@fd:串口描述符 
 86 *@data:待发送数据 
 87 *@datalen:数据长度 
 88 */  
 89 int uart_send(int fd, char *data, int datalen)  
 90 {  
 91     int len = 0;  
 92     len = write(fd, data, datalen);//实际写入的长度  
 93     if(len == datalen) {  
 94         return len;  
 95     } else {  
 96         tcflush(fd, TCOFLUSH);//TCOFLUSH刷新写入的数据但不传送  
 97         return -1;  
 98     }  
 99       
100     return 0;  
101 }  
102   
103 
104 int uart_recv2(int fd, char *data, int datalen)  
105 {  
106     int len;
107     len = read(fd, data, datalen);  
108     //printf("len = %d\n", len);  
109     return len;  
110 } 
111 
112 /*******************多线程************************/
113 
114 char buf1[10];
115 char buf2[10];
116 char buf3[10];
117 char buf4[10];
118 
119 
120 
121 
122 void readuart1(void *vptr)
123 {
124     int len;
125     printf("uart1\n");
126     while(1){
127         len =uart_recv2(fd_uart1,buf1,10);
128         if(len>0)
129             printf("uart1=%s\n",buf1);
130     }
131 }
132 void readuart2(void *vptr)
133 {
134     int len;
135     printf("uart2\n");
136     while(1){
137         len =uart_recv2(fd_uart2,buf2,10);
138         if(len>0)
139             printf("uart2=%s\n",buf2);
140     }
141 }
142 void readuart3(void *vptr)
143 {
144     int len;
145     printf("uart3\n");
146     while(1){
147         len =uart_recv2(fd_uart3,buf3,10);
148         if(len>0)
149             printf("uart3=%s\n",buf3);
150     }
151 }
152 void readuart4(void *vptr)
153 {
154     int len;
155     printf("uart4\n");
156     while(1){
157         len =uart_recv2(fd_uart4,buf4,10);
158         if(len>0)
159             printf("uart4=%s\n",buf4);
160     }
161 }
162 void setTimer(int seconds, int useconds)  
163 {  
164         struct timeval temp;  
165   
166         temp.tv_sec = seconds;  
167         temp.tv_usec = useconds;  
168   
169         select(0, NULL, NULL, NULL, &temp);  
170           
171   
172         return ;  
173 }  
174   
175 
176 void time_300ms(void *vptr)
177 {
178     printf("timer start!\n");
179     while(1){
180         setTimer(0, 300000); 
181         printf("timer\n");
182     }
183 }
184 
185 int main(int argc, char **argv)     
186 {  
187        fd_uart1=init_serial(UART1,115200);
188         delay(200);
189      fd_uart2=init_serial(UART2,115200);
190      delay(200);
191      fd_uart3=init_serial(UART3,115200);
192      delay(200);
193      fd_uart4=init_serial(UART4,115200);
194      delay(200);
195     char buf[]="hello123456\n";  
196     
197     memset(buf1,0,10);
198     memset(buf2,0,10);
199     memset(buf3,0,10);
200     memset(buf4,0,10);
201     
202     uart_send(fd_uart1, buf, 10);
203     usleep(50000);
204     uart_send(fd_uart2, buf, 10); 
205     usleep(50000);
206     uart_send(fd_uart3, buf, 10);
207     usleep(50000);
208     uart_send(fd_uart4, buf, 10); 
209     usleep(50000);
210     pthread_t tid1,tid2,tid3,tid4,tid_timer;
211     pthread_create(&tid1,NULL,&readuart1,NULL);
212     pthread_create(&tid2,NULL,&readuart2,NULL);
213     pthread_create(&tid3,NULL,&readuart3,NULL);
214     pthread_create(&tid4,NULL,&readuart4,NULL);
215     //pthread_create(&tid_timer,NULL,&time_300ms,NULL);
216   while(1){
217         sleep(1);
218         //uart_send(fd_uart1, buf1, 10);
219         //uart_send(fd_uart2, buf2, 10);
220         //uart_send(fd_uart3, buf3, 10);
221         //uart_send(fd_uart4, buf4, 10);
222       }
223       pthread_join(&tid1,NULL);
224     pthread_join(&tid2,NULL);
225     pthread_join(&tid3,NULL);
226     pthread_join(&tid4,NULL);
227     //pthread_join(&tid_timer,NULL);
228     
229     close(fd_uart1); 
230     close(fd_uart2); 
231     close(fd_uart3); 
232     close(fd_uart4); 
233     return 0;  
234 }
View Code

一个线程监听一路串口的收,可以在线程内使用select机制,减少IO操作

posted @ 2016-05-30 10:30  tla001  阅读(851)  评论(0编辑  收藏  举报
个人网站 www.tla001.cn