<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to Multiple Serial devices over USB on Raspberry Pi</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/c13589c29f/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Engineering/thread/c13589c29f/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Engineering/thread/c13589c29f/</id><updated>2020-02-27T14:51:03.834000Z</updated><subtitle>Recent posts to Multiple Serial devices over USB on Raspberry Pi</subtitle><entry><title>Multiple Serial devices over USB on Raspberry Pi</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/c13589c29f/?limit=25#d4cc" rel="alternate"/><published>2020-02-27T14:51:03.834000Z</published><updated>2020-02-27T14:51:03.834000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com70117b51471c28fb68676b3d909c17a23a831074</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; KevinR&lt;/p&gt;
&lt;p&gt;After writing the instruction, I've checked the forum and have seen, that there is already an instruction available: &lt;/p&gt;
&lt;p&gt;Check this link: &lt;br/&gt;
 l &lt;a class="" href="https://forum.codesys.com/viewtopic.php?f=23&amp;amp;t=6247&amp;amp;start=30" rel="nofollow"&gt;viewtopic.php?f=23&amp;amp;t=6247&amp;amp;start=30&lt;/a&gt; l &lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Multiple Serial devices over USB on Raspberry Pi</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/c13589c29f/?limit=25#acdf" rel="alternate"/><published>2020-02-27T14:51:02.064000Z</published><updated>2020-02-27T14:51:02.064000Z</updated><author><name>Anonymous</name><uri>https://forge.codesys.com/u/*anonymous/</uri></author><id>https://forge.codesys.com339c5041cb0c244a69fe563d271d21094e7fcdbe</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;&lt;em&gt;Originally created by:&lt;/em&gt; KevinR&lt;/p&gt;
&lt;p&gt;Hi pdoubleu, &lt;/p&gt;
&lt;p&gt;you can bound the COM-Port Number to the USB-Port, by specifying the USB-port path. &lt;br/&gt;
And then you can use the COM-Port numbers for a single motor, for example COM-Port number 1 for motor 1 and COM-Port number 2 for motor 2 and so on. &lt;/p&gt;
&lt;p&gt;I've got a little instruction for this:&lt;/p&gt;
&lt;p&gt;First let's identify the name of the interface, by using the attribute ATTRS(interface}.&lt;br/&gt;
So we can make sure that only a device, with the correct interface name, is "linked". &lt;/p&gt;
&lt;p&gt;To check the attributes of a plugged-in device, use following code: &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;udevadm&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="c1"&gt;--name /dev/ttyUSB0 --attribute-walk&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It will show you the information, from parent device to parent device. So the first info should be something like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="n"&gt;looking&lt;/span&gt; &lt;span class="k"&gt;at&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="s1"&gt;'/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.0/ttyUSB0/tty/ttyUSB0'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;KERNEL&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"ttyUSB0"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;SUBSYSTEM&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"tty"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;DRIVER&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;""&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So go ahead and look for the attribute "ATTRS{interface}"&lt;br/&gt;
This attribute gives you the name of the plugged-in USB extension.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;looking&lt;/span&gt; &lt;span class="k"&gt;at&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="s1"&gt;'/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.0'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;KERNELS&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"1-1.4:1.0"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;SUBSYSTEMS&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"usb"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;DRIVERS&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"ftdi_sio"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;authorized&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"1"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bAlternateSetting&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;" 0"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bInterfaceClass&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"ff"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bInterfaceNumber&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"00"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bInterfaceProtocol&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"ff"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bInterfaceSubClass&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"ff"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bNumEndpoints&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"02"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"&amp;lt;Name of the device&amp;gt;"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;supports_autosuspend&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"1"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now you can create a udev rule, by editing your udev rule file and add:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;SUBSYSTEM&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"tty"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;KERNEL&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"ttyUSB*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;KERNELS&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"1-1.4:1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"&amp;lt;Name of the device&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SYMLINK&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="ss"&gt;"ttyRS0"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The Parameter  is the fixed path of the usb-port.&lt;/p&gt;
&lt;p&gt;So this device will now always have the COM-Port number 1. If you want to add another device and you want to skip Com-Port number 2, you can use following rule:&lt;/p&gt;
&lt;p&gt;1.) Find out the name of the interface again&lt;br/&gt;
2.) Check the USB-Port path. &lt;br/&gt;
3.) add your rule as you want &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;SUBSYSTEM&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"tty"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;KERNEL&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"ttyUSB*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;KERNELS&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"1-1.3:1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"&amp;lt;Name of the other device&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SYMLINK&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="ss"&gt;"ttyRS2"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;What we also did, is to create a SYMLINK. This will avoid further problems, in case of that you're using different devices, like "ttyAMA" or something else. Because as far as I know, you can specify only one Device file name in the codesyscontrol config file, so you can avoid further troubles. &lt;/p&gt;
&lt;p&gt;In case of that, you have a totally different device, you can also use other devices. &lt;br/&gt;
Example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;SUBSYSTEM&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"tty"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;KERNEL&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"ttyAMA*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;KERNELS&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"1-1.2:1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ATTRS&lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="ss"&gt;"&amp;lt;Name of the ttyAMA device&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SYMLINK&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="ss"&gt;"ttyRS3"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The CODESYSControl_User.cfg should look like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[SysCom]&lt;/span&gt;
&lt;span class="na"&gt;Linux.Devicefile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/dev/ttyRS&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I think you don't need the last parameter "_:=...". But I'm not sure.&lt;/p&gt;
&lt;p&gt;I hope this little instruction helps you.&lt;/p&gt;
&lt;p&gt;Let me know if I missed something.&lt;/p&gt;
&lt;p&gt;PS: I think this post should be moved to the raspberry pi forum category.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>Multiple Serial devices over USB on Raspberry Pi</title><link href="https://forge.codesys.com/forge/talk/Engineering/thread/c13589c29f/?limit=25#a946" rel="alternate"/><published>2020-02-27T14:51:01.502000Z</published><updated>2020-02-27T14:51:01.502000Z</updated><author><name>pdoubleu</name><uri>https://forge.codesys.com/u/pdoubleu/</uri></author><id>https://forge.codesys.com525a1c212fd22aae9b16fdf7fb16c377519d3133</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;Hi everyone,&lt;/p&gt;
&lt;p&gt;Unfortunately I havent found anything regarding my question using the search function.&lt;/p&gt;
&lt;p&gt;Here is my question:&lt;/p&gt;
&lt;p&gt;I want to connect 4 serial devices to the 4 USB ports on Raspi. All 4 devices are exactely the same (Roboclaw motor controller). &lt;br/&gt;
Using udev rules I am able to give all of them reproducable names, even if I disconnect and reconnect them, so thats all fine. &lt;/p&gt;
&lt;p&gt;To use the serial USB in codesys I know that I need to add the following lines to CODESYSControl_User.cfg:&lt;/p&gt;
&lt;p&gt;&lt;span&gt;[SysCom]&lt;/span&gt;&lt;br/&gt;
Linux.Devicefile=/dev/ttyUSB&lt;br/&gt;
portnum:=COM.SysCom.SYS_COMPORT1&lt;/p&gt;
&lt;p&gt;After this I am able to control the devices vial the CAA serial library.&lt;/p&gt;
&lt;p&gt;My question is now if there is a way to assign each Motorcontroller to a specific comport, so that I can decide which motorcontroller to "speak" without sending every command to each motor?&lt;/p&gt;
&lt;p&gt;Thank for any help!&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>