我是Qt的初学者。首先,我想做一个应用程序来与串行设备通信。这是我在线上做的交流。发送工作很完美,但我在接收信息方面有问题。在发送帧后,该消息将被适当地增强。我认为这个问题与m_Serial->waitForReadyRead(10)有关。
下面我粘贴我的代码:
void SerialWorker::doWork()
{
qDebug()<<"Starting worker process in Thread "<<thread()->currentThreadId();
bool abort = false;
quint8 inByte;
quint8 checksum_temp;
int numByte = 0;
int receiverStatus = RCV_ST_IDLE;
Frame *m_inFrame = nullptr;
int dataLength = 0;
QByteArray buffer_checksum;
// Serial Port Initialization
m_Serial = new QSerialPort();
m_Serial->setPortName("COM6");
m_Serial->setBaudRate(QSerialPort::Baud9600);
m_Serial->setDataBits(QSerialPort::Data8);
m_Serial->setParity(QSerialPort::NoParity);
m_Serial->setStopBits(QSerialPort::OneStop);
m_Serial->setFlowControl(QSerialPort::NoFlowControl);
m_Serial->open(QIODevice::ReadWrite);
qDebug() << "SerialPort Status: " << m_Serial->isOpen();
while(!abort)
{
mutex.lock();
abort = _abort;
mutex.unlock();
if(!m_outFrameQueue->isEmpty())
{
Frame *outFrame = m_outFrameQueue->dequeue();
sendFrame(outFrame);
delete outFrame;
} else
{
if (m_Serial->waitForReadyRead(10))
{
QByteArray receivedData = m_Serial->readAll();
while(receivedData.count() > 0)
{
inByte = quint8(receivedData[0]);
receivedData.remove(0,1);
switch (receiverStatus)
{
case RCV_ST_IDLE:
{
if(inByte == Frame::FRAME_ADDR_RFiD)
{
if (m_inFrame == nullptr)
m_inFrame = new Frame();
else
m_inFrame->Clear();
m_inFrame->AddByte(inByte);
buffer_checksum.append(inByte);
receiverStatus = RCV_ST_DATA_LENGTH;
}
else
{
buffer_checksum.clear();
}
} break;
case RCV_ST_DATA_LENGTH:
{
dataLength = inByte;
numByte = dataLength - 6;
m_inFrame->AddByte(inByte);
buffer_checksum.append(inByte);
receiverStatus = RCV_ST_CMD;
} break;
case RCV_ST_CMD:
{
m_inFrame->AddByte(inByte);
buffer_checksum.append(inByte);
if(numByte > 0)
receiverStatus = RCV_ST_DATA;
else receiverStatus = RCV_ST_CODE;
} break;
case RCV_ST_DATA:
{
m_inFrame->AddByte(inByte);
buffer_checksum.append(inByte);
if (--numByte == 0)
receiverStatus = RCV_ST_CODE;
else if (numByte < 0)
receiverStatus = RCV_ST_IDLE;
} break;
case RCV_ST_CODE:
{
m_inFrame->AddByte(inByte);
buffer_checksum.append(inByte);
receiverStatus = RCV_ST_CHECKSUM_HI;
} break;
case RCV_ST_CHECKSUM_HI:
{
checksum_temp = (m_inFrame->CalculateCRC2_in(buffer_checksum) >> 8) & 0xFF;
if (inByte == checksum_temp)
{
m_inFrame->AddByte(checksum_temp);
receiverStatus = RCV_ST_CHECKSUM_LO;
}
else
{
receiverStatus = RCV_ST_IDLE;
m_inFrame->Clear();
delete m_inFrame;
}
} break;
case RCV_ST_CHECKSUM_LO:
{
checksum_temp = m_inFrame->CalculateCRC2_in(buffer_checksum) & 0xFF;
if (inByte == checksum_temp)
{
receiverStatus = RCV_ST_IDLE;
m_inFrame->AddByte(checksum_temp);
emit this->frameReceived(m_inFrame);
qDebug()<< "Frame: " << Qt::hex << m_inFrame;
}
else
{
receiverStatus = RCV_ST_IDLE;
m_inFrame->Clear();
delete m_inFrame;
}
} break;
}
}
}
}
}
}我检查了设备是否确实发送帧,通过下面的代码
void SerialWorker::doWork()
{
qDebug()<<"Starting worker process in Thread "<<thread()->currentThreadId();
bool abort = false;
quint8 inByte;
quint8 checksum_temp;
int numByte = 0;
int receiverStatus = RCV_ST_IDLE;
Frame *m_inFrame = nullptr;
int dataLength = 0;
QByteArray buffer_checksum;
// Serial Port Initialization
m_Serial = new QSerialPort();
m_Serial->setPortName("COM6");
m_Serial->setBaudRate(QSerialPort::Baud9600);
m_Serial->setDataBits(QSerialPort::Data8);
m_Serial->setParity(QSerialPort::NoParity);
m_Serial->setStopBits(QSerialPort::OneStop);
m_Serial->setFlowControl(QSerialPort::NoFlowControl);
m_Serial->open(QIODevice::ReadWrite);
qDebug() << "SerialPort Status: " << m_Serial->isOpen();
while(!abort)
{
mutex.lock();
abort = _abort;
mutex.unlock();
QByteArray receivedData = m_Serial->readAll();
if(!m_outFrameQueue->isEmpty())
{
Frame *outFrame = m_outFrameQueue->dequeue();
sendFrame(outFrame);
delete outFrame;
} else
{
if (receivedData.count() > 0) {
qDebug() << "something came: "<< Qt::hex << receivedData.toHex() ;
receivedData.clear();
}
}
}
}而且它是有效的。在receivedData.toHex()中,接收帧ic正确。那么,像第一段代码那样粘贴我的全部灵魂又有什么问题呢?
发布于 2022-10-21 05:46:46
我通过为readyRead()信号创建一个插槽来解决我的问题。这里描述了解决方案/问题:
https://stackoverflow.com/questions/74122134
复制相似问题