前言
前面介紹了序列槽類
QSerialPort
及其輔助類
QSerialPortInfo
寫了綜合一點的項目 - 序列槽調試助手
項目源碼已上傳到 GitHub
UI
部分就不展開了,直接放張圖吧
功能及實作
資料發送及接收均支援ASCII、Hex
其實就是資料轉換,而且基本不要自己實作,
Qt
已經提供了一些接口
void MainWindow::on_buttom_sendout_clicked()
{
if(uart_state != s_connect){
setNewsColor(Qt::red);
ui->label_news->setText("SerialPort is't Connect.");
return;
}
if(mBGsendoutmode->checkedId() == SENDOUTMODE_ASCII){
//支援中文需使用toLocal8Bit()
mSerial->write(ui->textEdit_output->toPlainText().toLocal8Bit().data());
}
else if(mBGsendoutmode->checkedId() == SENDOUTMODE_HEX){
QByteArray bytehex = QByteArray::fromHex(
ui->textEdit_output->toPlainText().toLatin1()).data();
mSerial->write(bytehex);
}
}
void MainWindow::slot_uartReadData(){
if(DISPLAYMODE_ASCII == mBGdisplaymode->checkedId()){
ui->textBrowser_intput->insertPlainText(QString::fromLocal8Bit(mSerial->readAll()));
}
else if(DISPLAYMODE_HEX == mBGdisplaymode->checkedId()){
QString re = "";
QByteArray bytearray = mSerial->readAll();
//hex char[] 轉QString
for(int i = 0; i < bytearray.length(); i++){
if((unsigned char)bytearray[i] > 255)
re.append("Error ");
re.append("0x" + QString::number((unsigned char)bytearray[i],16) + " ");
}
ui->textBrowser_intput->insertPlainText(re);
}
}
支援自動換行顯示
在資料接收槽函數中加上該代碼,若在
Linux
平台下則應該為
"\n"
if(ui->checkBox_displayNewline->isChecked()){
if(ui->textBrowser_intput->document()->toPlainText() != "")
ui->textBrowser_intput->insertPlainText("\r\n");
}
支援顯示接收時間
添加該代碼
if(ui->checkBox_displayTime->isChecked()){
ui->textBrowser_intput->insertPlainText(QDateTime::currentDateTime().toString("[hh:mm:ss:zzz] "));
}
支援定時發送資料
使用定時器完成,在多選框中檢測其選擇狀态并完成定時器開啟、關閉操作
mAutosendoutTimer = new QTimer(this);
connect(mAutosendoutTimer,SIGNAL(timeout()),this,SLOT(slot_Timeout_Uartsendout()));
void MainWindow::slot_Timeout_Uartsendout(){
on_buttom_sendout_clicked();
void MainWindow::on_checkBox_sendoutAutoResend_clicked(bool checked)
{
if(checked){
if(s_connect == uart_state){
mAutosendoutTimer->start(ui->lineEdit_AutoResend->text().toInt());
}
else{
setNewsColor(Qt::red);
ui->label_news->setText("SerialPort is't Connect.");
return;
}
}
else{
if(mAutosendoutTimer->isActive())
mAutosendoutTimer->stop();
}
}
}
序列槽使用過程的錯誤将顯示至底部消息欄
除了打開關閉序列槽的結果會顯示到底部消息欄,還綁定了
QSerialPort
的
error
信号
connect(mSerial,SIGNAL(errorOccurred(QSerialPort::SerialPortError)),
this,SLOT(slot_uartError(QSerialPort::SerialPortError)));
void MainWindow::slot_uartError(QSerialPort::SerialPortError error){
QMetaEnum metaError = QMetaEnum::fromType<QSerialPort::SerialPortError>();
ui->label_news->setText(metaError.valueToKey(error));
setNewsColor(Qt::red);
}
支援自定義波特率
我們的波特率選項欄是
QComboBox
,若想實作自定義波特率,則需要将其變為
Edit
這裡借助了
setLineEdit()
,并用正則現在其輸入
void MainWindow::on_comBox_uartDps_currentIndexChanged(int index)
{
//自定義波特率
if(8 == index){
QLineEdit *lineEdit = new QLineEdit(this);
ui->comBox_uartDps->setLineEdit(lineEdit);
lineEdit->clear();
lineEdit->setFocus();
//正則限制輸入
QRegExp rx("[0-9]+$");
QRegExpValidator *validator = new QRegExpValidator(rx, this);
lineEdit->setValidator(validator);
}
else{
ui->comBox_uartDps->setEditable(false);
}
}
打開序列槽後仍可修改序列槽參數
以
StopBit
為例:
void MainWindow::on_comBox_uartStopBit_currentIndexChanged(int index)
{
if(s_connect == uart_state){
QSerialPort::StopBits mStopBits = (QSerialPort::StopBits)(index + 1);
if(mSerial->setStopBits(mStopBits)){
setNewsColor(Qt::black);
ui->label_news->setText("SerialPort setStopBits is OK.");
}
else{
setNewsColor(Qt::red);
ui->label_news->setText("SerialPort setStopBits is Error.");
}
}
}
點選端口實作重新整理
void MainWindow::Init_UartPort(){
ui->comBox_uartPort->clear();
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->comBox_uartPort->addItem(info.portName());
}
}
void MainWindow::on_comBox_uartPort_clicked(){
Init_UartPort();
}