96SEO 2026-02-20 00:04 36
QT实现YmodemFileTransmit.hYmodemFileTransmit.cppBootLoader.hBootLoader.cppYmodem协议源码

帧头包号包号反码数据校验高位校验低位Soh/Stx0x000xFFDATACRC_HCRC_L
以Soh(0x01)开始的数据包信息块是128字节该帧类型总长度为133字节。
以Stx(0x02)开始的数据包信息块是1024字节该帧类型总长度为1029字节。
包号是为数据块的编号将要传送的数据进行分块编号只有一个字节范围为0~255。
大于255的则归零重复计算。
发送方收到接收方发送的CodeC(0x43)命令后才可以开始发送起始帧。
帧头包号包号反码文件名称文件大小填充区校验高位校验低位CodeSoh0x000xFFFileName0x00FileSize0x00NULL(0x00)CRC_HCRC_L
文件名称后必须添加0x00作为结束文件大小值后必须加0x00作为结束余下的位置以0x00填充。
帧头包号包号反码有效数据校验高位校验低位CodeSoh/CodeStx0x000xFFDATACRC_HCRC_L
对于SOH帧若余下数据小于128字节则以0x1A填充该帧长度仍为133字节
余下数据等于1024字节以1029长度帧发送余下数据小于1024字节但大于128字节以1029字节帧长度发送无效数据以0x1A填充余下数据等于128字节以133字节帧长度发送余下数据小于128字节以133字节帧长度发送无效数据以0x1A填充
帧头包号包号反码数据区校验高位校验低位CodeSoh0x000xFFDATACRC_HCRC_L数据区校验都以0x00填充。
StageNone:{transmitStageNone();break;}case
StageEstablishing:{transmitStageEstablishing();break;}case
StageEstablished:{transmitStageEstablished();break;}case
StageTransmitting:{transmitStageTransmitting();break;}case
StageFinishing:{transmitStageFinishing();break;}default:{transmitStageFinished();}}
命令命令码备注CodeNone0x00CodeSoh0x01133字节长度CodeStx0x021024字节长度CodeEot0x04文件传输结束指令CodeAck0x06接收正确指令CodeNak0x15重传当前数据包请求指令CodeCan0x18取消传输指令连续发送5个该命令终止传输CodeC0x43字符CCodeA10x41CodeA20x61
nullptr);~YmodemFileTransmit();void
getTransmitStatus();signals:void
transmitStatus(YmodemFileTransmit::Status
(1000)YmodemFileTransmit::YmodemFileTransmit(QObject*
{setTimeDivide(499);setTimeMax(5);setErrorMax(999);connect(readTimer,
SLOT(readTimeOut()));connect(writeTimer,
}YmodemFileTransmit::~YmodemFileTransmit()
YmodemFileTransmit::setFileName(const
YmodemFileTransmit::setIpAddress(const
YmodemFileTransmit::setPortNumber(quint16
YmodemFileTransmit::startTransmit()
array;array.append(0x02);array.append(0x01);array.append(0xFF);array.append(0x07);array.append(0x01);array.append(0x09);array.append(0x03);QHostAddress
{QThread::msleep(50);readTimer-start(READ_TIME_OUT);return
YmodemFileTransmit::stopTransmit()
StatusAbort;writeTimer-start(WRITE_TIME_OUT);
YmodemFileTransmit::getTransmitProgress()
YmodemFileTransmit::getTransmitStatus()
YmodemFileTransmit::readTimeOut()
{readTimer-stop();transmit();if((status
{readTimer-start(READ_TIME_OUT);}
YmodemFileTransmit::writeTimeOut()
{writeTimer-stop();transmitStatus(status);
YmodemFileTransmit::callback(Status
StatusEstablish:if(file-open(QFile::ReadOnly)
fileInfo.fileName().toLocal8Bit().data());strcpy((char*)buff
fileInfo.fileName().toLocal8Bit().size()
QByteArray::number(fileInfo.size()).data());*len
YMODEM_PACKET_SIZE;YmodemFileTransmit::status
StatusEstablish;transmitStatus(StatusEstablish);return
StatusError;writeTimer-start(WRITE_TIME_OUT);return
fileSize);YmodemFileTransmit::status
StatusTransmit;transmitProgress(progress);transmitStatus(StatusTransmit);return
StatusTransmit;transmitStatus(StatusTransmit);return
StatusFinish:file-close();YmodemFileTransmit::status
StatusFinish;writeTimer-start(WRITE_TIME_OUT);return
StatusAbort:file-close();YmodemFileTransmit::status
StatusAbort;writeTimer-start(WRITE_TIME_OUT);return
StatusTimeout:YmodemFileTransmit::status
StatusTimeout;writeTimer-start(WRITE_TIME_OUT);return
CodeCan;default:file-close();YmodemFileTransmit::status
StatusError;writeTimer-start(WRITE_TIME_OUT);return
YmodemFileTransmit::read(uint8_t*
udpClient-receiveDatagram(len);QByteArray
YmodemFileTransmit::write(uint8_t*
udpClient-writeDatagram((char*)buff,
YmodemFileTransmit.hQT_BEGIN_NAMESPACE
{Q_OBJECTpublic:BootLoader(QWidget*
nullptr);~BootLoader();YmodemFileTransmit*
on_pushButtonConnect_clicked();void
on_pushButtonBrowse_clicked();void
on_pushButtonSend_clicked();void
transmitStatus(YmodemFileTransmit::Status
status);private:Ui::BootLoader*
firemwareTransmitStatus;QUdpSocket*
4002BootLoader::BootLoader(QWidget*
{ui-setupUi(this);this-setWindowTitle(tr(E***rnetYmodem));this-setWindowIcon(QIcon(:/images/main.ico));ymodemFileTransmit
YmodemFileTransmit();connect(ymodemFileTransmit,
SLOT(transmitProgress(int)));connect(ymodemFileTransmit,
SIGNAL(transmitStatus(YmodemFileTransmit::Status)),
SLOT(transmitStatus(YmodemFileTransmit::Status)));udpClient
QUdpSocket(this);connect(udpClient,
BootLoader::readData);firemwareTransmitStatus
false;ui-pushButtonSend-setEnabled(false);ui-pushButtonConnect-setEnabled(true);
BootLoader::on_pushButtonConnect_clicked()
array;array.append(0x02);array.append(0x01);array.append(0xFF);array.append(0x07);array.append(0x01);array.append(0x09);array.append(0x03);QHostAddress
BootLoader::on_pushButtonBrowse_clicked()
QDir::currentPath();ui-lineEditFilePath-setText(QFileDialog::getOpenFileName(this,
BootLoader::on_pushButtonSend_clicked()
{udpClient-abort();if(ui-lineEditFilePath-text().isEmpty())
file!));return;}if(firemwareTransmitStatus
{ymodemFileTransmit-setFileName(ui-lineEditFilePath-text());ymodemFileTransmit-setIpAddress(SERVER_ADDR);ymodemFileTransmit-setPortNumber(SERVER_PORT);if(ymodemFileTransmit-startTransmit()
true;ui-progressBar-setValue(0);ui-pushButtonSend-setText(tr(Cancel));ui-pushButtonConnect-setEnabled(false);}
tr(Closed));ui-pushButtonSend-setText(tr(Send));ui-pushButtonConnect-setEnabled(true);}}
{ymodemFileTransmit-stopTransmit();ui-pushButtonSend-setText(tr(Send));ui-pushButtonConnect-setEnabled(true);}
{while(udpClient-hasPendingDatagrams())
udpClient-receiveDatagram();QByteArray
receivedData;if(receivedData.size()
{ui-pushButtonSend-setEnabled(true);ui-pushButtonConnect-setEnabled(false);}}
BootLoader::transmitProgress(int
{ui-progressBar-setValue(progress);
BootLoader::transmitStatus(Ymodem::Status
YmodemFileTransmit::StatusEstablish:break;case
YmodemFileTransmit::StatusTransmit:break;case
YmodemFileTransmit::StatusFinish:firemwareTransmitStatus
false;QMessageBox::information(this,
QMessageBox::Yes);ui-pushButtonSend-setText(tr(Send));ui-pushButtonSend-setEnabled(false);ui-pushButtonConnect-setEnabled(true);break;case
YmodemFileTransmit::StatusAbort:firemwareTransmitStatus
false;QMessageBox::warning(this,
YmodemFileTransmit::StatusTimeout:firemwareTransmitStatus
false;QMessageBox::warning(this,
tr(Closed));break;default:firemwareTransmitStatus
false;QMessageBox::warning(this,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback