DevIo.pm - defining serial port parameters

Begonnen von oliv06, 17 Oktober 2013, 22:30:37

Vorheriges Thema - Nächstes Thema

oliv06

I am trying to write a module in order to support the teleinfo protocol used on french electric meters.
The protocol is a serial protocol which is 1200 bauds, 7  data bits, 1 stop bit, even parity (Using stty, it is # stty -F /dev/ttyUSB0 1200 sane evenp parenb cs7 -crtscts)

I need to be able to configure the serial port, but DevIo.pm does not allow to configure it correctly. I propose to patch the code as this :
diff -up DevIo.pm.bak DevIo.pm
--- DevIo.pm.bak 2013-10-17 01:31:35.000000000 +0200
+++ DevIo.pm 2013-10-17 01:35:25.000000000 +0200
@@ -101,7 +101,12 @@ DevIo_OpenDev($$$)
   my $name = $hash->{NAME};
   my $po;
   my $baudrate;
-  ($dev, $baudrate) = split("@", $dev);
+ # ($dev, $baudrate) = split("@", $dev);
+  my $databits;
+  my $parity;
+  my $stopbits;
+  my $handshake;
+  ($dev, $baudrate, $databits, $parity, $stopbits, $handshake) = split("@", $dev);

   $hash->{PARTIAL} = "";
   Log3 $name, 3, "Opening $name device $dev"
@@ -218,10 +223,30 @@ DevIo_OpenDev($$$)
       $po->reset_error();
       Log3 $name, 3, "Setting $name baudrate to $baudrate";
       $po->baudrate($baudrate);
-      $po->databits(8);
-      $po->parity('none');
-      $po->stopbits(1);
-      $po->handshake('none');
+      if ($databits) {
+ Log3 $name, 3, "Setting $name databits to $databits";
+ $po->databits($databits);
+      } else {
+      $po->databits(8);
+      }
+      if ($parity) {
+ Log3 $name, 3, "Setting $name parity to $parity";
+ $po->parity($parity);
+      } else {
+        $po->parity('none');
+      }
+      if ($stopbits) {
+ Log3 $name, 3, "Setting $name stopbits to $stopbits";
+ $po->stopbits($stopbits);
+      } else {
+      $po->stopbits(1);
+      }
+      if ($handshake) {
+ Log3 $name, 3, "Setting $name handshake to $handshake";
+ $po->handshake($handshake);
+      } else {
+ $po->handshake('none');
+      }

       # This part is for some Linux kernel versions whih has strange default
       # settings.  Device::SerialPort is nice: if the flag is not defined for

So port could be initialized (for example) as /dev/ttyUSB0@1200@7@even@1@rts

Does it seems OK to you ? It is does not break  modules using DevIo.pm : the TRX.pm module which uses it still works  after patching


rudolfkoenig

Please try to implement this functionality in the initfn function supplied to the DevIO_Open call.