|  | 
 
| 这是我改写别人的一个串口通讯的程序,主要是实现PC和电子秤通讯的程序. 当我向电子秤写入02010103的时候,电子秤就应该向PC发送数据呀,但是为什么老读不出数据呀,为什么呢
 #include<stdio.h>      /*标准输入输出定义*/
 #include<stdlib.h>     /*标准函数库定义*/
 #include<unistd.h>     /*Unix 标准函数定义*/
 #include<sys/types.h>
 #include<sys/stat.h>
 #include<fcntl.h>      /*文件控制定义*/
 #include<termios.h>    /*PPSIX 终端控制定义*/
 #include<errno.h>
 #include<iostream>
 #include<string>
 #define FALSE  -1
 #define TRUE   0
 int set_Parity(int fd,int databits,int stopbits,int parity)
 {
 struct termios options;
 // options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
 //  options.c_oflag  &= ~OPOST;   /*Output*/
 if  ( tcgetattr( fd,&options)  !=  0) {
 perror("SetupSerial 1");
 return(FALSE);
 }
 options.c_cflag &= ~CSIZE;
 switch (databits) /*设置数据位数*/
 {
 case 7:
 options.c_cflag |= CS7;                                                                                         break;
 case 8:                                                                                                   options.c_cflag |= CS8;                                                                                 break;
 default:
 fprintf(stderr,"Unsupported data size\n"); return (FALSE);                                                          }
 switch (parity)
 {
 case 'n':
 case 'N':                                                                                               options.c_cflag &= ~PARENB;   /* Clear parity enable */
 options.c_iflag &= ~INPCK;     /* Enable parity checking */                                          break;                                                                                     case 'o':                                                                                               case 'O':                                                                                                 options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/                                               options.c_iflag |= INPCK;   /* Disnable parity checking */                                         break;                                                                                  case 'e':
 case 'E':                                                                                                   options.c_cflag |= PARENB;     /* Enable parity */
 options.c_cflag &= ~PARODD;   /* 转换为偶效验*/                                                      options.c_iflag |= INPCK;       /* Disnable parity checking */                                          break;
 case 'S':                                                                                          case 's':  /*as no parity*/
 options.c_cflag &= ~PARENB;
 options.c_cflag &= ~CSTOPB;
 break;
 default:                                                                                         fprintf(stderr,"Unsupported parity\n");
 return (FALSE);                                                                                          }
 /* 设置停止位*/
 switch (stopbits)
 {
 case 1:
 options.c_cflag &= ~CSTOPB;                                                                                          break;                                                                                            case 2:
 options.c_cflag |= CSTOPB;                                                                                          break;
 default:                                                                                     fprintf(stderr,"Unsupported stop bits\n");                                                               return (FALSE);
 }
 /* Set input parity option */
 if (parity != 'n')
 options.c_iflag |= INPCK;
 tcflush(fd,TCIFLUSH);
 options.c_cc[VTIME] = 0; /* 设置超时15 seconds*/
 options.c_cc[VMIN] = 10; /* Update the options and do it NOW */
 if (tcsetattr(fd,TCSANOW,&options) != 0)
 {
 perror("SetupSerial 3");
 return (FALSE);
 }
 return (TRUE);
 }
 int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
 B38400, B19200, B9600, B4800, B2400, B1200, B300, };
 int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300, 38400,
 19200,  9600, 4800, 2400, 1200,  300, };
 void set_speed(int fd, int speed){
 int   i;
 int   status;
 struct termios   Opt;
 tcgetattr(fd, &Opt);
 for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) {
 if  (speed == name_arr) {
 tcflush(fd, TCIOFLUSH);
 cfsetispeed(&Opt, speed_arr);
 cfsetospeed(&Opt, speed_arr);
 status = tcsetattr(fd, TCSANOW, &Opt);
 if  (status != 0) {
 perror("tcsetattr fd1");
 return;
 }
 tcflush(fd,TCIOFLUSH);
 }
 }
 }
 using namespace std;
 int main(void)
 {
 int fd,nread,nwrite,i;
 char buff[5];
 struct  termios Opt;
 string a,b,c,d,line;
 string cline;
 fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
 if(fd<0)
 {
 cout<<"open serial failed"<<endl;
 exit(1);
 }
 set_speed(fd,9600);
 if(set_Parity(fd,8,2,'N')==FALSE)
 {
 cout<<"set parity error\n";
 exit(0);
 }
 
 a=static_cast<char>(2);
 b="0101";
 d=static_cast<char>(3);
 line=a+b+d;
 cout<<line.c_str()<<endl;
 // cline=line.c_str();
 nwrite=write(fd,line.c_str(),9);
 if(nwrite<0)
 {
 cout<<"send data failed"<<endl;
 }
 while (1) //循环读取数据
 {
 //  fcntl(fd,F_SETFL,FNDELAY);
 nread = read(fd, buff, 1);
 /*        printf("\nLen %d\n",nread);
 buff[nread+1] = '\0';   */
 if(nread<0)
 {
 cout<<"read data failed"<<endl;
 exit(0);
 }
 cout<<nread<<endl;
 }
 close(fd);
 }
 | 
 |