1
1楼 kf701 2006-11-21
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 | PARENB); /* 设置为奇效验*/ 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 }
搜索墙@2009 www.pkwall.com all rights reserved QQ:276471788 [京ICP备09111534号]
声明:本站部分数据来源于网络,仅供参考,如有版权问题,请联系我们,我们将及时删除!转载本站请注明来源
| ||||||||||||||||||||||||||||||||||||||||