我想做到是,一个界面只有一个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进去,节省时间
------解决方案--------------------