USB Communication Using Qt



  • /dev/ttyUSB0 is simply the name that the kernel (or udev or whatever else you are using) assigns to serial over USB devices ie when using a usb-serial convertor. So when using this type of device under windows the corresponding device is COM1.

    If you are not using a usb-serial convertor then you have to use the libusb functionality for communicating - that is you cannot simply use COM1 etc.



  • [quote author="Andre" date="1303983404"]Could you not use QExtSerialPort to simply list the available ports, instead of guessing their names?[/quote]

    Not that I am aware off. Probably, you have to do it brute force by checking all com ports.

    [quote author="ZapB" date="1303983794"]If you are not using a usb-serial convertor then you have to use the libusb functionality for communicating - that is you cannot simply use COM1 etc.[/quote]

    That gives me something to chew on...

    Thanks for your valuable responses



  • [quote author="koahnig" date="1303984402"]
    [quote author="Andre" date="1303983404"]Could you not use QExtSerialPort to simply list the available ports, instead of guessing their names?[/quote]

    Not that I am aware off. Probably, you have to do it brute force by checking all com ports.

    [/quote]

    There is an enumerator in the source code: http://qextserialport.cvs.sourceforge.net/viewvc/qextserialport/qextserialport/



  • [quote author="Andre" date="1303985184"]
    There is an enumerator in the source code: http://qextserialport.cvs.sourceforge.net/viewvc/qextserialport/qextserialport/
    [/quote]

    you mean the enum on NamingConvention ?
    I did not come across this yet. But it is nowherelse referenced. So it could be dead source.



  • No, there is a device enumeration function in qextserialport that probes what serial devices you have available.





  • BTW the sourceforge project is no longer active. The new home is "here":http://code.google.com/p/qextserialport/



  • Got it!
    Thanks again. Will try to use it. Apperently, it was not part of the example I have come across.



  • @Koahnig, if I don't come right with libusb I can fall back on serial to USB as you suggested. Tnx for the link to qextserport.
    @ZapB, tnx for the info serial to USB converter chip. If required I will modify my hardware and go the serial route.
    I will post here again on completion of the project with info on how to do it for others that might find it useful.



  • OK. For info, the QStateMachine framework can be very handy for controlling hardware devices so it may be worth a look in you case. Good luck with your project.



  • @Candiman Thx for feedback. Good to know that it helped. Good luck with your project. Please make sure to post a link in this thread. I am interested to see the outcome.
    @ZapB Thx for updated link. Wasn't aware of this. There seem to be a couple of derivatives of the source floating around. Actually I started out with one, but some things required reversal. So it is good to know where the original source code is. Have fun.



  • @all

    Hi, I have found this thread because I have a similar problem.

    I have to communicate with a serial external device folowing a simple yet precise protocol. I have tried a fast test to develop the protocol using RXTCComm java library that works not so good and now I was searching for a Qt approach that is the final goal of the other side of the device.

    I try to put all your advices together and see if a working stuff can be done. If it maybe useful I put the project on the project area so who is interested can follow. As the project is ready and setup it will be on projects.forum.nokia.com/mill-machine I will announce it on t the forum appropriate area and in the Qt embedded group.

    Cheers.

    Anticipating many thanks to all.



  • Great. Tnx Alicemirror.



  • Hi. I have used rs232 communication in visual c++ 6.0
    which work very well. But because of my problem with
    transmit images trough socket in VC++ which is
    too complicated than Qt implementation ( very simple ).
    I need to implement rs232 comunication.
    My interface have to use TCP socket for internet comunication and rs232 for comunicate with microcontroller
    and electrical devices.



  • Hi dan_geo, let me know if you get your RS232 comms working with Qt. I have had to shift focus to a different project but during the downtime over the December holidays and from Jan 2012 I will be putting effort into the USB via Qt project again since many of my projects can benefit from having a GUI that I can design with Qt. I decided not to go with the RS232 option because so many PCs these days don't have a serial port. USB to serial converters are cheap, but if I can communicate directly with my device using USB then I don't need any additional hardware / drivers etc.
    Good luck!



  • I have not get rs232 comm. Next days i will try to
    implement them in Qt. If you are a source, please
    sent to me. About usb, this task i will do later
    with PIC18F4455. At usb i understand that
    for make a host usb is more complicated than
    implement a usb client for example a controller.





  • According to "this post":http://qt-project.org/forums/viewthread/15580/#90074 there is a wiki on "QtSerialPort":http://qt-project.org/wiki/QtSerialPort Apparently, the source is inherited from QSerialDevice.



  • It's possible to use the QtSerialPort on QT4? On this page (see: http://qt-project.org/wiki/Building-Qt-5-from-Git#15e7b6ad3df43ff719f8388ab4afb1cc) show thats is possible but he only explains to build in qt5!

    Anyone is using on QT4? The example there show only to build on Windows, not on linux...



  • Well, I compile using QT Creator 4.8.1, now I copy the compile folder "QtAddOnSerialPort" to directory:

    "../bin/QtSDK/Desktop/Qt/4.8.1/gcc/include/."

    This will be enough to work with SerialPort/USB on QT?

    Thanks all!



  • Possible.

    Build and install process:

    
    bq. $mkdir serialport-build
    $cd  serialport-build
    $qmake ../qtserialport/serialport.pro
    $make (or nmake)
    $make install (or nmake install)
    
    Note: But in Windows, this build and install only the Debug version. To build and install Release version - just repeat the steps again, with:
    
    bq. $qmake ../qtserialport/serialport.pro CONFIG+=release
    
    
    use:
    ~~~
    
    your custom *.pro file:
    
    bq. CONFIG += serialport
    
    your *.cpp file:
    
    @#include <QtAddOnSerialPort/serialport.h>
    #include <QtAddOnSerialPort/serialportinfo.h>
     
    QT_USE_NAMESPACE_SERIALPORT@
    


  • hi kuzulis, from QtCreator I build and appears to works fine... Doing the make as you said give me an error...
    I have already copy and past the folder "QtAddOnSerialPorta" to “../bin/QtSDK/Desktop/Qt/4.8.1/gcc/include/.” and QtCreator find the includes:

    @
    #include <QtAddOnSerialPort/serialport.h>
    #include <QtAddOnSerialPort/serialportinfo.h
    @

    I'm trying to run the example on that page but doesn't works.... the errors:

    "Undefined reference to 'QtAddOn::SerialPort::SerialPortInfo::avaliablePorts()'"
    ... (more others 14 similar erros)



  • Sorry I made some mistake:

    When I try to compile on Qt using 4.6.1 or using the make on shell It gives me this error:

    moc_serialport.cpp:55:16: error: ‘SerialPort’ was not declared in this scope

    On the QT 4.8.1 the Qt Creator gives the message:
    ...
    #error (moc changes too much)
    ...



  • I try again, reopening the project and now works... but now I'm very confused!



  • Remove (clear) away all that you previously copied by hand and do as I have indicated in the "above":http://qt-project.org/forums/viewreply/90605/



  • Will not compile... the errors at code...



  • See the errors:

    @
    ...
    ...
    ...
    /home/dvl/SOURCE_CODE/qtserialport/src -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include -I/home/dvl/SOURCE_CODE/qtserialport/src -I. -I/home/dvl/SOURCE_CODE/qtserialport/src -I. -o moc_serialport.o moc_serialport.cpp
    moc_serialport.cpp:55:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:56:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:57:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:58:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:59:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:60:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:61:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:62:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:63:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:64:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:65:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:66:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:67:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:68:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:69:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:70:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:71:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:72:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:73:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:74:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:75:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:76:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:77:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:78:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:79:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:80:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:81:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:82:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:83:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:84:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:85:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:86:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:87:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:88:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:89:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:90:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:91:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:92:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:93:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:94:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:95:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:96:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:97:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:98:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:99:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:100:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:101:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:102:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:103:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:104:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:105:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:106:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:107:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:108:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:109:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:110:16: error: ‘SerialPort’ was not declared in this scope
    moc_serialport.cpp:142:19: error: ‘SerialPort’ has not been declared
    moc_serialport.cpp:151:20: error: ‘SerialPort’ has not been declared
    moc_serialport.cpp:151:45: error: non-member function ‘const QMetaObject* metaObject()’ cannot have cv-qualifier
    /usr/include/QtCore/qobject.h: In function ‘const QMetaObject* metaObject()’:
    /usr/include/QtCore/qobject.h:296:33: error: ‘QScopedPointer<QObjectData> QObject::d_ptr’ is protected
    ...
    ...
    ...
    @



  • Fixed... Compiled in manual way... testing...



  • I'm still having the same problems:

    “Undefined reference to ‘QtAddOn::SerialPort::SerialPortInfo::avaliablePorts()’”
    ....
    ...



  • I do not know what you did - but I have everything working well.

    1.To start, try to remove all the headers, libraries, etc. QtSerialPort of the your *nix OS.
    2. Download the latest version of the library
    3. Build and install library to the system step-by-step, see an new updated manual in the Wiki.
    4. Create a new blank project and include the library as stated in the Wiki

    More anything, I can not help you, because I can not control all of your "curves" action.



  • Sorry guys... to many posts here about this problem but:

    Now I got another error:

    #include "qglobal.h"
    "qglobal.h not such file or directory

    • I post it before you answer me kuzulis


  • Well... I will try once again...
    Thanks anyway!



  • You may want to have a look at "libusb-win32":http://sourceforge.net/apps/trac/libusb-win32/wiki. It depens wether you are using ftdi chips for the µC side, or want to build your usb-client on the controller yourself. For attaching a device very simple try to use the ftdi232 with either vcp or d2xx usage. I.e. "ftdi-link":http://www.ftdichip.com/Products/ICs/FT231X.html
    .. frank



  • My client is using the µC "NXP LPC2366", I have the driver for him!
    I need to build a app which will run at on windows, linux and Mac OS.

    That the way I'm trying to use the QtSerialPort!

    I'm doing something wrong in the conception off app?



  • The "chips":http://www.ftdichip.com/Drivers/VCP.htm do have drivers for several os. Using your own driver has to supply your own usb VID. Which library you use may depend on the way you want to build it and if you want to use polling or event driven mode to receive data. However, I've used QExtSerialport for Windows and it works fine using a QThread polling the data once a msec.



  • bq. My client is using the µC “NXP LPC2366”, I have the driver for him!

    I have questions:

    1. NXP LPC2366 It's ARM MCU?
    2. The client uses the "native" serial interface of MCU (USART), or emulation via the USB interface of MCU?
    3. If the emulation, then it serial port correct whether is determined by SerialPortInfo::availablePorts() (QtSerialPort) ? If incorrectly - that let me know.

    bq. However, I’ve used QExtSerialport for Windows and it works fine using a QThread polling the data once a msec.

    Polling to use threads - this is redundant and inefficient, and I do not believe that you get exactly 1 ms. But this is offtopic.



  • Well kuzulis, you make some technical questions that in the moment I cannot answer you!
    I GUESS that my client is using the "native" serial interface of ARM, he sends to me the Windows Driver (.INF), it can help me for something?

    I have build another time the QtSerialPort using the QtCreator, and now I have some others files:

    @
    QtAddOnSerialPort/
    QtAddOnSerialPortVersion
    serialport-global.h
    serialportinfo.h
    headers.pri
    qtaddonserialportversion.h
    serialport.h
    1.0.0/
    QtAddOnSerialPort/
    private/
    qringbuffer_p.h
    serialportengine_symbian_p.h
    serialportinfo_p.h
    qwineventnotifier_p.h
    serialportengine_unix_p.h
    serialport_p.h
    serialportengine_p.h
    serialportengine_win_p.h
    ttylocker_unix_p.h
    @

    This is correct?
    Missing something?
    Thanks!



  • bq. I GUESS that my client is using the “native” serial interface of ARM, he sends to me the Windows Driver (.INF),

    If the driver, so it's not "native" USART, I guess it emulates in the MCU via USB. For native USART of MCU driver is not needed.

    bq. it can help me for something?

    Probably. You can here show this *.inf file?

    bq. This is correct? Missing something?

    Most likely you have build a library for Qt5. For Qt5 is correct.
    After build on Qt5, the QtSerialPort libraries (debug and release) is automatically copied to Qt5/qtbase/bin and Qt5/qtbase/lib, then you need to run "make install" (or nmake install) and these header files are also copied to the Qt5/include



  • Follow the .inf file:

    @
    [Version]
    Signature="$Windows NT$"
    Class=Ports
    ClassGUID={4d36e978-e325-11ce-bfc1-08002be10318}
    Provider=%SEVA%
    DriverVer=03/21/2012,1.0.1

    [SourceDisksFiles]

    [SourceDisksNames]

    [Manufacturer]
    %SEVA%=SEVA_, NTx86, NTamd64

    [SEVA_]
    %SEVA_CDC&PID_FAFC%=SevaVirCOM,USB\VID_0471&PID_FAFC

    [SEVA_.NTx86]
    %SEVA_CDC&PID_FAFC%=SevaVirCOM,USB\VID_0471&PID_FAFC

    [SEVA_.NTamd64]
    %SEVA_CDC&PID_FAFC%=SevaVirCOM,USB\VID_0471&PID_FAFC

    ;**************************************************
    ;* Windows NT family *
    ;**************************************************
    [SevaVirCOM.NT]
    include=mdmcpq.inf
    CopyFiles=FakeModemCopyFileSection
    AddReg=SevaVirCOM.NT.AddReg

    [SevaVirCOM.NT.AddReg]
    HKR,,DevLoader,,*ntkern
    HKR,,NTMPDriver,,usbser.sys
    HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider"

    [SevaVirCOM.NTx86]
    include=mdmcpq.inf
    CopyFiles=FakeModemCopyFileSection
    AddReg=SevaVirCOM.NT.AddReg

    [SevaVirCOM.NTx86.Services]
    AddService=usbser, 0x00000002,SevaVirCOMService_Inst

    [SevaVirCOM.NTamd64]
    include=mdmcpq.inf
    CopyFiles=FakeModemCopyFileSection
    AddReg=SevaVirCOM.NT.AddReg

    [SevaVirCOM.NTamd64.Services]
    AddService=usbser, 0x00000002,SevaVirCOMService_Inst

    [SevaVirCOMService_Inst]
    DisplayName=%SevaVirCOM.SvcDesc%
    ServiceType=1
    StartType=3
    ErrorControl=1
    ServiceBinary=%\usbser.sys
    LoadOrderGroup=Base

    ;**************************************************
    ;* Strings *
    ;**************************************************
    [Strings]
    SEVA="SEVA Engenharia"
    SEVA_CDC&PID_FAFC="SEVA Virtual COM port, SEVA BDV"
    SevaVirCOM.SvcDesc="SEVA Virtual COM port"
    @

    bq.
    Most likely you have build a library for Qt5. For Qt5 is correct.
    After build on Qt5, the QtSerialPort libraries (debug and release) is automatically copied to Qt5/qtbase/bin and Qt5/qtbase/lib, then you need to run “make install” (or nmake install) and these header files are also copied to the Qt5/include
    bq.

    I have compiled using Qt Creator 4 (4.8) it will woks anyway?



  • Yes, Qt4.8 also supported.
    But the resulting output files (headers, features, library) in the case of build QtSerialPort for Qt4 are different from case of build for Qt5.


Log in to reply