Communication serie avec PHP

Bonjour,

j'essaye de me connecté à la classe php_serial.class.php et je reçoit une erreur
Fatal error: Array and string offset access syntax with curly braces is no longer supported in C:\xampp\htdocs\port\php_serial.class.php on line 293
et je ne sais quoi faire
Configuration: Windows / Edge 89.0.774.76

6 réponses

  1. <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <title>Mini-chat</title>
    </head>
    <body>

    <?php

    $comPort = "COM1";

    include ("php_serial.class.php");
    $serial = new phpSerial;
    $serial->deviceSet($comPort);

    // On Windows (10 only?) all mode settings must be done in one go.
    $cmd = "mode " . $comPort . " baud=115200 parity=n data=8 stop=1 to=off xon=off";
    $serial->_exec($cmd);
    $serial->deviceOpen();

    echo "Waiting for data...\n";
    sleep(2);
    $serial->serialflush();

    while(1)
    {
    $read = $serial->readPort();

    if (strlen($read)!=0)
    {
    $fp = fopen("data.txt","w");
    if ($fp!=false)
    {
    fwrite($fp,trim($read));
    fclose($fp);
    }
    }
    }

    ?>

    </body>
    </html>
    0
    1. voilà le code je vous remercie
      0
      1. Contributeur
        merci de lire et d'appliquer les explications en #1.
        0
      2. Contributeur
        se pourrait-il que tu utilises une ancienne version de php_serial.class.php?

        peux-tu partager les lignes 290 à 300 du fichier C:\xampp\htdocs\port\php_serial.class.php?
        0
    2. d'accord

      <?php
      namespace phpSerial;

      define("SERIAL_DEVICE_NOTSET", 0);
      define("SERIAL_DEVICE_SET", 1);
      define("SERIAL_DEVICE_OPENED", 2);

      /**
      • Serial port control class

      *
      • THIS PROGRAM COMES WITH ABSOLUTELY NO WARANTIES !
      • USE IT AT YOUR OWN RISKS !

      *
      • Changes added by Rizwan Kassim <***@***> for OSX functionality
      • default serial device for osx devices is /dev/tty.serial for machines with a built in serial device

      *
      • @author Rémy Sanchez <***@***>
      • @thanks Aurélien Derouineau for finding how to open serial ports with windows
      • @thanks Alec Avedisyan for help and testing with reading
      • @thanks Jim Wright for OSX cleanup/fixes.
      • @copyright under GPL 2 licence
      • /


      class phpSerial
      {
      public $_device = null;
      public $_windevice = null;
      public $_dHandle = null;
      public $_dState = SERIAL_DEVICE_NOTSET;
      public $_buffer = "";
      public $_os = "";

      /**
      • This var says if buffer should be flushed by sendMessage (true) or manualy (false)

      *
      • @var bool
      • /

      public $autoflush = true;

      /**
      • Constructor. Perform some checks about the OS and setserial

      *
      • @return phpSerial
      • /

      public function phpSerial ()
      {
      setlocale(LC_ALL, "en_US");

      $sysname = php_uname();

      if (substr($sysname, 0, 5) === "Linux") {
      $this->_os = "linux";

      if ($this->_exec("stty --version") === 0) {
      register_shutdown_function(array($this, "deviceClose"));
      } else {
      trigger_error("No stty availible, unable to run.", E_USER_ERROR);
      }
      } elseif (substr($sysname, 0, 6) === "Darwin") {
      $this->_os = "osx";
      // We know stty is available in Darwin.
      // stty returns 1 when run from php, because "stty: stdin isn't a
      // terminal"
      // skip this check
      // if($this->_exec("stty") === 0)
      // {
      register_shutdown_function(array($this, "deviceClose"));
      // }
      // else
      // {
      // trigger_error("No stty availible, unable to run.", E_USER_ERROR);
      // }
      } elseif (substr($sysname, 0, 7) === "Windows") {
      $this->_os = "windows";
      register_shutdown_function(array($this, "deviceClose"));
      } else {
      trigger_error("Host OS is neither osx, linux nor windows, unable to run.", E_USER_ERROR);
      exit();
      }
      }

      //
      // OPEN/CLOSE DEVICE SECTION -- {START}
      //

      /**
      • Device set function : used to set the device name/address.
      • -> linux : use the device address, like /dev/ttyS0
      • -> osx : use the device address, like /dev/tty.serial
      • -> windows : use the COMxx device name, like COM1 (can also be used
      • with linux)

      *
      • @param string $device the name of the device to be used
      • @return bool
      • /

      public function deviceSet ($device)
      {
      if ($this->_dState !== SERIAL_DEVICE_OPENED) {
      if ($this->_os === "linux") {
      if (preg_match("@^COM(\d+):?$@i", $device, $matches)) {
      $device = "/dev/ttyS" . ($matches[1] - 1);
      }

      if ($this->_exec("stty -F " . $device) === 0) {
      $this->_device = $device;
      $this->_dState = SERIAL_DEVICE_SET;

      return true;
      }
      } elseif ($this->_os === "osx") {
      if ($this->_exec("stty -f " . $device) === 0) {
      $this->_device = $device;
      $this->_dState = SERIAL_DEVICE_SET;

      return true;
      }
      } elseif ($this->_os === "windows") {
      if (preg_match("@^COM(\d+):?$@i", $device, $matches) and $this->_exec(exec("mode " . $device . " xon=on BAUD=9600")) === 0) {
      $this->_windevice = "COM" . $matches[1];
      $this->_device = "\\.\com" . $matches[1];
      $this->_dState = SERIAL_DEVICE_SET;

      return true;
      }
      }

      trigger_error("Specified serial port is not valid", E_USER_WARNING);

      return false;
      } else {
      trigger_error("You must close your device before to set an other one", E_USER_WARNING);

      return false;
      }
      }

      /**
      • Opens the device for reading and/or writing.

      *
      • @param string $mode Opening mode : same parameter as fopen()
      • @return bool
      • /

      public function deviceOpen ($mode = "r+b")
      {
      if ($this->_dState === SERIAL_DEVICE_OPENED) {
      trigger_error("The device is already opened", E_USER_NOTICE);

      return true;
      }

      if ($this->_dState === SERIAL_DEVICE_NOTSET) {
      trigger_error("The device must be set before to be open", E_USER_WARNING);

      return false;
      }

      if (!preg_match("@^[raw]\+?b?$@", $mode)) {
      trigger_error("Invalid opening mode : ".$mode.". Use fopen() modes.", E_USER_WARNING);

      return false;
      }

      $this->_dHandle = @fopen($this->_device, $mode);

      if ($this->_dHandle !== false) {
      stream_set_blocking($this->_dHandle, 0);
      $this->_dState = SERIAL_DEVICE_OPENED;

      return true;
      }

      $this->_dHandle = null;
      trigger_error("Unable to open the device", E_USER_WARNING);

      return false;
      }

      /**
      • Closes the device

      *
      • @return bool
      • /

      public function deviceClose ()
      {
      if ($this->_dState !== SERIAL_DEVICE_OPENED) {
      return true;
      }

      if (fclose($this->_dHandle)) {
      $this->_dHandle = null;
      $this->_dState = SERIAL_DEVICE_SET;

      return true;
      }

      trigger_error("Unable to close the device", E_USER_ERROR);

      return false;
      }

      //
      // OPEN/CLOSE DEVICE SECTION -- {STOP}
      //

      //
      // CONFIGURE SECTION -- {START}
      //

      /**
      • Configure the Baud Rate
      • Possible rates : 110, 150, 300, 600, 1200, 2400, 4800, 9600, 38400,
      • 57600 and 115200.

      *
      • @param int $rate the rate to set the port in
      • @return bool
      • /

      public function confBaudRate ($rate)
      {
      if ($this->_dState !== SERIAL_DEVICE_SET) {
      trigger_error("Unable to set the baud rate : the device is either not set or opened", E_USER_WARNING);

      return false;
      }

      $validBauds = array (
      110 => 11,
      150 => 15,
      300 => 30,
      600 => 60,
      1200 => 12,
      2400 => 24,
      4800 => 48,
      9600 => 96,
      19200 => 19,
      38400 => 38400,
      57600 => 57600,
      115200 => 115200
      );

      if (isset($validBauds[$rate])) {
      if ($this->_os === "linux") {
      $ret = $this->_exec("stty -F " . $this->_device . " " . (int) $rate, $out);
      }
      if ($this->_os === "osx") {
      $ret = $this->_exec("stty -f " . $this->_device . " " . (int) $rate, $out);
      } elseif ($this->_os === "windows") {
      $ret = $this->_exec("mode " . $this->_windevice . " BAUD=" . $validBauds[$rate], $out);
      } else {
      return false;
      }

      if ($ret !== 0) {
      trigger_error("Unable to set baud rate: " . $out[1], E_USER_WARNING);

      return false;
      }
      }
      }

      /**
      • Configure parity.
      • Modes : odd, even, none

      *
      • @param string $parity one of the modes
      • @return bool
      • /

      public function confParity ($parity)
      {
      if ($this->_dState !== SERIAL_DEVICE_SET) {
      trigger_error("Unable to set parity : the device is either not set or opened", E_USER_WARNING);

      return false;
      }

      $args = array(
      "none" => "-parenb",
      "odd" => "parenb parodd",
      "even" => "parenb -parodd",
      );

      if (!isset($args[$parity])) {
      trigger_error("Parity mode not supported", E_USER_WARNING);

      return false;
      }

      if ($this->_os === "linux") {
      $ret = $this->_exec("stty -F " . $this->_device . " " . $args[$parity], $out);
      } elseif ($this->_os === "osx") {
      $ret = $this->_exec("stty -f " . $this->_device . " " . $args[$parity], $out);
      } else {

      $ret = $this->_exec("mode " . $this->_windevice ." PARITY=".$parity[0], $out);
      }

      if ($ret === 0) {
      return true;
      }

      trigger_error("Unable to set parity : " . $out[1], E_USER_WARNING);

      return false;
      }

      /**
      • Sets the length of a character.

      *
      • @param int $int length of a character (5 <= length <= 8)
      • @return bool
      • /

      public function confCharacterLength ($int)
      {
      if ($this->_dState !== SERIAL_DEVICE_SET) {
      trigger_error("Unable to set length of a character : the device is either not set or opened", E_USER_WARNING);

      return false;
      }

      $int = (int) $int;
      if ($int < 5) {
      $int = 5;
      } elseif ($int > 8) {
      $int = 8;
      }

      if ($this->_os === "linux") {
      $ret = $this->_exec("stty -F " . $this->_device . " cs" . $int, $out);
      } elseif ($this->_os === "osx") {
      $ret = $this->_exec("stty -f " . $this->_device . " cs" . $int, $out);
      } else {
      $ret = $this->_exec("mode " . $this->_windevice . " DATA=" . $int, $out);
      }

      if ($ret === 0) {
      return true;
      }

      trigger_error("Unable to set character length : " .$out[1], E_USER_WARNING);

      return false;
      }

      /**
      • Sets the length of stop bits.

      *
      • @param float $length the length of a stop bit. It must be either 1,
      • 1.5 or 2. 1.5 is not supported under linux and on some computers.
      • @return bool
      • /

      public function confStopBits ($length)
      {
      if ($this->_dState !== SERIAL_DEVICE_SET) {
      trigger_error("Unable to set the length of a stop bit : the device is either not set or opened", E_USER_WARNING);

      return false;
      }

      if ($length != 1 and $length != 2 and $length != 1.5 and !($length == 1.5 and $this->_os === "linux")) {
      trigger_error("Specified stop bit length is invalid", E_USER_WARNING);

      return false;
      }

      if ($this->_os === "linux") {
      $ret = $this->_exec("stty -F " . $this->_device . " " . (($length == 1) ? "-" : "") . "cstopb", $out);
      } elseif ($this->_os === "osx") {
      $ret = $this->_exec("stty -f " . $this->_device . " " . (($length == 1) ? "-" : "") . "cstopb", $out);
      } else {
      $ret = $this->_exec("mode " . $this->_windevice . " STOP=" . $length, $out);
      }

      if ($ret === 0) {
      return true;
      }

      trigger_error("Unable to set stop bit length : " . $out[1], E_USER_WARNING);

      return false;
      }

      /**
      • Configures the flow control

      *
      • @param string $mode Set the flow control mode. Availible modes :
      • -> "none" : no flow control
      • -> "rts/cts" : use RTS/CTS handshaking
      • -> "xon/xoff" : use XON/XOFF protocol
      • @return bool
      • /

      public function confFlowControl ($mode)
      {
      if ($this->_dState !== SERIAL_DEVICE_SET) {
      trigger_error("Unable to set flow control mode : the device is either not set or opened", E_USER_WARNING);

      return false;
      }

      $linuxModes = array(
      "none" => "clocal -crtscts -ixon -ixoff",
      "rts/cts" => "-clocal crtscts -ixon -ixoff",
      "xon/xoff" => "-clocal -crtscts ixon ixoff"
      );
      $windowsModes = array(
      "none" => "xon=off octs=off rts=on",
      "rts/cts" => "xon=off octs=on rts=hs",
      "xon/xoff" => "xon=on octs=off rts=on",
      );

      if ($mode !== "none" and $mode !== "rts/cts" and $mode !== "xon/xoff") {
      trigger_error("Invalid flow control mode specified", E_USER_ERROR);

      return false;
      }

      if ($this->_os === "linux") {
      $ret = $this->_exec("stty -F " . $this->_device . " " . $linuxModes[$mode], $out);
      } elseif ($this->_os === "osx") {
      $ret = $this->_exec("stty -f " . $this->_device . " " . $linuxModes[$mode], $out);
      } else {
      $ret = $this->_exec("mode " . $this->_windevice . " " . $windowsModes[$mode], $out);
      }
      if ($ret === 0) {
      return true;
      } else {
      trigger_error("Unable to set flow control : " . $out[1], E_USER_ERROR);

      return false;
      }
      }

      /**
      • Sets a setserial parameter (cf man setserial)
      • NO MORE USEFUL !
      • -> No longer supported
      • -> Only use it if you need it

      *
      • @param string $param parameter name
      • @param string $arg parameter value
      • @return bool
      • /

      public function setSetserialFlag ($param, $arg = "")
      {
      if (!$this->_ckOpened()) {
      return false;
      }

      $return = exec("setserial " . $this->_device . " " . $param . " " . $arg . " 2>&1");

      if ($return[0] === "I") {
      trigger_error("setserial: Invalid flag", E_USER_WARNING);

      return false;
      } elseif ($return[0] === "/") {
      trigger_error("setserial: Error with device file", E_USER_WARNING);

      return false;
      } else {
      return true;
      }
      }

      //
      // CONFIGURE SECTION -- {STOP}
      //

      //
      // I/O SECTION -- {START}
      //

      /**
      • Sends a string to the device

      *
      • @param string $str string to be sent to the device
      • @param float $waitForReply time to wait for the reply (in seconds)
      • /

      public function sendMessage ($str, $waitForReply = 0.1)
      {
      $this->_buffer .= $str;

      if ($this->autoflush === true) {
      $this->serialflush();
      }

      usleep((int) ($waitForReply * 1000000));
      }

      /**
      • Reads the port until no new datas are availible, then return the content.

      *
      • @pararm int $count number of characters to be read (will stop before
      • if less characters are in the buffer)
      • @return string
      • /

      public function readPort ($count = 0)
      {
      if ($this->_dState !== SERIAL_DEVICE_OPENED) {
      trigger_error("Device must be opened to read it", E_USER_WARNING);

      return false;
      }

      if ($this->_os === "linux" || $this->_os === "osx") {
      // Behavior in OSX isn't to wait for new data to recover, but just grabs what's there!
      // Doesn't always work perfectly for me in OSX
      $content = "";
      $i = 0;

      if ($count !== 0) {
      do {
      if ($i > $count) {
      $content .= fread($this->_dHandle, ($count - $i));
      } else {
      $content .= fread($this->_dHandle, 128);
      }
      } while (($i += 128) === strlen($content));
      } else {
      do {
      $content .= fread($this->_dHandle, 128);
      } while (($i += 128) === strlen($content));
      }

      return $content;
      } elseif ($this->_os === "windows") {
      // Windows port reading procedures still buggy
      $content = "";
      $i = 0;

      if ($count !== 0) {
      do {
      if ($i > $count) {
      $content .= fread($this->_dHandle, ($count - $i));
      } else {
      $content .= fread($this->_dHandle, 128);
      }
      } while (($i += 128) === strlen($content));
      } else {
      do {
      $content .= fread($this->_dHandle, 128);
      } while (($i += 128) === strlen($content));
      }

      return $content;
      }

      return false;
      }

      /**
      • Flushes the output buffer
      • Renamed from flush for osx compat. issues

      *
      • @return bool
      • /

      public function serialflush ()
      {
      if (!$this->_ckOpened()) {
      return false;
      }

      if (fwrite($this->_dHandle, $this->_buffer) !== false) {
      $this->_buffer = "";

      return true;
      } else {
      $this->_buffer = "";
      trigger_error("Error while sending message", E_USER_WARNING);

      return false;
      }
      }

      //
      // I/O SECTION -- {STOP}
      //

      //
      // INTERNAL TOOLKIT -- {START}
      //

      public function _ckOpened()
      {
      if ($this->_dState !== SERIAL_DEVICE_OPENED) {
      trigger_error("Device must be opened", E_USER_WARNING);

      return false;
      }

      return true;
      }

      public function _ckClosed()
      {
      if ($this->_dState !== SERIAL_DEVICE_CLOSED) {
      trigger_error("Device must be closed", E_USER_WARNING);

      return false;
      }

      return true;
      }

      public function _exec($cmd, &$out = null)
      {
      $desc = array(
      1 => array("pipe", "w"),
      2 => array("pipe", "w")
      );

      $proc = proc_open($cmd, $desc, $pipes);

      $ret = stream_get_contents($pipes[1]);
      $err = stream_get_contents($pipes[2]);

      fclose($pipes[1]);
      fclose($pipes[2]);

      $retVal = proc_close($proc);

      if (func_num_args() == 2) {
      $out = array($ret, $err);
      }

      return $retVal;
      }

      //
      // INTERNAL TOOLKIT -- {STOP}
      //
      }
      ?>
      0
      1. voilà ce code merci de votre attention
        0
        1. si possible svp je pourrai avoir un lien qui me permettra de télécharger la nouvelle version de php_serial.class.php
          0