当前位置: 代码迷 >> QT开发 >> qt如果做一个一开程序就监听串口数据的程序?解决办法
  详细解决方案

qt如果做一个一开程序就监听串口数据的程序?解决办法

热度:61   发布时间:2016-04-25 05:01:58.0
qt如果做一个一开程序就监听串口数据的程序?
我想做到是,一个界面只有一个label,然后一开程序便监听,如果数据是特定的字符串便让label显示一个图片。现在用定时器做,但是界面就是一闪就异常退出了。
C/C++ code
#include "dialog.h"#include "ui_dialog.h"Dialog::Dialog(QWidget *parent) :    QDialog(parent),    ui(new Ui::Dialog){    ui->setupUi(this);    counter = startTimer(100);    fd = newCom.OpenSerial("/dev/ttyS1");  //get computer serial id && OPEN it.    dmodel = 0;//bit2 read&write 2    time = 10;    if(fd < 0){        printf("Cannot open serial com!!!\n");    }    else{        ui->label->setText("Connected!\n");        test[0] = newCom.SetSpeed(fd,19200);   //set computer com speed        test[1] = sys.SysSetCom(fd,19200);   //set RFID comspeed        test[2] = sys.SysSetRDType(fd, ISO15693);//set RFID read-card type is ISO15693        test[3] = sys.SysBeep(fd,time);        test[4] = sys.SysLight(fd,YELLOW);    }    for(int i = 0;i < 4;i++){        printf("%3d",test[i]);    }}void Dialog::timerEvent(QTimerEvent *){    readdata();}void Dialog::readdata(){    temp = "";//clear temp buffer    if((card.Inventory(fd,rdata)) > 0){        sys.SysBeep(fd,time);        sys.SysLight(fd,GREEN);        sys.SysLight(fd,OFF);        sys.SysLight(fd,GREEN);        for(int i = 1;i < 9;i++){           uid[i - 1] = rdata[i];        }        if((card.Read(fd,dmodel,uid,1,1,rbuffer,&rlen)) > 0){             for(int i = 0;i < rlen;i++){                 temp += QString::number(rbuffer[i]);             }                newstr = QString("0001");                if(temp == newstr){                    QImage award1(ui->label->width(), ui->label->height(),QImage::Format_RGB32);                    award1.load("ADS/Ads3.BMP");                    ui->label->setPixmap(QPixmap::fromImage(award1));                }                else{                    QImage award1(ui->label->width(), ui->label->height(),QImage::Format_RGB32);                    award1.load("ADS/Ads2.BMP");                    ui->label->setPixmap(QPixmap::fromImage(award1));                }         }    }    else{        ui->label->setText("Can't search card!\n");    }    sleep(1000);}Dialog::~Dialog(){    killTimer(counter);    newCom.CloseSerial(fd);    delete ui;}


其实C++我不是很懂,不知道哪里出错。我还想用死循环来做的,但是放在构造函数里,连界面都不出来···

------解决方案--------------------
可以看看好多读写串口的程序,如串口调试助手等等的代码,自己改写一个。道理都是一样的。
------解决方案--------------------
不多线程,异常用诺基亚的那个IDE,F5下自己调下就知道哪出错了。 那sleep(1000)?而且timer的时间可以短点,然后图不用每次都load进去,节省时间
------解决方案--------------------
探讨

LZ给的代码太少了,也不知道LZ到底是什么问题
初始化函数里只需要初始化计时器和串口就可以了
C/C++ code

counter = new QTimer();
counter -> start(100);
connect(counter,SINGLE(timeout()),this,SLOT(readdata()));
  相关解决方案