各位高手,高高手:目前手上用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"));
}