我已经实现了** QTcpserver **。在与客户端(PLC)成功连接后,两者都以双向握手方式交换数据。表示服务器发送带有计数器值的数据,客户端将使用相同的值进行回复,当服务器收到它发送的值,并增加计数器值。这继续循环。我已经完成了使用信号和插槽。
connect(m_tcpSocket, SIGNAL(readyRead()),this, SLOT(socketReadyRead()));
在socketReadyRead()的插槽中,我向数据发送槽connect(this,SIGNAL(newRawData()),this,SLOT(sendRawData()));
发出信号,在那里我发送带有递增计数器值的新数据。注意几乎每30ms调用一次sendRawData()。
void TCPCommunicationPort::socketReadyRead()
{
emit newRawData();//connect to another slot where i send data
// qDebug()<<"bytes available "<<m_tcpSocket->bytesAvailable();
QByteArray receivedData = m_tcpSocket->readAll();
//I am updating the GUI written in QML through signals
emit sendDatatoQml(byteIndex,-1,overrideValue);
//....
}
现在,我发送48Bytes数据,并从客户端收到 68字节**的数据。执行称为归位的功能。我需要设置/启用48字节sendData中的特定位(比如第6字节的第1位和第2位)并等到68字节中的特定位(接收数据)(比如第10字节的第3位)为真(这将是在几个之后)然后我禁用了第6个字节的第1位和第2位。同时,服务器必须继续以递增的计数器值发送** 48字节的数据,否则它将断开连接。怎么穿这个等待?请注意,已经有数据在循环中进行交换。
我试过这样但是Qt的创建者和应用程序都因为infinet while循环而被冻结和崩溃(取消注释它)。如果我删除while循环它不会进入If语句。我必须等待那个If语句。
void TCPCommunicationPort::startHoming()
{
if(!(m_senddataBuffer[CREG1] & (1 << EMSTOP)))
{
m_senddataBuffer[CREG1] |= 1<<EMSTOP;
bool bitvalue = (m_senddataBuffer[CREG1] & (1 << EMSTOP));
dataFromCppUpdate(CREG1,EMSTOP,bitvalue);
}
if(!(m_senddataBuffer[CREG1] & (1 << MSTOP)))
{
m_senddataBuffer[CREG1] |= 1<<MSTOP;
bool bitvalue = (m_senddataBuffer[CREG1] & (1 << MSTOP));
dataFromCppUpdate(CREG1,MSTOP,bitvalue);
}
// emit newRawData();
bool enter =true;
if(m_tcpSocket->waitForReadyRead())
{
qDebug()<<"I am waiting for ACK...";
if((m_oldData[SREG1] & (1 << ACKSTART)))//how should I wait here till that bit is enabled?
{
qDebug()<<"Ack received please disable the Bit";
}
}
qDebug()<<"homing is done";
}
再一次,我几乎每30毫秒从客户端获取数据,我正在将它读取到receivedData []。这意味着连接(m_tcpSocket,SIGNAL(readyRead()),this,SLOT(socketReadyRead()));每30ms调用一次socketReadyRead()。所以我的IF语句有效。但是我必须等到从客户端接收的68Bytes(比如第3个字节的第3位)中的一个位被启用。它继续发送68个字节的数据(每30ms)但是过了一段时间当工作完成时,它将通过启用第10个字节的第3位(ACKSTART)(SREG1)向我发送Ack(几乎在10Sec之后而不是ms)。if((m_oldData[SREG1] & (1 << ACKSTART)))//how should I wait here till this bit is enabled?
任何人都可以告诉我在没有冻结GUI的情况下等待的逻辑。我是否需要将此函数startHoming置于单独的Qthread中?如果是这样怎么办?请给我举个例子。非常感谢