UNIX环境下的串行口编程问题

各位高手:
我是一个UNIX下编程的菜鸟。最近因项目需要,要求在UNIX下基于Xon/Xoff协议进行串行通讯编程开发。可是,我对UNIX下的有关串口编程的C/C++语言库函数不熟悉,尤其是基于Xon/Xoff协议的编程。
恳请高手们指点迷津,如果有相关书籍能解决此类问题恳请报出书名,小弟先谢过了。

小陈
2003.1.26
---------------------------------------------------------------

《UNIX环境高级编程》上有一个章节讲的是串行设备,不知道你要的是不是这些。
---------------------------------------------------------------

以下是我写的一段代码,是两台主机通过串口进行通讯的,可以用,你按照你的项目需要改一下就行了!有什么问题:[email protected]联系!!

#include

  1<stdio.h>   
  2#include <sys types.h="">   
  3#include <sys time.h="">   
  4#include <errno.h>   
  5#include <signal.h>   
  6#include <syslog.h>   
  7#include <fcntl.h>   
  8#include <termios.h>   
  9#include <time.h>   
 10#include <stdlib.h>   
 11#include <string.h>   
 12  
 13#define OBSIZE 10//1024 //输出缓冲区长度   
 14#define IBSIZE 1024 //输入缓冲区长度   
 15#define DEF_DEVICE "/dev/tty2a"   
 16#define DEF_BAUD B19200 //波特率   
 17char outbuf[OBSIZE]; //定义输出缓冲区数组,发送数据   
 18int outcnt = OBSIZE;//outbuf剩余字节数   
 19char *outptr = outbuf;   
 20char inputbuf[IBSIZE];//定义输入缓冲区数组,接收数据   
 21char *ibuf=inputbuf;   
 22int tty1; //定义设备描述符   
 23void MessageTest(char *str)   
 24{   
 25  
 26printf("执行到 %s 步 \n",str);   
 27}   
 28void log_sys(char *str)   
 29{   
 30printf(str);   
 31}   
 32int set_nonblock_flag(int desc,int value)   
 33{   
 34int oldflags=fcntl(desc,F_GETFL,0);   
 35if (oldflags==-1)   
 36return -1;   
 37if (value!=0)   
 38oldflags ¦=O_NONBLOCK;   
 39else   
 40oldflags&amp;=~O_NONBLOCK;   
 41return fcntl(desc,F_SETFL,oldflags);   
 42  
 43}   
 44void tty_open(void)   
 45{   
 46struct termios term;   
 47if ( (tty1= open(DEF_DEVICE, O_RDWR)) &lt; 0)   
 48log_sys("tty_open: open error\n");   
 49if (tcgetattr(tty1, &amp;term) &lt; 0)   
 50log_sys("tty_open: tcgetattr error\n");   
 51term.c_cflag = CS8 ¦ //每字节位数   
 52CREAD ¦ //启动接收器   
 53CLOCAL; //忽略调制解调器状态线   
 54term.c_oflag &amp;=~OPOST; //执行输出处理   
 55term.c_iflag = IXON ¦ IXOFF ¦ //启用启动/暂停:输出流 ¦输入流控制   
 56IGNBRK ¦ //忽略输入行中的终止条件   
 57ISTRIP ¦ //剥夺输入字符至7位   
 58IGNCR; //忽略CR   
 59term.c_lflag &amp;=~(ISIG &amp;brvbarECHO &amp;brvbarICANON &amp;brvbarNOFLSH &amp;brvbarXCLUDE);   
 60term.c_lflag ¦=(ICANON &amp;brvbarECHOE);//设置加工输入方式   
 61  
 62term.c_cc[VMIN]=0;   
 63term.c_cc[VTIME]=1;   
 64term.c_cc[VQUIT]=0x7f;   
 65  
 66cfsetispeed(&amp;term, DEF_BAUD); //设置输入波特率   
 67cfsetospeed(&amp;term, DEF_BAUD); //设置输出波特率   
 68if (tcsetattr(tty1, TCSANOW, &amp;term) &lt; 0)   
 69log_sys("tty_open: tcsetattr error\n");   
 70}   
 71  
 72  
 73void out_buf(void)   
 74{   
 75char *wptr, *rptr;   
 76int wcnt, nread, nwritten,fd=1;   
 77struct timeval timeout;   
 78fd_set rfds, wfds;   
 79FD_ZERO(&amp;wfds);   
 80FD_ZERO(&amp;rfds);   
 81timeout.tv_sec=150;   
 82timeout.tv_usec=0;   
 83wptr=outbuf;//输出缓冲区首地址   
 84ibuf=inputbuf;//输入缓冲区首地址   
 85wcnt=outptr-wptr; //输出缓冲区中字节个数   
 86if (set_nonblock_flag(tty1,1)&lt;0){   
 87log_sys("set nonblock flag fail\n");   
 88}   
 89while (wcnt &gt; 0) {   
 90FD_SET(tty1, &amp;wfds);   
 91FD_SET(tty1, &amp;rfds);   
 92while ((fd=select(tty1+1, &amp;rfds, &amp;wfds, NULL,&amp;timeout)) &lt; 0) {   
 93log_sys("out_buf: select error\n");   
 94}   
 95if (fd==0){   
 96log_sys("timeout for select\n");   
 97}   
 98if (FD_ISSET(tty1, &amp;rfds)) {   
 99if ( (nread = read(tty1, ibuf, IBSIZE)) &lt; 0)   
100log_sys("out_buf: read error\n");   
101ibuf+= nread;   
102}   
103if (FD_ISSET(tty1, &amp;wfds)) {   
104if ( (nwritten = write(tty1, wptr, wcnt)) &lt; 0)   
105log_sys("out_buf: write error\n");   
106wcnt -= nwritten;   
107wptr += nwritten;   
108}   
109}   
110outptr = outbuf; //outptr重新指向输出缓冲区首地址   
111outcnt = OBSIZE;   
112}   
113void out_char(int c)   
114{   
115if (c == EOF) { //遇到结束标志符号时调用out_buf(),发送数据至tty1,   
116out_buf();   
117printf("发送的数据:\n %s \n",outbuf);//测试   
118return;   
119}   
120if (outcnt &lt;= 0)   
121out_buf(); //输出缓冲区满时发送数据至tty1   
122*outptr++ = c; //其他情况保存数据至输出缓冲区   
123outcnt--;   
124}   
125  
126void input_char(void)   
127{   
128int nread,fd;   
129struct timeval timeout;   
130fd_set rfds;   
131FD_ZERO(&amp;rfds);   
132FD_SET(tty1,&amp;rfds);   
133timeout.tv_sec=600;   
134timeout.tv_usec=0;   
135if (set_nonblock_flag(tty1,1)&lt;0){   
136log_sys("set nonblock flag fail\n");   
137}   
138while ((fd=select(tty1 + 1, &amp;rfds, NULL, NULL, &amp;timeout)) &lt;0) {   
139log_sys("receive_char: select error\n");   
140}   
141if (fd==0)   
142printf("time out\n");   
143if ( (nread = read(tty1,ibuf,IBSIZE)) &lt; 0)   
144log_sys("receive_char: read error\n");   
145else if (nread == 0)   
146log_sys("receive_char: read returned 0\n");   
147ibuf+= nread;   
148printf("读到的字符数:%d\n",nread);   
149  
150}   
151void send_char(void)   
152{   
153char c;   
154printf("从键盘输入发送数据\n");   
155while ((c=getchar())!=EOF)   
156out_char(c);//输入字符送入缓冲区   
157out_char(EOF);   
158}   
159void receive_char(void)   
160{   
161char c;   
162printf("等待接收数据\n.......................\n");   
163input_char();   
164printf("接收到的数据:\n %s \n",inputbuf);   
165}   
166  
167  
168main(int argc, char *argv[])   
169{   
170char c;   
171tty_open();   
172printf("按's'键发送数据,否则接收数据\n");   
173if ( (c = getchar())=='s') {   
174send_char();   
175}   
176receive_char();   
177close(tty1);   
178exit(0);   
179}</string.h></stdlib.h></time.h></termios.h></fcntl.h></syslog.h></signal.h></errno.h></sys></sys></stdio.h>
Published At
Categories with 服务器类
Tagged with
comments powered by Disqus