我编写了一个程序,可以不断地从自定义硬件的USB串行端口写入和读取。对于每次写入,总会有来自硬件的响应。
有时(以天为单位),每次调用写入都会返回EAGAIN
错误,无论我多少次尝试调用它。
唯一可以在不重启的情况下再次工作的替代方法是向USB端口发出unbind和rebind命令,如:
# echo -n "1-3.2" > /sys/bus/usb/drivers/usb/unbind
# echo -n "1-3.2" > /sys/bus/usb/drivers/usb/bind
我想知道这是自定义硬件中的问题,但我不知道如何证明它,所以我可以要求制造商修复它。
我还可以检查哪些内容以确保代码中没有问题?
以下是端口的打开方式:
int open_port(const char * portname)
{
struct termios termAttr;
struct stat st0;
struct stat st1;
int flock_ret;
int fd;
fd = open(portname, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
printf("Can't open %s. %s", portname,
strerror(errno));
}
else
{
fcntl(fd, F_SETFL, FNDELAY);
tcgetattr(fd, &termAttr);
cfsetispeed(&termAttr, B115200);
cfsetospeed(&termAttr, B115200);
termAttr.c_cflag |= (CLOCAL | CREAD | CS8);
termAttr.c_iflag |= (IGNPAR | IGNBRK);
termAttr.c_cc[VMIN] = 0;
termAttr.c_cc[VTIME] = 0;
tcflush(fd, TCIFLUSH);
if (tcsetattr(fd, TCSANOW, &termAttr) == -1)
{
printf("%s", strerror(errno));
}
}
return fd;
}
这是写作的方式:
void serial_write(int fd, char *comando)
{
int cont = 0;
int bytes_written;
char ret[20];
int lenght;
char cmdfinal[200];
if (!fd)
{
printf("** Error at %s: %s **", __func__, strerror(errno));
return;
}
sprintf(cmdfinal, "%s\r", comando);
lenght = strlen(cmdfinal);
bytes_written = write(fd, cmdfinal, lenght);
//Check for errors
if (bytes_written == -1)
{
if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
{
//Wait so the next call have more chances to work
sleep(5);
}
//Just print the error
printf("%s", strerror(errno));
//Reopen the port
serial_somlcd_close();
serial_somlcd_open();
}
else
{
//Do things w/ response
}
}