各位高手:
我是一个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&=~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)) < 0)
48log_sys("tty_open: open error\n");
49if (tcgetattr(tty1, &term) < 0)
50log_sys("tty_open: tcgetattr error\n");
51term.c_cflag = CS8 ¦ //每字节位数
52CREAD ¦ //启动接收器
53CLOCAL; //忽略调制解调器状态线
54term.c_oflag &=~OPOST; //执行输出处理
55term.c_iflag = IXON ¦ IXOFF ¦ //启用启动/暂停:输出流 ¦输入流控制
56IGNBRK ¦ //忽略输入行中的终止条件
57ISTRIP ¦ //剥夺输入字符至7位
58IGNCR; //忽略CR
59term.c_lflag &=~(ISIG &brvbarECHO &brvbarICANON &brvbarNOFLSH &brvbarXCLUDE);
60term.c_lflag ¦=(ICANON &brvbarECHOE);//设置加工输入方式
61
62term.c_cc[VMIN]=0;
63term.c_cc[VTIME]=1;
64term.c_cc[VQUIT]=0x7f;
65
66cfsetispeed(&term, DEF_BAUD); //设置输入波特率
67cfsetospeed(&term, DEF_BAUD); //设置输出波特率
68if (tcsetattr(tty1, TCSANOW, &term) < 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(&wfds);
80FD_ZERO(&rfds);
81timeout.tv_sec=150;
82timeout.tv_usec=0;
83wptr=outbuf;//输出缓冲区首地址
84ibuf=inputbuf;//输入缓冲区首地址
85wcnt=outptr-wptr; //输出缓冲区中字节个数
86if (set_nonblock_flag(tty1,1)<0){
87log_sys("set nonblock flag fail\n");
88}
89while (wcnt > 0) {
90FD_SET(tty1, &wfds);
91FD_SET(tty1, &rfds);
92while ((fd=select(tty1+1, &rfds, &wfds, NULL,&timeout)) < 0) {
93log_sys("out_buf: select error\n");
94}
95if (fd==0){
96log_sys("timeout for select\n");
97}
98if (FD_ISSET(tty1, &rfds)) {
99if ( (nread = read(tty1, ibuf, IBSIZE)) < 0)
100log_sys("out_buf: read error\n");
101ibuf+= nread;
102}
103if (FD_ISSET(tty1, &wfds)) {
104if ( (nwritten = write(tty1, wptr, wcnt)) < 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 <= 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(&rfds);
132FD_SET(tty1,&rfds);
133timeout.tv_sec=600;
134timeout.tv_usec=0;
135if (set_nonblock_flag(tty1,1)<0){
136log_sys("set nonblock flag fail\n");
137}
138while ((fd=select(tty1 + 1, &rfds, NULL, NULL, &timeout)) <0) {
139log_sys("receive_char: select error\n");
140}
141if (fd==0)
142printf("time out\n");
143if ( (nread = read(tty1,ibuf,IBSIZE)) < 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>