serialportthread_2::serialportthread_2(QObject *parent) : QThread(parent){ connect(&this->port,SIGNAL(readyRead()),this,SLOT(receive()));}
void serialportthread_2::run(){ if(open()){ while(1){ port.waitForReadyRead(100); this->msleep(100); } } exec();}
bool serialportthread_2::receive(){ port.read(&data[0],30); // далее вытаскиваю данные port.reset(); // если без этой строчки - через некоторое время программа виснет на строках [b]exec()[/b] либо [b]port.read(&data[0],30)[/b]}
void serialportthread_2::run(){ if(open()){ port.waitForReadyRead(-1); } exec();}
#include "serialportthread_2.h"#include "mainwidget.h"serialportthread_2::serialportthread_2(QObject *parent) : QThread(parent){ connect(&this->port,SIGNAL(readyRead()),this,SLOT(receive()));}void serialportthread_2::run(){ if(open()){ } else{ emit response_2("can't open serial port"); } exec();}bool serialportthread_2::open(){ //port.setPortName("/dev/ttyMI3"); port.setPortName("/dev/ttyUSB0"); if(port.open(QIODevice::ReadWrite)){ port.setBaudRate(QSerialPort::Baud19200); port.setDataBits(QSerialPort::Data8); //port.setParity(QSerialPort::NoParity); port.setStopBits(QSerialPort::OneStop); return true; } else{ return false; }}bool serialportthread_2::close(){ port.close();}bool serialportthread_2::receive(){ port.read(&data[0],30); // зависает на этой строчке ... QByteArray b; b.append(&data[i],12); QString msg = b.toHex(); emit response_2(msg);}bool serialportthread_2::send(){ if(port.write(komanda,n_k))}
void MyObject::connected(){ offset = 0LL;}void MyObject::readyData(){ QTcpSocket * s = qobject_cast<QTcpSocket*>(sender()); //при условии что один поток, можно вообще напрямую обращаться к внутренним данным если сокет/порт один на объект qint64 bytesCount = s->bytesAvailable(); if(bytesAvailable<neededSize) //needed size - размер ожидаемых данных, как его получить вам решать (константа или получать как то в заголовках пакетов) return; qint64 readBytes = s->read(&data[offset],neededSize); if(readBytes<0LL) { //обработка ошибки чтения } else if(readBytes==0LL) { //сокет был закрыт на удаленной стороне, на счёт ком порта не знаю но лучше проверить } else offset += readBytes //если у вас буфер на несколько пакетов или читаете частями if(offset==desiredPacketSize) //получены данные целиком { emit dataReady(&data[0]); //сигналим о полном приеме пакета с адресом буфера, или передавать QByteArray(data); }}
struct Header {quint32 signature;quint32 packetSize;... //прочие полезные данные};
[Header][Data .....][Header][Data ...]...