我以下列方式从打开的串行端口读取某些数据时遇到麻烦。我已经多次使用此代码实例,并且一切正常,但是现在,由于某种原因,我无法弄清楚,我完全无法从串行端口读取任何内容。
我能够写,并且在另一端正确接收了所有消息,但是从未收到答复(正确发送)(不,电缆都还好;))
我用来打开串行端口的代码如下:
fd = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK | O_NOCTTY); if (fd == -1) { Aviso("Unable to open port"); return (fd); } else { //Get the current options for the port... bzero(&options, sizeof(options)); /* clear struct for new port settings */ tcgetattr(fd, &options); /*-- Set baud rate -------------------------------------------------------*/ if (cfsetispeed(&options, SerialBaudInterp(BaudRate))==-1) perror("On cfsetispeed:"); if (cfsetospeed(&options, SerialBaudInterp(BaudRate))==-1) perror("On cfsetospeed:"); //Enable the receiver and set local mode... options.c_cflag |= (CLOCAL | CREAD); options.c_cflag &= ~PARENB; /* Parity disabled */ options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSIZE; /* Mask the character size bits */ options.c_cflag |= SerialDataBitsInterp(8); /* CS8 - Selects 8 data bits */ options.c_cflag &= ~CRTSCTS; // disable hardware flow control options.c_iflag &= ~(IXON | IXOFF | IXANY); // disable XON XOFF (for transmit and receive) options.c_cflag |= CRTSCTS; /* enable hardware flow control */ options.c_cc[VMIN] = 0; //min carachters to be read options.c_cc[VTIME] = 0; //Time to wait for data (tenths of seconds) //Set the new options for the port... tcflush(fd, TCIFLUSH); if (tcsetattr(fd, TCSANOW, &options)==-1) { perror("On tcsetattr:"); } PortOpen[ComPort] = fd; } return PortOpen[ComPort];
端口初始化后,我通过简单的write命令向其中写入一些内容。
int nc = write(hCom, txchar, n);
hCom是文件描述符(没关系),并且(如我所说)可以工作。但是…当我随后进行读取时,我从errno收到“资源暂时不可用”错误。
我测试了select以查看何时未读取文件描述符…但是它总是超时!
我这样读取数据:
ret = read(hCom, rxchar, n);
我总是得到一个EAGAIN,我也不知道为什么。
硬件工作正常!我可以看到串行端口上有入站数据,因为我已经制作了一条调试电缆来读取另一个终端上发生的事情。所以…
我知道非阻塞应该做什么。我的问题是…为什么什么都没有读!相同的设置在Windows上可以正常工作,因此所有硬件都可以正常工作…
这真让我发疯!我敢肯定这很简单!我什至尝试摆脱O_NONBLOCK来看看什么时候可以收到东西…但是什么都没有…
阅读此。
使用O_NONBLOCK选择了EAGAIN非阻塞I / O,并且没有数据可立即读取。