在Linux下使用串行端口(Multi-I / O控制器)

时间:2017-04-03 17:55:44

标签: c linux serial-port

我有Linux Mint 18.1 x64和PCI 9835 Multi-I / O控制器。 我使用/ dev / ttyS4和/ dev / ttyS5端口与我的设备交换(一次只有一个端口)。当我使用/ dev / ttyS5时,一切都是正确的。

但是当我使用/ dev / ttyS4时,我得到了一个奇怪的行为。有时,重启后端口会发生变化。首先。从端口到端口的一些端口选项是不同的!为什么?第二个。当我使用write()时,我经常得到错误5(输入/输出错误)(几乎所有时间)。

此外,我知道,我的程序的行为取决于DCD线路状态。如果我没有连接任何电缆或连接部分电缆(未满),我的程序工作正常。如果我连接完整的电缆,我看到错误!但是,如果我将电缆末端的DCD线连接到GND或V-,我的程序也能正常工作。

当我测试我的程序时,我已断开电缆与设备的连接。 CuteCom和minicom工作正常。请看我的程序。它是简化的测试代码。我有两个控制器。两者都有相同的行为。有什么问题?

为什么stty有时会返回错误? 我从我的代码中删除了错误处理以使其更具可读性。但它有:)

uname -a
Linux intel 4.4.0-71-generic #92-Ubuntu SMP Fri Mar 24 12:59:01 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

dmesg | grep tty
[   11.726824] 0000:02:02.0: ttyS4 at I/O 0xe050 (irq = 18, base_baud = 115200) is a 16550A
[   11.747864] 0000:02:02.0: ttyS5 at I/O 0xe040 (irq = 18, base_baud = 115200) is a 16550A


lspci -v
02:02.0 Communication controller: MosChip Semiconductor Technology Ltd. PCI 9835 Multi-I/O Controller (rev 01)
    Subsystem: LSI Logic / Symbios Logic 1P2S
    Flags: medium devsel, IRQ 18
    I/O ports at e050 [size=8]
    I/O ports at e040 [size=8]
    I/O ports at e030 [size=8]
    I/O ports at e020 [size=8]
    I/O ports at e010 [size=8]
    I/O ports at e000 [size=16]
    Kernel driver in use: parport_serial
    Kernel modules: parport_serial

stty -g -F /dev/ttyS4
0:0:14b2:0:3:1c:7f:15:1:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

stty -g -F /dev/ttyS5
500:5:cbd:8a3b:3:1c:7f:15:4:0:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

stty -a -F /dev/ttyS4
speed 115200 baud;stty: /dev/ttyS4: Input/output error

stty -a -F /dev/ttyS4
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O;
min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke -flusho -extproc

stty -a -F /dev/ttyS5
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O;
min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
...
struct termios options;

fd = open(comName, O_RDWR | O_NOCTTY | O_NONBLOCK);

tcflush(fd, TCIOFLUSH);

tcgetattr(fd, &options)

cfsetispeed(&options, speed);
cfsetospeed(&options, speed);

options.c_cc[VTIME] = 1;
options.c_cc[VMIN] = 60;

options.c_cflag |= CREAD;
options.c_cflag |= CLOCAL;
options.c_cflag &= ~CRTSCTS;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~PARENB;

options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_iflag |= IGNBRK;

options.c_lflag = 0;
options.c_oflag = 0;

tcsetattr(fd, TCSANOW, &options);
...

0 个答案:

没有答案