一、基于QT
-
此工程,我只测试了发送部分,非常好~
可以基于此进行IAP的上位机开发传送门:https://github.com/XinLiGH/SerialPortYmodem
框架:Qt 5.7.1
编译器:MSVC2015_64bit
IDE:Qt Creator 4.2.0 社区版
操作系统:Windows 10 专业版
-
基于此工程,我做了一个ESP32的IAP工具(ESP32老是要自己按复位,太麻烦了)
我优化了一下下:
(1).增加了串口号的显全(之前只能看到COM几,是什么描述看不到,这里读取描述后加item,然后再分割串口号字符给到串口API)
(2).增加一个刷新串口的按钮
(3).增加一条命令,让设备进入Ymodem模式
(3).这里我列出修改和增加的点void Widget::on_pushButton_clicked() { //重新刷串口 qDebug() << "刷新串口"; QSerialPortInfo serialPortInfo; ui->comPort->clear(); foreach(serialPortInfo, QSerialPortInfo::availablePorts()) { ui->comPort->addItem(serialPortInfo.portName()+"--"+serialPortInfo.description()); } void Widget::on_comButton_clicked() { static bool button_status = false; if(button_status == false) { QString str = ui->comPort->currentText(); QStringList list = str.split("--"); // serialPort->setPortName(ui->comPort->currentText()); serialPort->setPortName(list.at(0)); serialPort->setBaudRate(ui->comBaudRate->currentText().toInt()); if(serialPort->open(QSerialPort::ReadWrite) == true) { button_status = true; ui->comPort->setDisabled(true); ui->comBaudRate->setDisabled(true); ui->comButton->setText(u8"关闭串口"); ui->transmitBrowse->setEnabled(true); ui->receiveBrowse->setEnabled(true); if(ui->transmitPath->text().isEmpty() != true) { ui->transmitButton->setEnabled(true); } if(ui->receivePath->text().isEmpty() != true) { ui->receiveButton->setEnabled(true); } } else { QMessageBox::warning(this, u8"串口打开失败", u8"请检查串口是否已被占用!", u8"关闭"); } } else { button_status = false; serialPort->close(); ui->comPort->setEnabled(true); ui->comBaudRate->setEnabled(true); ui->comButton->setText(u8"打开串口"); ui->transmitBrowse->setDisabled(true); ui->transmitButton->setDisabled(true); ui->receiveBrowse->setDisabled(true); ui->receiveButton->setDisabled(true); } } void Widget::on_transmitButton_clicked() { if(transmitButtonStatus == false) { serialPort->close(); ymodemFileTransmit->setFileName(ui->transmitPath->text()); // ymodemFileTransmit->setPortName(ui->comPort->currentText()); QString str = ui->comPort->currentText(); QStringList list = str.split("--"); // serialPort->setPortName(ui->comPort->currentText()); ymodemFileTransmit->setPortName(list.at(0)); ymodemFileTransmit->setPortBaudRate(ui->comBaudRate->currentText().toInt()); if(ymodemFileTransmit->startTransmit() == true) { transmitButtonStatus = true; ui->comButton->setDisabled(true); ui->receiveBrowse->setDisabled(true); ui->receiveButton->setDisabled(true); ui->transmitBrowse->setDisabled(true); ui->transmitButton->setText(u8"取消"); ui->transmitProgress->setValue(0); } else { QMessageBox::warning(this, u8"失败", u8"文件发送失败!", u8"关闭"); } } else { ymodemFileTransmit->stopTransmit(); } } } bool YmodemFileTransmit::startTransmit() { progress = 0; status = StatusEstablish; if(serialPort->open(QSerialPort::ReadWrite) == true) { //发送一下开始命令 uint8_t start_iap_data[3] = {0xaa,0x01,0xe5}; serialPort->write((const char *)&start_iap_data,3); readTimer->start(READ_TIME_OUT); return true; } else { return false; } }
二、基于C#
此工程,测试了一下,会在串口读取部分出现错误,具体没继续研究了
可以用来移植到单片机上面