title: Monitoring (Sniffing) /dev/ttyUSB0 created by FTDI USB Serial Converter
body: <p>I want to monitor (sniff) the traffic of my /dev/ttyUSB0 which is created by FTDI USB Serial Converter. I've written my own application in Windows and now I try to port it to linux and use /dev/tty/USB0. I want to debug the communication that actually happens.</p>
  
  <p>The software strace is not an option for me because it only shows the syscalls to ioctl.</p>
  
  <p>Using Windows the software "Free Serial Port Monitor" did it by sniffing COM1.</p>
  
  <p>Output of dmesg:</p>
  
  <pre><code>[16975.000221] usb 7-1: new full-speed USB device number 5 using  uhci_hcd
  [16975.193543] usb 7-1: New USB device found, idVendor=0403, idProduct=6001
  [16975.193548] usb 7-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
  [16975.193552] usb 7-1: Product: FT232R USB UART
  [16975.193555] usb 7-1: Manufacturer: FTDI
  [16975.193558] usb 7-1: SerialNumber: A400BJII
  [16975.200550] ftdi_sio 7-1:1.0: FTDI USB Serial Device converter detected
  [16975.200599] usb 7-1: Detected FT232RL
  [16975.202604] usb 7-1: FTDI USB Serial Device converter now attached to ttyUSB0
  </code></pre>
  
  <p>However I tried moserial to do this and the command "echo foobar > /dev/ttyUSB0" to verify, if it works. Also my software doesn't create an output to moserial.</p>
  
  <p><strong>UPDATE:</strong></p>
  
  <p>Found out how to monitor usb directly, now I need to convert USB packets to RS-232 (what FTDI basically does).</p>
  
  <ol>
  <li><p>Setup usbmon</p>
  
  <h1>modprobe usbmon</h1>
  
  <p>1.1 With Linux kernels prior to 2.6.23, you will also need to run this command </p>
  
  <h1>modprobe -t debugfs none /sys/kernel/debug</h1></li>
  <li><p>usbmon0 will monitor any traffic from all usbmon0 to usbmonX
  2.1. Find the correct usb device</p>
  
  <h1>cat /sys/kernel/debug/usb/devices|grep FTDI -A 7 -B 4</h1>
  
  <pre><code>T:  Bus=07 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 12 Spd=12   MxCh= 0
  D:  Ver= 2.00 Cls=00(&gt;ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
  P:  Vendor=0403 ProdID=6001 Rev= 6.00
  S:  Manufacturer=FTDI
  S:  Product=FT232R USB UART
  S:  SerialNumber=A400BJII
  C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr= 90mA
  I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
  E:  Ad=81(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
  E:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0ms
  </code></pre>
  
  <p>2.2. Note Bus number of the port (Bus=07), so usbmon to monitor will be usbmon7</p>
  
  <p>2.3. Use wireshark to capture the usbmon7 interface or use following command to get output to the console (stdout) ... replace the number with bus-id</p>
  
  <h1>cat /sys/kernel/debug/usb/usbmon/7u</h1>
  
  <p>What means 'u'?
   <a href="https://www.kernel.org/doc/Documentation/usb/usbmon.txt" rel="noreferrer">https://www.kernel.org/doc/Documentation/usb/usbmon.txt</a></p>
  
  <p>Two formats are supported currently: the original, or '1t' format,      and the '1u' format. The '1t' format is deprecated in kernel 2.6.21. The '1u' format adds a few fields, such as ISO frame descriptors, interval, etc. It produces slightly longer lines, but otherwise is a perfect superset of '1t' format.</p></li>
  <li><p>How do I convert the USB capture to RS-232 capture?
  I don't know it ... TODO</p></li>
  </ol>