這是我寫的連接串口的命令
void MotorController::connect_serial() // 槽函式,對應的signal是connect_device按鈕的click()
{
foreach (const QSerialPortInfo &sinfo, QSerialPortInfo::availablePorts()) {
mcsp->setPort(sinfo); // mcsp是指向QSerialPort類的指標
mcsp->open(QIODevice::ReadWrite);
QByteArray checkDevice;
QString2Hex("02504D50312F313030300D0A", checkDevice); //將字串轉換成十六進制字符組
mcsp->write(checkDevice);
if(check_serial())
break;
}
}
bool MotorController::check_serial() // 檢查是否連接到目標設備
{
bool check_link = 0;
QByteArray wished_reply;
QString2Hex("43 09 50 4D 50 31 0D 0A ", wished_reply);
QByteArray readAnswer;
readAnswer = *buf; // buf的定義是:QByteArray *buf = new QByteArray;用來保存從串口接收到的資料
showLinkStatus->setText(readAnswer); // showLinkStatus是一個QLabel,最初狀態什么文字都沒有
if(readAnswer != wished_reply)
mcsp->close();
else{
check_link = 1;
connect_device->hide();
}
return check_link;
}
void MotorController::read_data() // 這是readyRead()信號連接的slot
{
*buf = mcsp->readAll();
}
運行后發現設備根本接收不到checkDevice命令,showLinkStatus沒有任何文本,connect_device沒有被隱藏。
接著將check_serial函式的if陳述句做如下更改
if(readAnswer != wished_reply)
/*mcsp->close()*/;
else{
check_link = 1;
connect_device->hide();
}
再次運行發現設備成功接收到命令(轉臺轉動了),但showLinkStatus沒有任何文本,connect_device沒有被隱藏。
接著改寫代碼
QByteArray MotorController::read_data()
{
QByteArray buf1;
buf1 = mcsp->readAll();
return buf1;
}
void MotorController::connect_serial()
{
foreach (const QSerialPortInfo &sinfo, QSerialPortInfo::availablePorts()) {
mcsp->setPort(sinfo);
mcsp->open(QIODevice::ReadWrite);
QByteArray checkDevice;
QString2Hex("02504D50312F313030300D0A", checkDevice);
mcsp->write(checkDevice);
if(check_serial())
break;
}
}
bool MotorController::check_serial()
{
bool check_link = 0;
QByteArray wished_reply;
QString2Hex("43 09 50 4D 50 31 0D 0A ", wished_reply);
QByteArray readAnswer;
readAnswer = read_data();
showLinkStatus->setText(readAnswer);
if(readAnswer != wished_reply)
/*mcsp->close()*/;
else{
check_link = 1;
connect_device->hide();
}
return check_link;
}
運行后發現:按下一次connect_device,轉臺轉動但showLinkStatus沒有任何文本,connect_device沒有被隱藏;按下第二次發現轉臺轉動,showLinkStatus出現正常文本,connect_device被隱藏。
如果mcsp->close()沒被注釋掉那么3種代碼都無法使轉臺轉動,并且showLinkStatus沒有任何文本,connect_device沒有被隱藏
請問一下各位出現上述情況的原因是什么,我想要在第一次按下connect_device后就達到轉臺轉動,showLinkStatus出現正常文本,connect_device被隱藏這樣的效果改怎么做?
希望各位大神不吝賜教。
uj5u.com熱心網友回復:
你可以指定一個串口試試,別列舉所有串口發送uj5u.com熱心網友回復:
我使用的和設備連接的線是USB轉RS232的連接線,電腦本身識別的串口是這根連接線。我不列舉并檢測連接是否正確的話那我一旦換連接線后這個程式就不能用了。
有什么其他的解決方法嗎?或者說指點我一下發生問題的原因是什么。
uj5u.com熱心網友回復:
帖子太久啦,樓主或許已經解決,不過我還是發表下:你這個應該是check時機不對,check的時候readready還未反饋資料。check代碼應該移到read_data()槽函式里面執行,加個條件判斷就行,下次就不需要繼續check,接受正常資料就行。轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/72510.html
標籤:Qt
