(1) 开发环境:qt5.5.1和VS2010 (2) 使用的时候在 pro 添加这句导入模块 QT += serialport (3) //搜索串口,并添加到选项上供使用者选择 foreach(const QSerialPortInfo &Info,QSerialPortInfo ::availablePorts()) { QSerialPort CurrentPort; CurrentPort.setPort(Info); if(CurrentPort.open(QIODevice::ReadWrite)) { this->ui->BlueToothPortComboBox->addItem(CurrentPort.portName());//插入串口的名字 CurrentPort.close(); //先开再关,把串口名称先导入 }
} (4) 连接串口 void MainWindow::on_pushButton_connect_clicked() { CurrentPort = new QSerialPort; CurrentPort->setPortName(this->ui->BlueToothPortComboBox->currentText());//设置串口名 //设置波特率 switch (this->ui->BaudRateComBox->currentIndex()) { case 0: this->ui->textEdit_show->append("Baud:115200"); CurrentPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections); break; case 1: this->ui->textEdit_show->append("Baud:9600"); CurrentPort->setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections); break; default: break; }
//设置数据位数 switch(this->ui->DateRateComBox->currentIndex()) { case 0: this->ui->textEdit_show->append("Data:5"); CurrentPort->setDataBits(QSerialPort::Data5); break; case 1: this->ui->textEdit_show->append("Data:6"); CurrentPort->setDataBits(QSerialPort::Data6); break; case 2: this->ui->textEdit_show->append("Data:7"); CurrentPort->setDataBits(QSerialPort::Data7); break; case 3: this->ui->textEdit_show->append("Data:8"); CurrentPort->setDataBits(QSerialPort::Data8); break; default: break; } //设置奇偶校验 switch(this->ui->ParityComBox->currentIndex()) { case 1:this->ui->textEdit_show->append("Parity: off"); CurrentPort->setParity(QSerialPort::NoParity); break; default: break; } switch(this->ui->StopBitsComBox->currentIndex()) //设置停止位 { case 0: this->ui->textEdit_show->append("StopBits:1"); CurrentPort->setStopBits(QSerialPort::OneStop); break; case 1: this->ui->textEdit_show->append("StopBits:2"); CurrentPort->setStopBits(QSerialPort::TwoStop); break; default: break; } CurrentPort->setFlowControl(QSerialPort::NoFlowControl); //设置流控制
CurrentPort->open(QIODevice::ReadWrite);//打开串口
if(CurrentPort->isOpen()) { this->ui->textEdit_show->append("Succeesfully open the Port "); //关闭设置菜单使能 this->ui->BlueToothPortComboBox->setEnabled(false); this->ui->BaudRateComBox->setEnabled(false); this->ui->DateRateComBox->setEnabled(false); this->ui->ParityComBox->setEnabled(false); this->ui->StopBitsComBox->setEnabled(false);
} else { this->ui->textEdit_show->append("Defeatly open the port"); }
//连接信号槽 QObject::connect(CurrentPort, &QSerialPort::readyRead, this, &MainWindow::Read_Data);
}
(5) 读取数据 void MainWindow::Read_Data()//读取接收到的数据 { QByteArray buf; buf = CurrentPort->readAll();//Qbytearray类提供一个字节数组,buf这里应该是缓冲数据的功能
QString str = QString::fromStdString(buf.toStdString());
str = QString::fromStdString((buf.toHex()).toStdString());
} (6) 发送数据 void MainWindow::sendInfo(const QString &info) { QByteArray sendBuf; if (info.contains(" ")) { info.replace(QString(" "),QString(""));//我这里是把空格去掉,根据你们定的协议来 } qDebug()<<"Write to serial: "<<info; convertStringToHex(info, sendBuf); //把QString 转换 为 hex CurrentPort->write(sendBuf);这句是真正的给单片机发数据 用到的是QIODevice::write 具体可以看文档
} void MainWindow::convertStringToHex(const QString &str, QByteArray &byteData) { int hexdata,lowhexdata; int hexdatalen = 0; int len = str.length(); byteData.resize(len/2); char lstr,hstr; for(int i=0; i<len; ) { //char lstr, hstr=str[i].toLatin1(); if(hstr == ' ') { i++; continue; } i++; if(i >= len) break; lstr = str[i].toLatin1(); hexdata = convertCharToHex(hstr); lowhexdata = convertCharToHex(lstr); if((hexdata == 16) || (lowhexdata == 16)) break; else hexdata = hexdata*16+lowhexdata; i++; byteData[hexdatalen] = (char)hexdata; hexdatalen++; } byteData.resize(hexdatalen); } char MainWindow::convertCharToHex(char ch) { if((ch >= '0') && (ch <= '9')) return ch-0x30; else if((ch >= 'A') && (ch <= 'F')) return ch-'A'+10; else if((ch >= 'a') && (ch <= 'f')) return ch-'a'+10; else return (-1); }
(7) 关闭串口 if (CurrentPort->isOpen()) { CurrentPort->close(); } delete CurrentPort;