不累的王
普通会员
发贴: 339
积分: 0
来自:
注册日期: 2006-05-26
发表时间: 2007-01-31 16:26:22
--------------------------------------------------------------------------------
andy 是否依然需要它?
1 #include <stdio.h> /*标准输入输出定义*/
2 #include <stdlib.h> /*标准函数库定义*/
3 #include <unistd.h> /*Unix 标准函数定义*/
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h> /*文件控制定义*/
7 #include <termios.h> /*PPSIX 终端控制定义*/
8 #include <errno.h> /*错误号定义*/
10 /*********************************************************************/
11 #define FALSE -1
12 #define TRUE 0
13 /*********************************************************************/
14 int OpenDev(char *Dev)
15 {
16 int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
17 if (-1 == fd)
18 {
19 perror("Can't Open Serial Port";
20 return -1;
21 }
22 else
23 return fd;
24 }
26 /*
27 *@brief 设置串口通信速率
28 *@param fd 类型 int 打开串口的文件句柄
29 *@param speed 类型 int 串口速度
30 *@return void
31 */
32 speed_t speed_arr[] = { B230400, B115200, B57600, B38400, B19200,
33 B9600, B4800, B2400, B1200, B300, };
34 int name_arr[] = { 230400, 115200, 57600, 38400, 19200,
35 9600, 4800, 2400, 1200, 300, };
36
37 void set_speed(int fd, int speed)
38 {
39 int i;
40 int status;
41 struct termios Opt;
42 tcgetattr(fd, &Opt);
43 for ( i= 0; i < sizeof(speed_arr)/sizeof(int); i++ )
44 {
45 if (speed == name_arr[i])
46 {
47 tcflush(fd, TCIOFLUSH);
48 cfsetispeed(&Opt, speed_arr[i]);
49 cfsetospeed(&Opt, speed_arr[i]);
50 status = tcsetattr(fd, TCSANOW, &Opt);
51 if (status != 0)
52 {
53 perror("tcsetattr fd1";
54 return;
55 }
56 tcflush(fd,TCIOFLUSH);
57 }
58 }
59 }
61 /*
62 *@brief 设置串口数据位,停止位和效验位
63 *@param fd 类型 int 打开的串口文件句柄
64 *@param databits 类型 int 数据位 取值 为 7 或者8
65 *@param stopbits 类型 int 停止位 取值为 1 或者2
66 *@param parity 类型 int 效验类型 取值为N,E,O,,S
67 */
68 int set_Parity(int fd,int databits,int stopbits,int parity)
69 {
70 struct termios options;
71 if ( tcgetattr( fd,&options) != 0)
72 {
73 perror("SetupSerial 1";
74 return(FALSE);
75 }
76 options.c_cflag &= ~CSIZE;
77 switch (databits) /*设置数据位数*/
78 {
79 case 7:
80 options.c_cflag |= CS7;
81 break;
82 case 8:
83 options.c_cflag |= CS8;
84 break;
85 default:
86 fprintf(stderr,"Unsupported data size\n";
87 return (FALSE);
88 }
89 switch (parity)
90 {
91 case 'n':
92 case 'N':
93 options.c_cflag &= ~PARENB; /* Clear parity enable */
94 options.c_iflag &= ~INPCK; /* Enable parity checking */
95 break;
96 case 'o':
97 case 'O':
98 options.c_cflag |= (PARODD | PAREN; /* 设置为奇效验*/
99 options.c_iflag |= INPCK; /* Disnable parity checking */
100 break;
101 case 'e':
102 case 'E':
103 options.c_cflag |= PARENB; /* Enable parity */
104 options.c_cflag &= ~PARODD; /* 转换为偶效验*/
105 options.c_iflag |= INPCK; /* Disnable parity checking */
106 break;
107 case 'S':
108 case 's': /*as no parity*/
109 options.c_cflag &= ~PARENB;
110 options.c_cflag &= ~CSTOPB;
111 break;
112 default:
113 fprintf(stderr,"Unsupported parity\n";
114 return (FALSE);
115 }
116 /* 设置停止位*/
117 switch (stopbits)
118 {
119 case 1:
120 options.c_cflag &= ~CSTOPB;
121 break;
122 case 2:
123 options.c_cflag |= CSTOPB;
124 break;
125 default:
126 fprintf(stderr,"Unsupported stop bits\n";
127 return (FALSE);
128 }
129 /* Set input parity option */
130 if (parity != 'n')
131 options.c_iflag |= INPCK;
132 tcflush(fd,TCIFLUSH);
133 options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
134 options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
135 if (tcsetattr(fd,TCSANOW,&options) != 0)
136 {
137 perror("SetupSerial 3";
138 return (FALSE);
139 }
140 return (TRUE);
141 }
144 int main(int argc, char **argv)
145 {
146 int fd;
147 int nread;
148 char buff[512];
149 char *dev = "/dev/ttyS0";
150 fd = OpenDev(dev);
151 if( -1 == fd )
152 {
153 return 1;
154 }
155 printf("open %s ok\n", dev);
156
157 set_speed(fd,115200);
158 if (set_Parity(fd,8,1,'N') == FALSE)
159 {
160 printf("Set Parity Error\n";
161 exit (0);
162 }
163 printf("Set Parity ok\n";
164
165 while (1) //循环读取数据
166 {
167 while((nread = read(fd, buff, 512))>0)
168 {
169 printf("\nLen %d\n",nread);
170 buff[nread - 1] = '\0';
171 printf( "%s\n", buff);
172 }
173 }
174 close(fd);
175 exit (0);
176 }
<---- 以上言论仅代表本人立场 ---->
__________________
“……机器人罗诺,现在我要对你下达最新指令了。”
“是,主人。我都等了三万年了呢。”
“你还记得回地球的航路吧?”
esoul
普通会员
发贴: 64
积分: 0
来自:
注册日期: 2006-05-24
发表时间: 2007-02-13 10:55:14
--------------------------------------------------------------------------------
好,这东西我也需要!
<---- 以上言论仅代表本人立场 ----> |
|