Can QT access any company's serial port card?



  • Can QT access any company's serial port card? If so, how to read hex string data from TEWS technology TCP-469 card from one PC to another by RS-422?

    For TEWS card we first need to configure the card for RS-422 after opening the slot in read write command as following:

    QSerialPort serialPort1,serialPort2;
    unsigned long config;
    char Devname1[30];
    unsigned char data;
    int result1;
    int tty1;//baudrate=19200, spdres;
    int main(int argc, char *argv[])
    {
       QCoreApplication a(argc, argv);
    
       strcpy(Devname1,"/dev/ttySTDRV002_2");
       tty1=open(Devname1,O_RDWR|O_NOCTTY);
       qDebug()<<"COM port ttySTDRV002_2 has been connected" <<endl;
    
                            if(tty1<0)
                            {
                                    printf("Device not found\n");
                            }
                            config = TDRV002_INTF_RS422;
                            qDebug()<<"config"<< config << endl;
    
                            result1 = ioctl(tty1, TDRV002_IOCT_CONF_TRANS, config);
    
                            qDebug()<<"result1"<< result1 << endl;
                            if(result1<0)
                            {
                                    printf("Not able to configure receiver\n");
                            }
                            if(tty2<0)
                            {
                                    printf("Device not found\n");
                            }
                      
        QByteArray readData,read_Data;
        serialPort2.setPortName(Devname1);
        serialPort2.setBaudRate(QSerialPort:: Baud19200);                                                      // Setting BaudRate
        serialPort2.setDataBits(QSerialPort:: Data8);                                                          // Setting Data Bits
        serialPort2.setParity(QSerialPort:: NoParity);                                                       // Setting Parity bit
        serialPort2.setStopBits(QSerialPort:: OneStop);                                                        // Setting Stop bit
    
    
        if (serialPort2.isOpen()) {
            qDebug()<<"COM port channel 10 has been connected" <<endl;
    
        } else
            qDebug()<< "Open error"<< endl;
    
       for(int i =0;i<=10;i++){
    
       if(serialPort2.waitForReadyRead(1000))
            readData = serialPort2.readAll();
        qDebug()<< "Received data from channel 2"<<readData << endl;
       read_Data.append(readData);
            if (serialPort2.error() == QSerialPort::TimeoutError || readData.isEmpty())
              qDebug()<<"No data was currently available for reading from port ttySTDRV002_2"<<endl;
    }
    
        return a.exec();
    }
    

    then if I already open the slot of RS-422 so no need to reopen it through QSerialPort but still I need to open the port using QSerialPort otherwise "Open error" message pop-up and still if I am opening it through QSerialPort then I am not getting the exact data which I need to read.
    Kindly give any solution!

    [Added code tags ~kshegunov]


  • Moderators


  • Moderators

    @Nimika said in Can QT access any company's serial port card?:

    I am not getting the exact data which I need to read

    Can you explain better? What do you expect and what do you get.
    Also, keep in mind that you will not necessarily get the data at once, so you need to buffer it until you have your whole package.



  • @jsulm Its like I am sending a Hex code data like 1a 52 24 f1 12 upto 91 bytes through RS 422 cable in another PC where I have written the code I just shown. I am transmitting the data in Qbytearray and so what need to receive is the same but I am receiving like 1a 92 @ & so on and now I don't understand why am I getting this problem.

    May be it's because I opened the port twice or may be need to set buffersize double of what I am receiving or may be something with the time mismatch or may be something like datatype is wrong.


  • Moderators

    @Nimika Is there a reason why you're opening the port before using QSerialPort?


  • Qt Champions 2017

    @Nimika

    Am I right that you open the port with O/S methods instead QSerialPort::open()?

    Can you change to code to use QSerialPort::open() and afterwards use handle to perform O/S specific functions? Why do you need them at all?



  • @jsulm Its the TEWS serial port card so I need to open it before configuring it to RS 422.



  • @aha_1980 Yeah I have already used it but still the same problem.


  • Qt Champions 2017

    @Nimika

    then if I already open the slot of RS-422 so no need to reopen it through QSerialPort

    Wrong. QSerialPort is a class wrapping O/S specific functions, so you cannot simply omit it's open() function

    @aha_1980 Yeah I have already used it but still the same problem.

    As said, we cannot help you if you don't use QSerialPorts functions.
    So the only thing you need to do after open is configuring it to RS-422?

    What is tty2?

    You should also double check if the serial line settings are identical on both sides (bitrate, start, stop, parity, flow control).



  • Seems, you don't need to open a device twice. Just try to use QSerialPort::handle() after opening to do vendor-specific IOCTL's.

    OOPS: I'm too late.. :)


  • Qt Champions 2017

    @kuzulis But your answers are very appreciated :)



  • @aha_1980 I haven't used tty2.
    But if I am opening the serial port using QSerialPort then I am unable to configure the RS 422 channel accordingly so I need to open it though what I did in the program that's the basic opening of the serial port.
    I am setting the serial line according to Qt and it is opening when I am setting the port using QSerialPort.

    What do you mean by this:
    QSerialPort is a class wrapping O/S specific functions.



  • @kuzulis I will try and then will let you know.


  • Qt Champions 2017

    @Nimika

    Can you please change the code according to our suggestions and upload a minimal example again?

    Your current example is already quite complex. Thanks.



  • @aha_1980 Sure I will. Thanks.



  • @kuzulis It is not working yet. Can you help me out?


  • Qt Champions 2017

    @Nimika Can you please post your current code again?



  • What does not working? I do not see any your code, sorry, but I am not a psychic.


  • Qt Champions 2017

    Creating QObjects before the QCoreApplication is up and running is not supported. I imagine you get some warnings in the debug output, that need to be addressed before anything else.


  • Qt Champions 2017

    @kshegunov

    By looking at the code again, I also see that QSerialPort is a global variable. That is bad also as it is created at unknown time and may be accessed before it its constructor is run.



  • @Nimika said in Can QT access any company's serial port card?:

    TEWS technology TCP-469

    From documentation regarding this product, and assuming you're under Linux and you built the device driver from TDRV002-SW-82-SRC.tar.gz are you able to run the examples provided? (i.e. Send and receive example application, etc.)

    If so, for whatever reason you need/want to use Qt, you can still write C code like the examples in the Qt application and forget about QSerialPort() at all. You need to decide if you'll go that way, or if you use QSerialPort() rely on the handle to perform I/O specific functions for your card (as stated in previous posts).


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.