我正在编写一个嵌入式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;
}
答案 0 :(得分:1)
欢迎来到串口的乐趣......
思考1:用select()
包装你的阅读电话思考2:取消设置tcsetattr中的ICANON标志,并为故意超时设置VTIME属性(显然,处理它)
思想3:串行通信的功能完美无缺。
答案 1 :(得分:0)
我也遇到了类似的问题,即向设备发送命令并从设备读取响应。请参考下面的SOF帖子和答案,这是我的问题。
在这些情况下,我们必须关注我们将用于设备通信(发送和接收)的协议。如果我们能够成功发送命令并且我们没有收到带有来自设备的噪声的响应,则意味着发送到设备的数据包中存在错误。首先检查协议规范,然后为一个简单的命令创建一个字节数组(比如发出一声嘟嘟声)并发送它。
Send data to a barcode scanner over RS232 serial port
我可以为您做点什么如果您可以使用输出发布完整的源代码。
享受代码。感谢。