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
Please try to implement this functionality in the initfn function supplied to the DevIO_Open call.