无法在C中设置Linux中的串口配置

时间:2013-03-04 00:58:29

标签: c linux serial-port

我已经编写了一些Linux程序来管理我的设备。我对Windows的程序“相同”(“相同”因为它的逻辑相同)。 我正在使用8N2数据帧格式@ 9600 bps,既没有软件(XOn / XOff)也没有硬件(RTS / CTS)流量控制。我不使用RS-232 9针D-sub的DTR,DCD,RI,DSR引脚。我只使用RX和TX引脚与我的设备通信。 在Linux中我有这部分代码:

 struct termios PortOpts, result;
 int fd; /* File descriptor for the port */

/* Configure Port */
 tcgetattr(fd, &PortOpts);
 // BaudRate - 9600
 cfsetispeed(&PortOpts, B9600);
 cfsetospeed(&PortOpts, B9600);
 // enable reciever and set local mode, frame format - 8N2, no H/W flow control
 PortOpts.c_cflag &= (~(CLOCAL | CREAD | CSIZE | CSTOPB));
 PortOpts.c_cflag |= ((CLOCAL | CREAD | CS8 | CSTOPB) & (~PARENB));
 PortOpts.c_cflag &= (~CRTSCTS);
// PortOpts.c_cflag &= ~PARENB
// PortOpts.c_cflag |= CSTOPB
// PortOpts.c_cflag &= ~CSIZE;
// PortOpts.c_cflag |= CS8;
 // no parity check, no software flow control on input
 PortOpts.c_iflag |= IGNPAR;
 PortOpts.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IXANY | INPCK);
 // raw data input mode
 PortOpts.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
 // raw data output
 PortOpts.c_oflag &= ~OPOST;
 // setting timeouts
 PortOpts.c_cc[VMIN] = 1; // minimum number of chars to read in noncanonical (raw mode)
 PortOpts.c_cc[VTIME] = 5; // time in deciseconds to wait for data in noncanonical mode (raw mode)

 if (tcsetattr(fd, TCSANOW, &PortOpts) ==  0) {
    tcgetattr(fd, &result);
    if ( (result.c_cflag != PortOpts.c_cflag) ||
         (result.c_oflag != PortOpts.c_oflag) ||
         (result.c_iflag != PortOpts.c_iflag) ||
         (result.c_cc[VMIN] != PortOpts.c_cc[VMIN]) ||
         (result.c_cc[VTIME] != PortOpts.c_cc[VTIME]) ) {
        perror("While configuring port1");
        close(fd);
        return 1;
    }
 } else {
    perror("While configuring port2");
    close(fd);
    return 1;
 };

文件描述符'fd'用于'/ dev / ttyS0'设备。 我收到了这条消息:配置port2时:输入/输出错误 我有一台笔记本电脑,但我没有任何串口,除了USB。这是一个原因吗? 我以'root'的身份运行程序。

抱歉我的英语不好。

1 个答案:

答案 0 :(得分:1)

你可以在程序上运行strace;这将更详细地说明IO错误发生的位置。

要记住一件事 - 错误不会被重置,因此实际错误可能来自于perror之前的任何系统调用。