Проблемы с функцией dio_write

mrsol

Новичок
Проблемы с функцией dio_write

Операционка linux. PHP версия 5.1
Пытаюсь подключится на ком порт /dev/ttyS1 к мобиле через библиотеку dio из набора pecl.
Соединение создает, установки устанавливает, статус получает, соединение закрыват.
Но когда при открытом соединении пытаюсь отправить at команды для мобилы, то от ней неприходят никакие ответы.
Через minicom работает нормально.
После отправки команды, dio_write($tdd, "AT\n"), пытаюсь прочитать ответ через dio_read($tdd, 1000). Но никаких данных не приходит. Если соединение в nonblock. То цикл из десяти чтейний пролетает моментально. Если стоит в блокируешем режиме, то ожидает прихода данных, то есть висит. При этом во время "висения/ожидания", подключаюсь через minicom, так-как порт не блокирую, то соединение проходит, и ответы которые должны вывестись в minicom, появляются в буфере скрипта.
То есть из этого получается, что dio_write, не отправляет нормально данные.
Через fopen, fread, fwrite, fclose. Работает нормально. Но там нехватает функций установок параметров порта.
Может быть это из-за того, что я взял библиотеку от версии 5.0, и скомпилил под 5.1?
Или может быть в dio_write, нужно как-то по определенному передавать данные, в мане и в инете ничего путного не нашол.
Вот код.
PHP:
$tdd = dio_open('/dev/ttyS1', O_WRONLY | O_RDONLY);
//Пытался разные варианты открытия
//O_RDWR | O_NOCTTY | O_NONBLOCK и во всяких вариантах
echo "open_dio<br>";
dio_tcsetattr($tdd, array('baud' => 19200, 'bits' => 8, 'stop'  => 1, 'parity' => 0)); 
//Настройки выставленны как в minicom
echo "dio setup <br>";
$dttt2 = dio_fcntl($tdd, F_SETFL, O_SYNC);
//Пытался разные варианты открытия
//O_SYNC O_ASYNC и вообще не использовать
echo "dttt2='".$dttt2."'<br>";
$aa = dio_write($tdd, "AT".chr(0x0D));
//Пытался разные окончания "\n" или "\r\n" 
echo "aa='".$aa."'<br>";
//Выводит кол-во байт посланных в порт
echo "dio write <br>";
ob_flush();
for($x=1; $x<=10; $x++){
  $fp = dio_read($tdd, 10);
  echo "x='".$x."' read old bufer='".$fp."' <Br>";
  //Не выводит ничего, если только не подключится c minicom
  ob_flush();
} 
dio_close($tdd);
Вот такое вот получается. Как с этим справится? В чём может быть проблема?
 

fast2111

Новичок
Знаю что сильно опаздал...
но мож кому пригодиться:
не dio_write($tdd, "AT\n")
а dio_write($tdd, "AT\r")
Есть модем?
PHP:
$fd = fopen("COM1", "w+");  // /dev/ttyS0  
fwrite($fd, "at+gmm\r");      
echo "response = " . fread($fd, 1024) . "\n";      
fclose($fd);
PS. Порт не должен быть занят.
 

fast2111

Новичок
А в чем разница работы с этими дровами для "пользователя"?

Если я не чего не путаю то "AT".chr(0x0D) и "AT\n" разницы нет, но
если снова не ошибаюсь (AT != at)
PHP:
echo "AT = " . ord("A") . " " . ord("T") . "\n"; 
echo "at = " . ord("a") . " " . ord("t") . "\n";
AT = 65 84
at = 97 116

Я не чего не утверждаю, но уменя на винде на COM4 на модеме Ubiquam 200 команда "at+gmm\r" работает.
PS. Правда надо сначало проверить что модем вообще опрашивается (Свойства->Диагностика) :)
 

mrsol

Новичок
Во первых практически все AT устройства, модемы, джсм-модули и т.д. не чувствительны к регистру.
То есть им по барабану что написать AT или at . Конечно есть исключения, но это узконаправленные устройства.

Во вторых я не понял, при чем тут какой-то "пользователь" :) . Может имелось ввиду программер?

А в третьих, разница в том, что мне не удалось заставить работать дрова на никс системах. Об этом и был мой вопрос первоначально. А то что оно работает на Вин платформе, мне ничего не дает. Это технически два разных модуля.
 
Сверху