open()阻止尝试打开串行端口 < >我有一个简单的C++工具,它运行为守护进程,并将连续地从Debian下的串行端口读取数据(在这种情况下,Raspbian,因为它在RasBurReMi上运行)。 问题在于,当涉及到代码的open()语句时,该工具显然

open()阻止尝试打开串行端口 < >我有一个简单的C++工具,它运行为守护进程,并将连续地从Debian下的串行端口读取数据(在这种情况下,Raspbian,因为它在RasBurReMi上运行)。 问题在于,当涉及到代码的open()语句时,该工具显然,c++,serial-port,raspberry-pi,C++,Serial Port,Raspberry Pi,open()阻止尝试打开串行端口 < >我有一个简单的C++工具,它运行为守护进程,并将连续地从Debian下的串行端口读取数据(在这种情况下,Raspbian,因为它在RasBurReMi上运行)。 问题在于,当涉及到代码的open()语句时,该工具显然会阻止该过程。“top”中没有可见的处理时间,它只是挂起。无论是哪个用户(甚至根用户)执行它,也不管是否检查了串行端口的访问权限,都会发生这种情况。它发生在任何(内部或USB)串行端口上。一旦我启动、配置并退出minicom或该端口上的屏幕,它

open()阻止尝试打开串行端口 < >我有一个简单的C++工具,它运行为守护进程,并将连续地从Debian下的串行端口读取数据(在这种情况下,Raspbian,因为它在RasBurReMi上运行)。 问题在于,当涉及到代码的open()语句时,该工具显然会阻止该过程。“top”中没有可见的处理时间,它只是挂起。无论是哪个用户(甚至根用户)执行它,也不管是否检查了串行端口的访问权限,都会发生这种情况。它发生在任何(内部或USB)串行端口上。一旦我启动、配置并退出minicom或该端口上的屏幕,它就会工作。 有人知道我做错了什么或错过了什么吗? 以下是阻塞语句之前的代码,包括和排除的注释:

int main(void)
{
pid_t pid, sid;
pid = fork();
if (pid < 0) {
    exit(EXIT_FAILURE);
}
if (pid > 0) {
    std::cout << "\n" << pid;
    exit(EXIT_SUCCESS);
}
umask(0);
sid = setsid();
if (sid < 0) {
    /* Log the failure */
    exit(EXIT_FAILURE);
}

if ((chdir("/")) < 0) {
    /* Log the failure */
    exit(EXIT_FAILURE);
}

    close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);


int tty_fd;
struct termios tio;

unsigned char c = 0;

//const char *device = "/dev/ttyUSB0";
const char *device = "/dev/ttyAMA0";

tty_fd = open(device, O_RDONLY | O_NOCTTY);  //<-- Seems to hang here!
if(tty_fd < 0){
    perror("Error opening Serial Port: ");
}
etc....
int main(无效)
{
pid_t pid,sid;
pid=fork();
if(pid<0){
退出(退出失败);
}
如果(pid>0){

std::无法将O_NONBLOCK添加到打开选项?但您确定要打开以避免阻塞吗?您可以稍后使用
fcntl()
O_GETFL
O_SETFL
取消O_NONBLOCK。请注意,
perror()
在尝试打开串行端口后运行,标准错误没有打开的文件描述符,因此您将永远看不到该消息。通常,您会保持标准错误打开,直到有另一个文件描述符可用;然后使用
dup2()
更改标准错误的含义。在stderr上也一样,首先调试程序,然后对其进行守护。更好的是,添加一个选项来切换守护程序模式。我尝试将O_NONBLOCK添加到打开选项中,导致程序仍然挂起,但现在使用了约98%的CPU,这会消耗处理时间。如果我添加fcntl()打开程序后的部分不会使用任何CPU时间,就像以前一样。在这两种情况下,都不会达到简单的cout语句。(我还从中取出了守护进程部分。)使用“lsmod”验证usb模块是否已加载.我想他们是ftdi_sio和usbserial,它们是按需加载的。我猜minicom能够触发加载,然后您的工具就可以使用它了。