Qt5:串口信号槽机制信号连接到错误的槽
Qt5: serial port signal-slots mechanism signal connect to the wrong slot
我对 qt 信号槽感到困惑。我使用了以下连接,但它连接到另一个插槽。
void MainWindow::on_otpburndata1Btn_Rd_clicked()
{
if(serialPort->clear(serialPort->AllDirections)){
QByteArray otpburndata1ord;
otpburndata1ord.resize(3);
otpburndata1ord[2]=0x02;
otpburndata1ord[1]=0x08;
otpburndata1ord[0]=0x1D;
serialPort->write(otpburndata1ord.data(),3);
connect(serialPort,SIGNAL(readyRead()),this,SLOT(receiveOtpBurnData1()));
}
}
void MainWindow::receiveOtpBurnData1(){
QByteArray otpburndata1;
otpburndata1.resize(1);
if(serialPort->bytesAvailable()==1){
otpburndata1 = serialPort->readAll();
if(otpburndata1[0]&0x01){
ui->OTP_DATA0->setStyleSheet("background-color:red");
ui->OTP_DATA0->setText("1");
flagThree[0]=1;
}else{
ui->OTP_DATA0->setStyleSheet("background-color:rgb(170, 255, 127)");
ui->OTP_DATA0->setText("0");
flagThree[0]=0;
}
...
...
...
}
}
因为我在 on_otpburndata1Btn_Rd_clicked() 函数之前使用了另一个函数。当我点击 Button:otpburndata1Btn_Rd 时,它从端口读取数据,但连接到另一个插槽 otprddata1Received(),而不是正确的插槽 receiveOtpBurnData1()。之前的代码如下:
void MainWindow::on_otprddata1Btn_clicked()
{
if(serialPort->clear(serialPort->AllDirections)){
QByteArray otprdata1ord;
otprdata1ord.resize(3);
otprdata1ord[0]=0x9D;
otprdata1ord[1]=0x00;
otprdata1ord[2]=0x02;
serialPort->write(otprdata1ord.data(),3);
connect(serialPort,SIGNAL(readyRead()),this,SLOT(otprddata1Received()));
}
}
void MainWindow::otprddata1Received(){
QByteArray otprdata1;
otprdata1.resize(1);
if(serialPort->bytesAvailable()==1){
otprdata1 = serialPort->readAll();
if(otprdata1[0]&0x01){
ui->OTP_RD_DATA0->setStyleSheet("background-color:red");
ui->OTP_RD_DATA0->setText("1");
}else{
ui->OTP_RD_DATA0->setStyleSheet("background-color:rgb(170, 255, 127)");
ui->OTP_RD_DATA0->setText("0");
}
....
}
我已经通过为每个数据添加额外的 2 个字节来区分单击了哪个按钮以及在何处显示接收到的数据来解决了这个问题。这样区分每个数据是正确的。例如,如果GUI要从串口接收1个字节的数据,我又加了2个字节来区分(当然1个字节也可以)。代码如下:
void MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
....
connect(this,SIGNAL(readyReadotprddata1()),this,SLOT(otprddata1Received()));
connect(this,SIGNAL(readyReadotprddata2()),this,SLOT(otprddata2Received()));
connect(this,SIGNAL(readyReadotprddata3()),this,SLOT(otprddata3Received()));
connect(this,SIGNAL(readyReadotpburndata1()),this,SLOT(receiveOtpBurnData1()));
connect(this,SIGNAL(readyReadotpburndata2()),this,SLOT(receiveOtpBurnData2()));
connect(this,SIGNAL(readyReadotpburndata3()),this,SLOT(receiveOtpBurnData3()));
connect(this,SIGNAL(readyReadotpctrlreg1()),this,SLOT(receiveOtpctrlReg1()));
connect(this,SIGNAL(readyReadotpctrlreg2()),this,SLOT(receiveOtpctrlReg2()));
connect(this,SIGNAL(readyReadsiliconid()),this,SLOT(receiveSiliconidDataord()));
}
void MainWindow::on_otprddata1Btn_clicked()
{
if(serialPort->clear(serialPort->AllDirections)){
QByteArray otprdata1ord;
otprdata1ord.resize(3);
otprdata1ord[0]=0x9D;
otprdata1ord[1]=0x00;
otprdata1ord[2]=0x02;
serialPort->write(otprdata1ord.data(),3);
connect(serialPort,SIGNAL(readyRead()),this,SLOT(commonDistinct()));
}
}
....
void MainWindow::commonDistinct(){
if(serialPort->bytesAvailable()==3){
data=serialPort->readAll();
if(data[0].operator ==(0x9D) && data[1].operator ==(0x00)) emit readyReadotprddata1();
else if(data[0].operator ==(0xBD) && data[1].operator ==(0x00)) emit readyReadotprddata2();
else if(data[0].operator ==(0xDD) && data[1].operator ==(0x00)) emit readyReadotprddata3();
else if(data[0].operator ==(0x1D) && data[1].operator ==(0x08)) emit readyReadotpburndata1();
else if(data[0].operator ==(0x1D) && data[1].operator ==(0x04)) emit readyReadotpburndata2();
else if(data[0].operator ==(0x3D) && data[1].operator ==(0x04))emit readyReadotpburndata3();
else if(data[0].operator ==(0x1D) && data[1].operator ==(0x02))emit readyReadotpctrlreg1();
else if(data[0].operator ==(0x1D) && data[1].operator ==(0x01))emit readyReadotpctrlreg2();
else if(data[0].operator ==(0x5D) && data[1].operator ==(0x00))emit readyReadsiliconid();
}
}
void MainWindow::otprddata1Received(){
if(data[2]&0x01){
ui->OTP_RD_DATA0->setStyleSheet("background-color:red");
ui->OTP_RD_DATA0->setText("1");
}else{
ui->OTP_RD_DATA0->setStyleSheet("background-color:rgb(170, 255, 127)");
ui->OTP_RD_DATA0->setText("0");
}
....
}
我之所以用这个答案是因为每次串口接收到数据时都会发出Qt5信号readyRead()。而我所有需要的数据都是1个字节。我不能使用 bytesAvailable() 函数来区分接收到的数据。
我对 qt 信号槽感到困惑。我使用了以下连接,但它连接到另一个插槽。
void MainWindow::on_otpburndata1Btn_Rd_clicked()
{
if(serialPort->clear(serialPort->AllDirections)){
QByteArray otpburndata1ord;
otpburndata1ord.resize(3);
otpburndata1ord[2]=0x02;
otpburndata1ord[1]=0x08;
otpburndata1ord[0]=0x1D;
serialPort->write(otpburndata1ord.data(),3);
connect(serialPort,SIGNAL(readyRead()),this,SLOT(receiveOtpBurnData1()));
}
}
void MainWindow::receiveOtpBurnData1(){
QByteArray otpburndata1;
otpburndata1.resize(1);
if(serialPort->bytesAvailable()==1){
otpburndata1 = serialPort->readAll();
if(otpburndata1[0]&0x01){
ui->OTP_DATA0->setStyleSheet("background-color:red");
ui->OTP_DATA0->setText("1");
flagThree[0]=1;
}else{
ui->OTP_DATA0->setStyleSheet("background-color:rgb(170, 255, 127)");
ui->OTP_DATA0->setText("0");
flagThree[0]=0;
}
...
...
...
}
}
因为我在 on_otpburndata1Btn_Rd_clicked() 函数之前使用了另一个函数。当我点击 Button:otpburndata1Btn_Rd 时,它从端口读取数据,但连接到另一个插槽 otprddata1Received(),而不是正确的插槽 receiveOtpBurnData1()。之前的代码如下:
void MainWindow::on_otprddata1Btn_clicked()
{
if(serialPort->clear(serialPort->AllDirections)){
QByteArray otprdata1ord;
otprdata1ord.resize(3);
otprdata1ord[0]=0x9D;
otprdata1ord[1]=0x00;
otprdata1ord[2]=0x02;
serialPort->write(otprdata1ord.data(),3);
connect(serialPort,SIGNAL(readyRead()),this,SLOT(otprddata1Received()));
}
}
void MainWindow::otprddata1Received(){
QByteArray otprdata1;
otprdata1.resize(1);
if(serialPort->bytesAvailable()==1){
otprdata1 = serialPort->readAll();
if(otprdata1[0]&0x01){
ui->OTP_RD_DATA0->setStyleSheet("background-color:red");
ui->OTP_RD_DATA0->setText("1");
}else{
ui->OTP_RD_DATA0->setStyleSheet("background-color:rgb(170, 255, 127)");
ui->OTP_RD_DATA0->setText("0");
}
....
}
我已经通过为每个数据添加额外的 2 个字节来区分单击了哪个按钮以及在何处显示接收到的数据来解决了这个问题。这样区分每个数据是正确的。例如,如果GUI要从串口接收1个字节的数据,我又加了2个字节来区分(当然1个字节也可以)。代码如下:
void MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
....
connect(this,SIGNAL(readyReadotprddata1()),this,SLOT(otprddata1Received()));
connect(this,SIGNAL(readyReadotprddata2()),this,SLOT(otprddata2Received()));
connect(this,SIGNAL(readyReadotprddata3()),this,SLOT(otprddata3Received()));
connect(this,SIGNAL(readyReadotpburndata1()),this,SLOT(receiveOtpBurnData1()));
connect(this,SIGNAL(readyReadotpburndata2()),this,SLOT(receiveOtpBurnData2()));
connect(this,SIGNAL(readyReadotpburndata3()),this,SLOT(receiveOtpBurnData3()));
connect(this,SIGNAL(readyReadotpctrlreg1()),this,SLOT(receiveOtpctrlReg1()));
connect(this,SIGNAL(readyReadotpctrlreg2()),this,SLOT(receiveOtpctrlReg2()));
connect(this,SIGNAL(readyReadsiliconid()),this,SLOT(receiveSiliconidDataord()));
}
void MainWindow::on_otprddata1Btn_clicked()
{
if(serialPort->clear(serialPort->AllDirections)){
QByteArray otprdata1ord;
otprdata1ord.resize(3);
otprdata1ord[0]=0x9D;
otprdata1ord[1]=0x00;
otprdata1ord[2]=0x02;
serialPort->write(otprdata1ord.data(),3);
connect(serialPort,SIGNAL(readyRead()),this,SLOT(commonDistinct()));
}
}
....
void MainWindow::commonDistinct(){
if(serialPort->bytesAvailable()==3){
data=serialPort->readAll();
if(data[0].operator ==(0x9D) && data[1].operator ==(0x00)) emit readyReadotprddata1();
else if(data[0].operator ==(0xBD) && data[1].operator ==(0x00)) emit readyReadotprddata2();
else if(data[0].operator ==(0xDD) && data[1].operator ==(0x00)) emit readyReadotprddata3();
else if(data[0].operator ==(0x1D) && data[1].operator ==(0x08)) emit readyReadotpburndata1();
else if(data[0].operator ==(0x1D) && data[1].operator ==(0x04)) emit readyReadotpburndata2();
else if(data[0].operator ==(0x3D) && data[1].operator ==(0x04))emit readyReadotpburndata3();
else if(data[0].operator ==(0x1D) && data[1].operator ==(0x02))emit readyReadotpctrlreg1();
else if(data[0].operator ==(0x1D) && data[1].operator ==(0x01))emit readyReadotpctrlreg2();
else if(data[0].operator ==(0x5D) && data[1].operator ==(0x00))emit readyReadsiliconid();
}
}
void MainWindow::otprddata1Received(){
if(data[2]&0x01){
ui->OTP_RD_DATA0->setStyleSheet("background-color:red");
ui->OTP_RD_DATA0->setText("1");
}else{
ui->OTP_RD_DATA0->setStyleSheet("background-color:rgb(170, 255, 127)");
ui->OTP_RD_DATA0->setText("0");
}
....
}
我之所以用这个答案是因为每次串口接收到数据时都会发出Qt5信号readyRead()。而我所有需要的数据都是1个字节。我不能使用 bytesAvailable() 函数来区分接收到的数据。