Я заметил что-то странное, но воспроизводимое.
Сначала я проверяю настройки моего последовательного порта:
bash-3.1# stty -F /dev/ttyS0
speed 0 baud; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; start = <undef>;
stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>;
min = 1; time = 0;
-cread
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
Затем меняю скорость на 1200 бит / с:
bash-3.1# stty -F /dev/ttyS0 1200
Я тогдавыполнить этот фрагмент моей программы в функции для изменения скорости передачи:
fd=open(dev,O_NOCTTY | O_NONBLOCK | O_RDWR);
struct termios ser[1];
tcflush(fd,TCIFLUSH);
tcflush(fd,TCOFLUSH);
cfmakeraw(ser);
// I call tcsetattr after each terminal setting to make sure its applied.
if (tcsetattr(fd,TCSANOW,ser) < 0){
return -1;
}
cfsetspeed(ser,B9600);
if (tcsetattr(fd,TCSANOW,ser) < 0){
return -2; //returns this after manually setting port via STTY
}
Проблема в том, что скорость передачи НЕ изменяется должным образом.Фактически, я получаю -2, возвращенное из функции, а strerror (errno) возвращает «ошибку ввода / вывода».
После выполнения программы я проверяю настройки системного порта:
bash-3.1# stty -F /dev/ttyS0
speed 0 baud; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; start = <undef>;
stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; flush = <undef>;
min = 1; time = 0;
-cread
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
И он сбрасывается до нуля бит / с, даже если я специально просил 9600 бит / с.
Почему он это делает?и как мне заставить скорость перейти на 9600bps программно?