Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PHP obsługuje port COM[x] :)
Widmo
post
Post #1





Grupa: Zarejestrowani
Postów: 136
Pomógł: 0
Dołączył: 25.05.2003

Ostrzeżenie: (0%)
-----


Witam,
potrzebuje dostać się do mojego urzadzenia przez port COM.
Znalazlem DLLke która obsługuje porty COM z poziomu PHP.

( http://www.easyvitools.com/phpserial/php_ser_SMS.html )

Mam manual do urządzenia ale brakuje mi troche doświadczenia z obsługą hardwaru.

http://widmo.biz/tmp/rw_protocol_eng.pdf

Oto moje wypociny (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

  1. <?php
  2. ser_open('COM1', 9600, 8, 'none', 1, 'none' ); 
  3.  
  4. $str = ser_isopen();
  5. echo "Otwarte: $str<hr>";
  6.  
  7. echo ser_write( "0x02" ); // STX
  8.  
  9. echo ser_readbyte() . '<hr>'; // TU POWINNO BYĆ ACK
  10.  
  11. $seq = '0x00'; // kolejny numer
  12. $cmd = '0x60'; // komenda ( buzzer )
  13. $len = '0x00'; // dlugosc $dat
  14. $dat = '0x00'; // data
  15. $bcc = $seq xor $cmd xor $len xor $dat; // wyliczenie XOR
  16.  
  17. echo 'BCC: ' . $bcc . '<hr>';
  18.  
  19. ser_write( "x00x60x00x00" . $bcc . "x03"); // wyslanie komendy
  20.  
  21.  
  22. echo ser_readbyte() . '<hr>';
  23. ?>


Wynikiem jest to:
  1. Otwarte: COM1 9600 8 None 1 None
  2. ---------
  3. 21
  4. ---------
  5. BCC: 0x00
  6. ---------
  7. 21
  8. ---------


Czy nie znalazł by się ktoś kto pokazał by mi wzorzec jak powinna wyglądać pełna komenda z komentarzami?
Aktualnie w przykładzie wyżej staram się zmusić urzadzenie do wydania dziwięku ( 0x06 )

Wielkie dzięki za wszelką pomoc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Widmo 21.08.2008, 14:58:50
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
elemek
post
Post #2





Grupa: Zarejestrowani
Postów: 71
Pomógł: 24
Dołączył: 14.08.2008

Ostrzeżenie: (0%)
-----


  1. <?php
  2. /**
  3.  * Klasa do komunikacji z urządzeniem RHMMF1RW
  4.  * @author Lmshad@wp.pl
  5.  */
  6. class RHMMF1RW {
  7. const STX = "x02";
  8. const ETX = "x03";
  9. const ACK = "x06";
  10. const NAK = "x15";
  11.  
  12. /**
  13.  * Creates new connection to RHMMF1RW device using specified communication port.
  14.  *
  15.  * @param string $com communication port ex. COM1
  16.  */
  17. public function __construct() {
  18. ser_open('COM1', 9600, 8, 'none', 1, 'none' );
  19. $str = ser_isopen();
  20. echo "Otwarte: $str";
  21. }
  22.  
  23. /**
  24.  * Send command to RHMMF1RW device.
  25.  *
  26.  * @param int $seq hex sequence number ex. 0x00 
  27.  * @param int $cmd hex command number ex. 0x60
  28.  * @param string $data command data.
  29.  * @return bool|array array of result data or false if failed.
  30.  */
  31. public function command($seq, $cmd, $data = '') {
  32. ser_write(self::STX);
  33. if (($ack = chr(ser_readbyte())) != self::ACK) {
  34. return false;
  35. }
  36. $bcc = 0x00;
  37. $block = chr($seq) . chr($cmd) . chr(strlen($data)) . $data;
  38. foreach (str_split($block) as $byte) {
  39. $bcc ^= ord($byte);
  40. }
  41. $block .= chr($bcc) . self::ETX;
  42. echo ser_write($block);
  43.  
  44. if (($ack = chr(ser_readbyte())) != self::STX) {
  45. return false;
  46. }
  47.  
  48. echo ser_write(self::ACK);
  49.  
  50. $result['data'] = '';
  51. $result['seq'] = ser_readbyte();
  52. $result['status'] = ser_readbyte();
  53. $len = ser_readbyte();
  54. while ($len-- > 0) {
  55. $result['data'] .= chr(ser_readbyte());
  56. }
  57. $bcc = ser_readbyte();
  58. $etx = ser_readbyte();
  59. return $result;
  60. }
  61.  
  62. }
  63.  
  64. $dev = new RHMMF1RW();
  65. $dev -> command(0x00, 0x60);
  66. ?>


Ten post edytował elemek 22.08.2008, 08:44:51
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 11.10.2025 - 17:58