kojeka2018 |
2018-10-24 15:10 |
求助:在子线程中对串口进行循环写数据,接收方不能收到数据
各位高手,高高手:目前手上用Qt编制了一个小程序,在子线程中循环向串口发送数据,问题是接收方接收不到数据。目前测试的情况如下:1.硬件接口等都是ok的,在主线程打开同一个串口并向其发送一次数据,接收方是可以接收到数据的。2.在主线程中以start()调用子线程,在子线程中发送数据write,接收方等不到。请问下有没有遇到这种情况的?下面附上子线程的代码 Mythread.cpp文件
#include "mythread.h" #include <QDebug>
Mythread::Mythread(QObject *parent) : QThread (parent) { }
void Mythread::run() { qreal i =0; int j = 0 ;
if (MySerial != NULL) { MySerial->close(); }
MySerial = new QSerialPort(); qDebug() << "Coming!";
MySerial->setPortName("/dev/ttyS1");
if (!MySerial->open(QIODevice::ReadWrite)) { qDebug() << "open serial port failed"; return ; }
MySerial->clear(); MySerial->setBaudRate(QSerialPort::Baud57600); MySerial->setDataBits(QSerialPort::Data8); MySerial->setParity(QSerialPort::NoParity); MySerial->setStopBits(QSerialPort::OneStop); MySerial->setFlowControl(QSerialPort::NoFlowControl);
qDebug() << "open serial port OK";
char buffer[22] ; buffer[0] = 0x00 ; buffer[1] = 0xA6 ; buffer[2] = 0xA0 ; buffer[3] = 0xA0 ; buffer[4] = 0xA0 ; buffer[5] = 0xA0 ; buffer[6] = 0xA0 ; buffer[7] = 0xA0 ; buffer[8] = 0xA0 ; buffer[9] = 0xA0 ; buffer[10] = 0xA0 ; buffer[11] = 0xA0 ; buffer[12] = 0xA1 ; buffer[13] = 0xA1 ; buffer[14] = 0xA1 ; buffer[15] = 0xA1 ; buffer[16] = 0xA1 ; buffer[17] = 0xA1 ; buffer[18] = 0xA1 ; buffer[19] = 0xA1 ; buffer[20] = 0xA1 ; buffer[21] = 0xA1 ; QString str ; int err = 0 ;
while(!stopped) { for(j = 0; j < 22; j++) { str = QString("%1").number(buffer[j], 16); qDebug() << QString("%1").arg(j) << ":" << str.toUpper(); } err = MySerial->write(buffer, 22); qDebug()<<QString("in MyThread send:%1").arg(err); myString = QString("in MyThread send:%1").arg(err); emit sendMessage(myString); this->msleep(1000); //如果不用msleep等函数延时,主界面会卡住. } stopped=!stopped; }
void Mythread::stop() { stopped = true; MySerial->close(); } Mythread.h文件
#ifndef MYTHREAD_H #define MYTHREAD_H
#include <QThread> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo>
class Mythread : public QThread { Q_OBJECT public: explicit Mythread(QObject *parent = 0);
void run(); void stop(); bool stopped; QString myString; signals: void sendMessage(QString);//sendMessage为自定义信号 public slots:
private: QSerialPort* MySerial ; };
#endif // MYTHREAD_H
widget.cpp文件
#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QTimer> #include <QDateTime>
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); connect(&thread,SIGNAL(sendMessage(QString)),this,SLOT(GetPthreadMessage(QString))); QTimer *timer = new QTimer(this); ui->lcdNumber->setDigitCount(19); ui->lcdNumber->display(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); connect(timer,SIGNAL(timeout()),this,SLOT(chTime())); timer->start(1000);
if (mycom != NULL) { mycom->close(); } else { mycom = new QSerialPort(); }
mycom->setPortName("/dev/ttyS1");
if (!mycom->open(QIODevice::ReadWrite)) { qDebug() << "open serial port failed"; return ; }
mycom->clear(); mycom->setBaudRate(QSerialPort::Baud57600); mycom->setDataBits(QSerialPort::Data8); mycom->setParity(QSerialPort::NoParity); mycom->setStopBits(QSerialPort::OneStop); mycom->setFlowControl(QSerialPort::NoFlowControl);
qDebug() << "open serial port OK";
char buffer[22] ; buffer[0] = 0x00 ; buffer[1] = 0xA6 ; buffer[2] = 0xA0 ; buffer[3] = 0xA0 ; buffer[4] = 0xA0 ; buffer[5] = 0xA0 ; buffer[6] = 0xA0 ; buffer[7] = 0xA0 ; buffer[8] = 0xA0 ; buffer[9] = 0xA0 ; buffer[10] = 0xA0 ; buffer[11] = 0xA0 ; buffer[12] = 0xA1 ; buffer[13] = 0xA1 ; buffer[14] = 0xA1 ; buffer[15] = 0xA1 ; buffer[16] = 0xA1 ; buffer[17] = 0xA1 ; buffer[18] = 0xA1 ; buffer[19] = 0xA1 ; buffer[20] = 0xA1 ; buffer[21] = 0xA1 ; QString str ; int i = 0 ,j = 0 ;
for(j = 0; j < 22; j++) { str = QString("%1").number(buffer[j], 16); qDebug() << QString("%1").arg(j) << ":" << str.toUpper(); } mycom->write(buffer, 22); }
Widget::~Widget() { delete ui; }
void Widget::GetPthreadMessage(QString recv) { ui->lineEdit->setText(recv); qDebug() << recv; }
void Widget::on_StartPthread_clicked() { mycom->close();
thread.start(); //就会调用 MyThread里的run函数 ui->StartPthread->setEnabled(false); ui->StopPthread->setEnabled(true); }
void Widget::on_StopPthread_clicked() { if(thread.isRunning()) { thread.stop(); //就会调用 MyThread里的stop函数 ui->StartPthread->setEnabled(true); ui->StopPthread->setEnabled(false); } }
void Widget::chTime() { ui->lcdNumber->display(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); }
|
|