[Mono-dev] Make System.IO.Ports work on UNIX systems other than Linux

Tom Spink tspink at gmail.com
Thu Apr 22 14:42:36 EDT 2010


Hi guys,

We may be able to get some hints from the sysfs filesystem, if running
on Linux.  In /sys/class/tty, we have the available TTY ports -
whether or not they're physical serial ports is another issue - but
maybe it doesn't matter.  If on Linux, and the /sys/class/tty
directory is available, it may suffice to allow a port that is present
there.

-- Tom

On 22 April 2010 18:48, Andreas Färber <andreas.faerber at web.de> wrote:
> Hi,
>
> Am 22.04.2010 um 18:45 schrieb Robert Nagy:
>
>> Can someone please have a look at this?
>>
>> On (2010-04-20 23:26), Robert Nagy wrote:
>>> The attached diff makes SerialPort.GetPortNames() work on
>>> all Unix systems other than Linux too, because ttyS* and
>>> ttyUSB* is linux specific and on *BSD the serial ports are
>>> tty[0-9]+.
>>> (I've tested this code on Linux and it should also support
>>> ttySG0 (SGI running Linux (ia64)).
>>>
>>> The other way would be to add a different platform id for
>>> *BSDs.
>>>
>>> Comments? (My C# is not good :))
>>
>>> Index: class/System/System.IO.Ports/SerialPort.cs
>>> ===================================================================
>>> --- class/System/System.IO.Ports/SerialPort.cs       (revision 155801)
>>> +++ class/System/System.IO.Ports/SerialPort.cs       (working copy)
>>> @@ -24,6 +24,7 @@
>>> using System.ComponentModel;
>>> using System.Diagnostics;
>>> using System.Text;
>>> +using System.Text.RegularExpressions;
>>> using System.Runtime.InteropServices;
>>> using Microsoft.Win32;
>>>
>>> @@ -525,10 +526,18 @@
>>>                      // Are we on Unix?
>>>                      if (p == 4 || p == 128 || p == 6) {
>>>                              string[] ttys = Directory.GetFiles("/dev/", "tty*");
>>> +                            Regex lnx = new Regex(@"^\/dev\/tty(S(G)?|USB)[0-9]+$");
>
> I'm not a Linux expert, but I think the regex still may be incomplete.
> For instance, I've seen tty0 (virtio), ttyPZ0 (ppc), ttySC0 (sh4 R2D),
> ttyAMA0 (arm RealView) as kernel parameters.
>
>>> +                            Regex rem = new Regex(@"^\/dev\/tty(U)?[0-9]+$");
>>> +
>>>                              foreach (string dev in ttys) {
>>> -                                    if (dev.StartsWith("/dev/ttyS") || dev.StartsWith("/dev/
>>> ttyUSB"))
>>> -                                            serial_ports.Add(dev);
>>> +                                    if (lnx.Match(dev).Success)
>>> +                                            rem = lnx;
>>> +                                    serial_ports.Add(dev);
>>>                              }
>>> +                            for (int i = serial_ports.Count - 1; i >= 0; i--) {
>>> +                                    if (!rem.Match(serial_ports[i]).Success)
>>> +                                            serial_ports.RemoveAt(i);
>>> +                            }
>
> This seems overly complicated to me. Both the variable naming and
> cross-assignment and the first-add-then-remove approach.
>
> I think we should either try to find one universal regex like /dev/
> tty[A-Z]*[0-9]+ or initialize the regex based on platform. Either way
> we'd hopefully have one regex we could use to add to the list and
> could drop the second loop.
>
> Platform identification could be done by recognizing a non-Windows
> platform and p/invoking uname.
>
> Andreas
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>



-- 
Tom Spink


More information about the Mono-devel-list mailing list