我很新手,正在自学编程。我写了一个应用程序来轮询控制单元中的多个请求。基本上,我不断向控制单元发送各种读取命令,并读取响应。我的程序可以正常工作,我成功地发送了命令并接收到了回答。但是读取速度非常慢(我在代码中设置了100毫秒的超时以确保我获得完整的回复)。
我有一个针对同一控制单元的程序,由专业的C++编码人员编写,他的程序每30毫秒轮询一次,我总是在那个时间范围内收到完整的答案。我使用相同的设置57K波特率,8位1个停止位和无校验位。然而,我的QT代码需要几乎100毫秒才能收到答案。
在我的代码中,我先读取前2个字节(第一个字节是消息标识符,第二个字节是剩余消息长度),然后再循环读取,直到总消息长度等于消息长度字节+1(加1是为了包含第一个字节)。我已经陷入困境,不知道为什么我的QT代码如此缓慢,当我知道限制因素不是硬件时。请求始终是3个字节,回复的长度从3到61字节不等。请帮助我找出错误所在。如果我取消超时设置,我总是有短读取。到目前为止,我也尝试过read(all),但结果相同。
下面是我从代码中提取出来的读取响应部分。完整代码在https://github.com/MarkusIppy/PowerTune上。
我有一个针对同一控制单元的程序,由专业的C++编码人员编写,他的程序每30毫秒轮询一次,我总是在那个时间范围内收到完整的答案。我使用相同的设置57K波特率,8位1个停止位和无校验位。然而,我的QT代码需要几乎100毫秒才能收到答案。
在我的代码中,我先读取前2个字节(第一个字节是消息标识符,第二个字节是剩余消息长度),然后再循环读取,直到总消息长度等于消息长度字节+1(加1是为了包含第一个字节)。我已经陷入困境,不知道为什么我的QT代码如此缓慢,当我知道限制因素不是硬件时。请求始终是3个字节,回复的长度从3到61字节不等。请帮助我找出错误所在。如果我取消超时设置,我总是有短读取。到目前为止,我也尝试过read(all),但结果相同。
下面是我从代码中提取出来的读取响应部分。完整代码在https://github.com/MarkusIppy/PowerTune上。
//Error handling
QTime startTime = QTime::currentTime();
int timeOut = 100; // timeout in milisec.
QByteArray recvData = m_serialport->read(2); // reading first two bytes of received message to determine lenght of ecpected message
int msgLen = recvData[1]; //Total message Lenght excluding the first byte
while ( recvData.size() <= (msgLen+1) )
{
if ( startTime.msecsTo(QTime::currentTime()) > timeOut ) break;
recvData += m_serialport->read(msgLen+1-recvData.size());
}
if (msgLen +1 == recvData.length()) //if the received data lenght equals the message lenght from lenght byte + identifier byte (correct message lenght received )
{
qDebug() << "Received data OK"<<msgLen +1;
if(requestIndex <= 61){requestIndex++;}
else{requestIndex = 58;}
readData(recvData);
}
else //if the lenght of the received message does not correspond with the expected lenght repeat the request
{
qDebug() << "Received data lenght NIO";
readData(recvData);
qDebug() << "Request Message again"<< requestIndex;
}
void MySerial::on_readyRead() { if (!m_port->isOpen()) { return; } dataReady(m_port->readAll()); }
从这里开始:void MySerial::dataReady(const QByteArray &pdu) { m_buffer.append(pdu); if (pdu.contains('\n')) { processResponse(m_buffer); } }
- scopchanov