Здравейте
Имам проблем да накарам РНР-то да чете и пише в серийния порт под Линукс.
Какво имам и какво съм направил досега:
Тестова установка 1 - Сървър:
Сървъра е с DSL Linux, 2.4 ядро, XAMPP с като РНР има "--enable-dio", в php.ini e зададено да всички грешки и предупреждения. Имам закачен луупбак на серийния порт. /dev/ttyS0 e с права 666 или rw- rw- rw-. Когато подам:
echo "12345" > /dev/ttyS0
командата:
cat /proc/tty/drivers/serial
ми казва че tx се е увеличило с 5 символа и rx също се е увеличило със 5 символа.
Когато стартирам РНР кода за комуникация, нищо не се получава като резултат и не дава никакви грешки и предупреждения. Просто браузъра върти си там и чака, и нищо не става. Пускам командата:
cat /proc/tty/drivers/serial
ми казва че tx и rx не са се променили.
Тестова установка 1 - Лаптоп:
Сървъра е с Decian Linux, 2.6 ядро, XAMPP (прекопиран от горния сървър) с като РНР има "--enable-dio", в php.ini e зададено да всички грешки и предупреждения. Имам закачен луупбак на серийния порт. /dev/ttyS0 e с права 666 или rw- rw- rw-. Когато подам:
echo "12345" > /dev/ttyS0
командата:
cat /proc/tty/drivers/serial
ми казва че tx и rx не се променят, и имат стойности 0.
Когато стартирам РНР кода за комуникация, и подам стринга "12" (два служебни символа се предават) се получава:
Writing ...
4 bytes written.
Try to read ...Read miss...
Read miss...
Read miss...
Read miss...
Read miss...
Read miss...
не може да чете, но!!! Но пак при подаването на командата:
cat /proc/tty/drivers/serial
ми казва че tx и rx не се променят, и имат стойности 0.
Искам да напиша чиста РНР комуникация със серийния порт използвайки dio. Нужна ми е за софтуер за наблюдение на телефонни централи, за управление на микроконтролери и UPS-и. Искам да стане на РНР защото, критичната маса от потребители на този език вече е прехвърлена и ще е в полза на много хора. При търсенето ми в интернет не попаднах на работещ код.
По този софтуер работят за момента:
Алекс Панов - координатор
Росен Захариев - РНР програмист
Николай - Линукс администрация
Сайт на където ще е изложен кода:
http://www.karatebulgaria.com/alex/Примерен код |
<?php
if(!empty($_POST['command_text'])) { $dio_file_name = "/dev/ttyS0"; $dio_file_desc = dio_open($dio_file_name, O_RDWR);//O_CREAT | O_APPEND, O_WRONLY); dio_tcsetattr($dio_file_desc, array("baud" => 9600, "bits" => 7, "stop" => 2, "parity" => 2)); $text = $_POST['command_text']."*".chr(13); $write_num = dio_write($dio_file_desc, $text); echo "Writing ...<br>";echo "".$write_num." bytes written.<br>"; dio_close($dio_file_desc); sleep(1); echo "Try to read ..."; $dio_file_desc = dio_open($dio_file_name, O_RDWR | O_NOCTTY | O_NONBLOCK); # $dio_file_desc = dio_open($dio_file_name, O_NONBLOCK, O_RDONLY); dio_tcsetattr($dio_file_desc, array("baud" => 9600, "bits" => 7, "stop" => 2, "parity" => 2)); $read_miss_counter = 0; while(($dio_read = dio_read($dio_file_desc, 1)) != chr(13)) { if($dio_read == "") { $read_miss_counter++; if($read_miss_counter == 20) { break; } else { echo "Read miss...<br>"; # sleep(1); } } else { echo "Read \"".$dio_read."\"<br>"; } } dio_close($dio_file_desc);
} else { ?>
<form method = "post"> Въведете команда(без терминиращите символи): <input type = 'text' name = 'command_text' maxlength= '131' value = ""> <input type = "submit" name = "submit_button" value = "Go!"> </form> <?php } ?>
|