Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inne][PHP]RS485... ogólnie COMx odczyt
Forum PHP.pl > Forum > Przedszkole
beherit
Piszę w przedszkolu, bo choć to część sporej aplikacji to ograniczmy się do minimum:

  1. if(!isset($_SERVER['argv'][1]))
  2. die('Wywolanie: php {FILE_NAME} {PORT_NO}');
  3.  
  4. $port = "COM" . $_SERVER['argv'][1] . ":";
  5. //`mode $port BAUD=115200 PARITY=N data=8 stop=1 xon=off`;
  6.  
  7. $fp = fopen($port,"rb+");
  8.  
  9. stream_set_timeout($fp,0,100);
  10.  
  11. if(!$fp)
  12. die($port . " problem z dostepem.");
  13.  
  14. while(!feof($fp))
  15. print fread($fp,22) . "\n";



I tutaj pojawia się pytanie - czemu dane z COM spływają po około minucie/dwóch od odczytania (w tym konkretnym przypadku chodzi o kartę zbliżeniową). I nie ważne czy pod linuchem (/dev/ttyUSBx czy windą COMx:)
-JohnnyB-
funkcja, którą stworzyłem do odczytu z RS232:
  1. function readSerial() {
  2. if(!$this->open()) return -1;
  3. stream_set_blocking($this->fp,0);
  4. $res='';
  5. $t_start=microtime(true);
  6. do {
  7. $c=fread($this->fp,1);
  8. if($c) $res.=$c;.
  9. $t=microtime(true);
  10. } while($t-$t_start<$this->timeout);
  11. return $res;
  12. }

timeout dobierałem doświadczalnie, w moim przypadku 0,8s; jeśli zadziała możesz spróbować zmiejszyć
beherit
Tak na oko różni się jedynie rzeczami nieistotnymi: długością strumienia (22 zamiast 1), <teoretycznie> niekończącą pętlą bo moje jest wrzucane pod konsolę i stream_set_blocking(), tyle że jak dobrze rozumiem:
<< This function works for any stream that supports non-blocking mode (currently, regular files and socket streams). >>
do portów szeregowych chyba to nie działa.

Na chwilę obecną ten temat zrealizowało się w pythonie ale jestem ciekaw czemu php sobie z tym rady u mnie nie dał...
mls
Po pierwsze - stream_set_blocking działa również dla portów szeregowych (przynajmniej w systemach unixowych).
Po drugie - zawsze do zabaw z portami szeregowymi polecam korzystanie z DIO.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.