我正在编写一个嵌入式 Linux 应用程序,它 (1) 打开与另一台设备的串行连接,(2) 发送已知命令,(3) 检查端口是否有传入字符(响应),直到检测到预期的响应短语或字符,(4 ) 重复第 2 步和第 3 步,直到发送了一系列命令并收到响应,(5) 然后关闭端口。
我的应用程序会经历上述序列的一些循环,并且当通信突然停止并且我的软件由于我的内置超时逻辑而出现故障时,它会时不时地等待响应(读取)。
我的端口配置中是否有任何内容会由于发送特定字节(可能是由于电噪声)而导致端口被阻塞?
这是我打开端口的方式(通过 termios.h 显示配置):
struct termios options;
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd == -1) {
debug() << "Port open failed!"
return FAIL;
}
debug() << "Port Opened Successful"
fcntl(fd, F_SETFL, 0); // This setting interacts with VMIN and VTIME below
// Get options
tcgetattr(fd, &options);
// Adjust Com port options
options.c_cflag |= (CLOCAL | CREAD); // Program will not "own" port, enable reading on port
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // Sets RAW input mode (does not treat input as a line of text with CR/LF ending)
options.c_oflag &= ~ OPOST; // Sets RAW ouput mode (avoids newline mapping to CR+LF characters)
options.c_iflag &= ~(IXON | IXOFF | IXANY); // Turns off SW flow c
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;
// Set options
tcsetattr(fd, TCSANOW, &options);
//return fd;
return SUCCEED;
我无法弄清楚为什么当我重新启动设备时通信突然冻结然后又消失了。谢谢大家!
更多信息 - 这是我的读写功能:
int Comm::Receive(unsigned char* rBuf)
{
int bytes;
ioctl(fd, FIONREAD, &bytes);
if (bytes >= 1)
{
bytes = read(fd, rBuf, 1);
if (bytes < 0)
return READ_ERR;
return SUCCEED;
}
else
return NO_DATA_AVAILABLE;
}
int Comm::Send(int xCt, unsigned char* xBuf)
{
int bytes;
if (fd == -1)
return FAIL;
bytes = write(fd, xBuf, xCt);
if (bytes != xCt)
return FAIL;
else
return SUCCEED;
}