查看完整版本: [-- 求助:在子线程中对串口进行循环写数据,接收方不能收到数据 --]

QTCN开发网 -> Qt嵌入式开发 -> 求助:在子线程中对串口进行循环写数据,接收方不能收到数据 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

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"));
}



ytj0992 2018-10-28 21:04
解决了吗,我也遇到了同样的问题,多次写只有第一次是成功的,后面的没有响应。

cj123sn 2018-11-06 08:42
从代码层面讲,open,close,send,recv,独立开来,从硬件层面讲,要理解何为全双工和半双工,下位机回应的同时,你这里再发送的话,会造成收不到


查看完整版本: [-- 求助:在子线程中对串口进行循环写数据,接收方不能收到数据 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled