1.
options.c_oflag |= (SPEED | CS8 | CLOCAL | CREAD);
options.c_iflag |= (SPEED | CS8 | CLOCAL | CREAD);
Эти наборы битов совсем не для этих членов структуры.
Получите не то, что хотите:
oflag: olcuc, onlcr, ocrnl, onocr, onlret, tab1, ofdel
iflag: brkint, ignpar, parmrk, inpck, istrip, ixany, igncr
2.
options.c_cflag |= (SPEED | CS8 | CLOCAL | CREAD);
Раз уже options не обнулён, то где маска для speed и cs?
3.
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // disable ECHO
ECHONL, IEXTEN?
После такого изменения осциллограмма похожа на 0xff:
--- /tmp/test485.c 2011-08-08 18:12:24.000000000 +0400
+++ test485.c 2011-08-08 18:21:42.000000000 +0400
@@ -22,13 +22,20 @@
return 1;
}
// set port options
+#if 0
tcgetattr(fd, &options);
+#endif
+ memset(&options, 0, sizeof(struct termios));
+
cfsetispeed(&options, SPEED);
cfsetospeed(&options, SPEED);
+
options.c_cflag |= (SPEED | CS8 | CLOCAL | CREAD);
+#if 0
options.c_oflag |= (SPEED | CS8 | CLOCAL | CREAD);
options.c_iflag |= (SPEED | CS8 | CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // disable ECHO
+#endif
tcsetattr(fd, TCSANOW, &options);
fsync(fd);