Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RS232的C程序仅在启动minicom时起作用_C_Linux_Serial Port - Fatal编程技术网

使用RS232的C程序仅在启动minicom时起作用

使用RS232的C程序仅在启动minicom时起作用,c,linux,serial-port,C,Linux,Serial Port,我正在使用一个RS232通讯程序。到目前为止,该程序运行良好,但在启动该程序之前,我需要启动并退出minicom(并最终关闭硬件流控制) 下面是我用来初始化端口的代码。我已经看过了 并尝试了其他不同的标志/选项,例如显式地将硬件流控制设置为关闭,但没有任何帮助 int open_port(void) { int fd; #ifdef DEBUG printf("open port\n"); #endif fd = open("/dev/ttyS0", O_RDWR

我正在使用一个RS232通讯程序。到目前为止,该程序运行良好,但在启动该程序之前,我需要启动并退出minicom(并最终关闭硬件流控制)

下面是我用来初始化端口的代码。我已经看过了 并尝试了其他不同的标志/选项,例如显式地将硬件流控制设置为关闭,但没有任何帮助

int open_port(void)
{
        int fd;
#ifdef DEBUG
printf("open port\n");
#endif
        fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
        if (fd == -1)
        {
                perror("open_port: Unable to open /dev/ttyS0");
        }
        else
        {
                if (port_set==0){
                        port_set=1;
                        struct termios options;
                        tcgetattr(fd, &options);
                        cfsetispeed(&options, B9600);
                        cfsetospeed(&options, B9600);
                        options.c_cflag |= (CLOCAL | CREAD);
                        tcsetattr(fd, TCSANOW, &options);
                }
        }
        return (fd);
}

对于非规范模式,需要使用宏cfmakeraw来简化所需的各种设置。否则,程序将执行阻塞读取,直到检测到像0x0A这样的终止字符,这可能永远不会被发送。插入这一行

cfmakeraw(&options);// make raw
就在队伍后面

tcgetattr(fd, &options);

代码不起作用怎么办?具体问题是什么?端口集是否在某个可能是全局的地方初始化?对函数调用后的返回值或errno值不感兴趣?难怪没有什么消息。您可以从串行行读取/写入内容,甚至可以使用perl脚本之类的内容,并使用
stty
命令查看和设置所需的选项,以使某些内容正常工作。你有没有关掉佳能,让它处于原始模式?流控制的IXON和IXOFF标志如何。。你真的需要它来买东西吗?用于在主机因某种原因无法为线路提供服务时,仅在大量串行输出或输入时需要它。在程序运行之前必须运行minicom意味着程序无法初始化串行端口。在运行minicom之前和之后,使用shell命令stty-a-F/dev/ttyS0获取端口的所有属性。这些差异显然是您需要在程序中设置的内容。顺便说一句,
if(port\u set==0)
conditional不应该在您的程序中。您无条件地希望在(成功)打开串行端口后初始化它。