Serial port



  • Hi sir,
    am unable to write datya using serial port in qt.Please help me



  • @
    #include <QCoreApplication>
    #include <QDebug>
    #include <iostream>

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <stdio.h>
    #include <string.h>

    #include <stdlib.h>

    #define BAUDRATE B9600 // Change as needed, keep B

    #define MODEMDEVICE "/dev/ttyO1" //Beaglebone Black serial port

    #define _POSIX_SOURCE 1 /* POSIX compliant source */

    #define FALSE 0
    #define TRUE 1
    int nreturn = 0;

    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);

    int fd, c, res;
         struct termios oldtio, newtio;
         char buf[255];
    
       //  int ret = system&#40;"echo uart1 > /sys/devices/bone_capemgr.9/slots"&#41;;
    
         fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY &#41;;
         if (fd < 0) { perror(MODEMDEVICE); exit(-1); }
    
          bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
    
         newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
    
    
         newtio.c_iflag = IGNPAR;
    
    
              newtio.c_oflag = 0;
    
              newtio.c_lflag = ICANON;
    
              tcflush(fd, TCIFLUSH);
              tcsetattr(fd,TCSANOW,&newtio);
    
              while (TRUE) {
               nreturn =   write(fd, "U", 1);
               qDebug () << "write" << nreturn;
    
    
              }
               tcsetattr(fd, TCSANOW, &oldtio);
    
    return a.exec(&#41;;
    

    }
    @

    this is the code which i need to do...recently it worked, but now it getting error has error: 'write' was not declared in this scope

    [edit: added missing coding tags @ SGaist]


  • Lifetime Qt Champion

    Hi,

    This question is not related to Qt. You should go to a Beaglebone Black forum.



  • hi sir,
    This is not for BBB only for qt


  • Qt Champions 2017

    well you are only using qDebug.
    The rest is normal linux serial programming.
    The write that it complains about is the normal linux one,
    not anything to do with Qt.
    try including unistd.h if older linux or look in the online help for you compiler where its defined.



  • Thank a lot sir..it worked



  • Hi sir..

    @
    #include <QCoreApplication>
    #include <QDebug>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/ioctl.h>
    #include <sys/poll.h>

    #define BAUDRATE B9600 // Change as needed, keep B

    #define MODEMDEVICE "/dev/ttyO0" //Beaglebone Black serial port

    #define _POSIX_SOURCE 1 /* POSIX compliant source */

    int nreturn = 0,ndata = 0;
    int main(int argc, char *argv[])
    {

    QCoreApplication a(argc, argv);
    int fd;
    struct termios oldtio, newtio;
    char buf,ch;
    

    QString str;
    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );

     //    fcntl(fd, F_SETOWN, getpid());                   /* getting pid and owner rigts on serial port   */
     //          fcntl(fd,F_SETFL,O_NDELAY);
         tcgetattr(fd,&newtio);                                /* save current port settings                   */
     //    bzero(&newtio, sizeof(newtio));
         newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
       //newtio.c_iflag = IGNPAR;
        // newtio.c_oflag = 0;                                         /* output mode flags                            */
        //newtio.c_lflag = 0;                                         /* set input mode (non-canonical,no echo)       */
        //newtio.c_cc[VTIME]=0;                                       /* blacking until one character arrives         */
        //newtio.c_cc[VMIN]=1;                                        /* inter-character  timer unused                */
         tcflush(fd, TCIFLUSH);                               /* flushes the data but not transmitted         */
         tcsetattr(fd,TCSANOW,&newtio);
              while (TRUE)
                         {
    
                  nreturn = read(fd,&buf,1);
                  if(nreturn>0)
                  {
                       ch =buf;
                       qDebug () << "Data:" << ch;
                  }
                           }
                        tcsetattr(fd, TCSANOW, &oldtio);
                        return a.exec(&#41;;
    
     }
    

    @

    here am able to read data ,problem is i would like to use "char ch[50],buf; i.e ch = buf;
    so that i need to use for other functions like if ch[0] = 0x02 shuld display button in green color examples .so how would i equate both char.am getting errors .Please help me sir

    [edit: added missing coding tags @ SGaist]



  • @
    #include <QCoreApplication>
    #include <QDebug>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/ioctl.h>
    #include <sys/poll.h>

    #define BAUDRATE B9600 // Change as needed, keep B

    #define MODEMDEVICE “/dev/ttyO0” //Beaglebone Black serial port

    #define _POSIX_SOURCE 1 /* POSIX compliant source */

    int nreturn = 0,ndata = 0;
    int main(int argc, char *argv[])
    {
    QCoreApplication a(argc, argv);
    int fd;
    struct termios oldtio, newtio;
    char buf,ch;
    QString str;
    fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
    tcgetattr(fd,&newtio);
    newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&newtio);

    while (TRUE)
    {
    nreturn = read(fd,&buf,1);
    if(nreturn>0)
    {
    ch =buf;
    qDebug () << "Data:" << ch;
    }
    }
    tcsetattr(fd, TCSANOW, &oldtio);
    return a.exec();
    }
    @

    here am able to read data ,problem is i would like to use “char ch50,buf; i.e ch = buf;
    so that i need to use for other functions like if ch0 = 0×02 shuld display button in green color examples .so how would i equate both char.am getting errors .Please help me sir

    [edit: added missing coding tags @ SGaist]


  • Qt Champions 2017

    sorry but its very unreadable.
    I have no idea what
    ,problem is i would like to use “char ch50,buf; i.e ch = buf;

    means.
    I can only give you some hints:

    why you only read 1 char ?
    nreturn = read(fd,&buf,1)

    read returns how many you get so:
    @
    char buf[2048];// now a list of char
    nreturn = read(fd,&buf,2048)

    then you can look in buf[0], buf[1]
    if nreturn is 2
    @





  • hi sir,

         I could n't use  #include<QtSerialPort> in qt i even included Qt+ = serialport in .pro, what could be the reason ..Please help me .


  • Did you read Wiki? What version of Qt do you use?

    Please paste more informative messages, how you tried?



  • hi sir,

    @
    QChar chbuf[50];
    QString ReadData;
    nSerialreturn = read(fd,chbuf,50);
    qDebug () << "Timer running:"<< nSerialreturn;
    for(i = 0;i<nSerialreturn;i++)
    {
    ReadData = chbuf[i];
    qDebug () << "Data:" << ReadData;
    }
    @

    am unable to get the data..and data should be in hexadecimal ..unable to convert it ..please help me sir

    [edit: added missing coding tags @ SGaist]


  • Lifetime Qt Champion

    Please answer the questions we are asking you in order for us to help you.

    Again, it seems that you are not using QSerialPort, if so, then go to the appropriate forum like I already suggested.

    Otherwise, tell us exactly what version of Qt you are using. Show us the code where you initialize QSerialPort. Tell us what parameter your serial port should use.



  • hi sir,
    am using qt 4.8.4



  • nreturn = read(fd,buf,1);
                    str =buf[i];
                    len = str.length();
                    qDebug () << "no of bytes:" << len;
                    for( i=0;i<len;i++)
                         {
                               ch = str.at(i);
                               n+=ch.unicode();
                        }
                     qDebug () << "Data:" << n;
    

    here am getting decimal data..i would like to get hex value please help me



  • QSerialPort. is done only in windows ,but i linux r what...in windows am able to get theat ,bt in linux am hving problem sir
    ..above menstined code am able to get the data in decimal..but i want in hex data ..please help me


  • Lifetime Qt Champion

    QSerialPort works on all support platform so what is your exact problem with linux ?

    Most probably you don't have the rights to access the serial port, do you ?



  • "This thread":http://qt-project.org/forums/viewthread/44793/ will guide you through my experiences when I added it to 4.6.3.
    If you follow all the posts, you should be able to successfully add QtSerialPort to 4.8.4 .. even easier because you may not need all the changes that were needed for 4.6.3.



  • thank u sir..now serial port is working , but am not able to read the hex data from serial port



  • hi sir,

    int nreturn=0,len;
    char buf[5];
    QString str,s;

    QChar ch;

    while (TRUE)
    {

    nreturn = read(fd,&buf,1);

    str =buf[i];

    len = str.length();

    qDebug () << "no of bytes:" << len;

    for( i=0;i<len;i++)
    {

    ch = str.at(i);

    n+=ch.unicode();

    s = QString::number(n,16);

    }
    qDebug () << "Data:" << s;

    }

    Am able to display hex value, when data is only one byte and other problem is when continusly data is read only first byte is getting correct remaing am geting addition of the previous data . if i read 5 bytes of data am getting junk data .Please help me



  • use this

    @QString a="a";
    QByteArray BA1=a.toUtf8();
    QByteArray BA2=BA1.toHex();
    const char* chArr1=BA2.constData();
    qDebug()<<QString::fromUtf8(chArr1);@



  • Is your fd the serialport?
    Again, as asked before, why are you not using QSerialPort?
    What is your target, the task you need to get done?



  • Basic serial port usage as I have worked on is

    @ serial=new QSerialPort(this);

    serial->setPortName("/dev/ttyS0");
    serial->setBaudRate(9600);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    
    
    serial->open(QIODevice::ReadWrite);
    
    serial->write("Hello World");
    
    connect(serial,SIGNAL(readyRead()),this,SLOT(readSerialData()));@
    


  • .. and the readSerialData() ... (pseudo code)
    @
    void QTGUI_MainWindow::readSerialData()
    {
    while((iBytesAvailable = serial->bytesAvailable()))
    {
    QByteArray RawPortData = serial->read(iBytesAvailable);
    ...

    @



  • int main(int argc, char *argv[])
    {

    QCoreApplication a(argc, argv);
    fd = open(MODEMDEVICE,O_RDWR|O_NOCTTY);

    While(true)

    {
    Buffer.clear();
    nreturn = read(fd,&chBuf,1);
    if(nreturn > 0)
    {
    for(i=0;i<nreturn;i++)
    {
    Buffer.append(chBuf[i]);

    if(chBuf[0] == 0xc9) nReadIndex = 0;

    pData[nReadIndex++] = chBuf[i];

    qDebug() << "data" << Buffer.toHex();
    }
    if(chBuf[0] == 0xcf)
    {

    if(nReadIndex >= 10)

    //Display of Gui opreration //

    nReadIndex = 0;

    }

    For this how can i use timers instead of while loop, where should i start timer , i tried but am geting segmentation problem.Please help me



  • Your issue seems not to be about the serial port. Please open a new thread for a new topic.

    btw: You seem to be very reluctant in using QSerialPort.



  • k .



  • Hi sir,

    How to flush the data in serial port without using qextserialport

    Please help me sir...



  • hi sir...,
    When i use Baud rate B115200...am getting segmentation fault ..in qt...How would i solve the problem..Please help me...



  • hi sir...,
    When i use Baud rate B115200...am getting segmentation fault ..in qt...How would i solve the problem..Please help me...


  • Lifetime Qt Champion

    Without any proper code, I can't.


  • Lifetime Qt Champion

    Without any proper code, I can't.



  • #define BAUDRATE B9600



  • #define BAUDRATE B9600


  • Lifetime Qt Champion

    That won't really help debugging but from the looks of it, you are using the linux platform API, so please ask this on a linux dedicated forum.

    There's also this "how to":http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html that should give you some hints and this "stack overflow post":http://stackoverflow.com/questions/6947413/how-to-open-read-and-write-from-serial-port-in-c


  • Lifetime Qt Champion

    That won't really help debugging but from the looks of it, you are using the linux platform API, so please ask this on a linux dedicated forum.

    There's also this "how to":http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html that should give you some hints and this "stack overflow post":http://stackoverflow.com/questions/6947413/how-to-open-read-and-write-from-serial-port-in-c


Log in to reply
 

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