ARM单片机通用IAP在线升级YMODEM协议

2023-11-14

ARM单片机通用IAP在线升级YMODEM协议

效果

在这里插入图片描述
在这里插入图片描述

YMODEM协议格式

/*
接收开始流程:
接收者1HZ发送接收状态:
      /-----------/
    /     C     /
  /-----------/
C:代表字符'C',进入接收状态

发送者发送起始帧:
      /-----------/-----------/-----------/-----------/-----------/-----------/-----------/-----------/
    /    SOH    /    00     /     FF    / FILE_NAME / FILE_SIZE /    NULL   /   CRC_H   /   CRC_L   /
  /-----------/-----------/-----------/-----------/-----------/-----------/-----------/-----------/
/                                   /     C            R           C    /
SOH:代表起始帧,十六进制:0x01,也代表传输数据128字节
CRC:丢弃前三字节,后面为CRC数据区域
帧大小:128+5=133Bytes
NULL:0

接收应答发送:
      /-----------/
    /    ACK    /
  /-----------/
ACK:0x06

接收者发送开始接收标识ONCE:
      /-----------/
    /     C     /
  /-----------/
C:代表字符'C',进入接收状态

发送者发送数据帧:
      /-----------/-----------/-----------/-----------/-----------/-----------/-----------/-----------/
    /  SOH/STX  /  帧编号   / 帧编号反码 /      D       A       T       A    /   CRC_H   /   CRC_L   /
  /-----------/-----------/-----------/-----------/-----------/-----------/-----------/-----------/
/                                   /     C            R           C    /
SOH:十六进制:0x01,也代表传输数据128字节,STX 表示有1024个字节
CRC:丢弃前三字节,后面为CRC数据区域
帧大小:最小128+5=133Bytes 最大1024+5=1029Bytes
帧数据不足:使用0X1A填充

接收应答发送:
      /-----------/
    /    ACK    /
  /-----------/
ACK:0x06

发送结束流程:
发送者发送结束标识:
      /-----------/
    /    EOT    /
  /-----------/
EOT:代表0x04

接收者应答:
      /-----------/
    /    NAK    /
  /-----------/
NAK:代表0x15

发送者再次发送结束标识:
      /-----------/
    /    EOT    /
  /-----------/
EOT:代表0x04

接收应答发送:
      /-----------/
    /    ACK    /
  /-----------/
ACK:0x06

接收者发送开始接收结束帧:
      /-----------/
    /     C     /
  /-----------/
C:代表字符'C',进入接收状态

发送者发送结束帧:
      /-----------/-----------/-----------/-----------/-----------/-----------/-----------/-----------/
    /    SOH    /    00     /     FF    /         N   U   L   L[128]        /   CRC_H   /   CRC_L   /
  /-----------/-----------/-----------/-----------/-----------/-----------/-----------/-----------/
/                                   /     C            R           C    /
SOH:代表结束帧,十六进制:0x01,也代表传输数据128字节
CRC:丢弃前三字节,后面为CRC数据区域
帧大小:128+5=133Bytes
NULL:0

接收应答发送:
      /-----------/
    /    ACK    /
  /-----------/
ACK:0x06

流程结束!
*/

移植修改接口

/**                                                                             
 *  @file YModem.h                                                    
 *                                                                              
 *  @date 2021年01月11日 23:18:49 星期一
 *                                                                              
 *  @author aron566                                                             
 *                                                                              
 *  @brief Ymodem 传输协议.                                                                
 *                                                                              
 *  @version V1.0                                                               
 */                                                                             
#ifndef YMODEM_H                                                          
#define YMODEM_H                                                          
#ifdef __cplusplus ///<use C compiler                                           
extern "C" {                                                                   
#endif                                                                          
/** Includes -----------------------------------------------------------------*/
#include <stdint.h> /**< need definition of uint8_t */                          
#include <stddef.h> /**< need definition of NULL    */                          
#include <stdbool.h>/**< need definition of BOOL    */                        
#include <stdio.h>  /**< if need printf             */                          
#include <stdlib.h>                                                             
#include <string.h>                                                             
#include <limits.h> /**< need variable max value    */                          
/** Private includes ---------------------------------------------------------*/

/** Private defines ----------------------------------------------------------*/
#define FILE_NAME_LEN_MAX       64
#define FILE_SIZE_LEN_MAX       64
#define ENABLE_CRC_START_FRAME  1
/** Exported typedefines -----------------------------------------------------*/
/*Ymodem 帧检测结果*/                                                                
typedef enum                                                               
{                                                                               
  YMODEM_IS_YMODEM_FRAME = 0,  /**< 是Ymodem数据帧 */ 
  YMODEM_IS_NOT_YMODEM_FRAME,                                                
}YMODEM_FRAME_CHECK_STATE_Typedef_t;

/*Ymodem 帧CRC校验结果*/
typedef enum                                                               
{                                                                               
  YMODEM_CRC_OK = 0,          /**< Ymodem数据帧校验正确 */ 
  YMODEM_CRC_ERROR,                                                
}YMODEM_FRAME_CRC_STATE_Typedef_t;

/*Ymodem 运行状态*/
typedef enum
{
  YMODEM_NO_RUNNING = 0,
  /*接收方*/
  YMODEM_START_SEND_C_LOOP,    /**< 启动发 C字符*/
  YMODEM_WAIT_START_SOH,
  YMODEM_REPLY_START_SOH_ACK,
  YMODEM_SEND_SIGNAL_ONE_C,
  YMODEM_WAIT_DATA_FRAME,
  YMODEM_REPLY_DATA_ACK,
  YMODEM_WAIT_START_EOT_FLAG,
  YMODEM_REPLY_START_EOT_NAK,
  YMODEM_WAIT_END_EOT_FLAG,
  YMODEM_REPLY_END_EOT_ACK,
  YMODEM_SEND_ONE_C_END,
  YMODEM_WAIT_END_SOH,
  YMODEM_REPLY_END_SOH_ACK,

  /*发送方*/
  YMODEM_WAIT_START_C,      /**< 等待起始 C字符*/
  YMODEM_SEND_START_FRAME,  /**< 发送起始帧*/
  YMODEM_WAIT_START_ACK,    /**< 等待ACK*/
  YMODEM_WAIT_START_REC,    /**< 等待接收C字符发送数据起始*/
  YMODEM_SEND_DATA_FRAME,
  YMODEM_WAIT_DATA_ACK,
  YMOMDE_SEND_EOT_FRAME,
  YMODEM_WAIT_NAK,
  YMODEM_SEND_EOT_END,
  YMODEM_WAIT_EOT_ACK,
  YMODEM_WAIT_REC_END_C,  	/**< 等待接收结束帧信号*/
  YMODEM_SEND_END_FRAME,
  YMODEM_WAIT_END_ACK,

  YMODEM_COMPLETE
}YMODEM_TRANSFER_STEP_Typedef_t;

/*Ymodem 运行结果*/
typedef enum
{
  YMODEM_SUCCESSFUL = 0,      /**< 运行成功*/
  YMODEM_RUN_TIMEOUT,         /**< 运行超时*/
  YMODEM_IS_RUNNING,          /**< 运行中*/
  YMODEM_ABORT_ERROR,         /**< 运行中止*/
  YMODEM_FRAME_NOT_MATCH,     /**< 帧不匹配*/
  YMODEM_UNKNOW_ERROR,        /**< 未知错误*/
}YMODEM_RUN_RESULT_Typedef_t;

/*Ymodem 句柄*/
/*Ymodem 模式选择状态*/
typedef enum
{
  YMODEM_REC_MODE = 0,
  YMODEM_SEND_MODE,
}YMODEM_MODE_Typedef_t;
/*Ymodem 数据接收回调*/
/**
 * @brief 接收数据回调
 * @param data 数据
 * @param size 数据长度
 * @param packet_num 第几包数据
 * @return 接收数据大小
 */
typedef uint32_t (*YMODEM_REC_DATA_CALLBACK)(const uint8_t *data, uint32_t size, uint8_t packet_num);
/*Ymodem 数据发送回调*/
/**
 * @brief 填充发送数据回调
 * @param dest_buf 数据存储区
 * @param size 存储区大小
 * @param packet_num 填充本次数据包号
 * @return 本次填充数据大小
 */
typedef uint32_t (*YMODEM_SEND_DATA_CALLBACK)(uint8_t *dest_buf, uint32_t size, uint8_t *packet_num);
/*Ymodem 答复接口回调*/
/**
 * @brief 发送数据接口
 * @param data 数据
 * @param size 数据长度
 * @return None
 */
typedef void (*YMODEM_REPLY_DATA_CALLBACK)(const uint8_t *data, uint32_t size);

typedef struct 
{
  char file_name[FILE_NAME_LEN_MAX];              /**< 发送/接收文件名*/
  uint32_t file_size;                             /**< 发送/接收文件大小*/
  float current_progress;                         /**< 当前文件发送/接收进度*/
  float last_progress;                            /**< 上次文件发送/接收进度*/
  uint32_t time_cnt;                              /**< 时间计时*/
  uint32_t set_time_out;                          /**< 任务超时*/
  uint32_t last_time;                             /**< 上次运行时间*/
  uint32_t file_size_cnt;                         /**< 当前发送/接收报总大小*/
  YMODEM_REC_DATA_CALLBACK set_rec_data_func;     /**< 接收数据回调*/
  YMODEM_SEND_DATA_CALLBACK set_send_data_func;   /**< 发送数据回调*/
  YMODEM_REPLY_DATA_CALLBACK set_reply_data_func; /**< 答复数据回调*/
  YMODEM_MODE_Typedef_t set_mode;                 /**< Ymodem模式状态*/
  YMODEM_TRANSFER_STEP_Typedef_t run_step;        /**< Ymodem运行状态*/
}YMODEM_HANDLE_Typedef_t;
/** Exported constants -------------------------------------------------------*/

/** Exported macros-----------------------------------------------------------*/
#ifndef ASSERT_PAR
#define ASSERT_PAR(par, value, out) do{ \
                                        if(par == value) \
                                        { \
                                          out; \
                                        }}while(0)
#endif
/** Exported variables -------------------------------------------------------*/
/** Exported functions prototypes --------------------------------------------*/

/*Ymodem ms计时接口回调-放入systick或者1ms定时器中断中*/
void ymodem_update_time_ms_Port(void);

/*Ymodem 初始化*/
/**
 * @brief Ymodem 初始化
 * 
 * @param handle Ymodem句柄
 * @param mode 运行模式:YMODEM_REC_MODE接收模式/YMODEM_SEND_MODE发送模式
 * @param rec_func 接收数据回调
 * @param send_func 发送数据时的填充数据回调
 * @param reply_func 回复数据回调
 * @param time_out 超时时间
 * @return true 
 * @return false 
 */
bool ymodem_init(YMODEM_HANDLE_Typedef_t *handle, YMODEM_MODE_Typedef_t mode, YMODEM_REC_DATA_CALLBACK rec_func
                  ,YMODEM_SEND_DATA_CALLBACK send_func, YMODEM_REPLY_DATA_CALLBACK reply_func, uint32_t time_out);
/*Ymodem 启动*/
/**
 * @brief Ymodem 启动,循环调用,注意数据一帧大小接收缓冲区应大于133
 * 
 * @param handle Ymodem句柄
 * @param data 将接收到的数据帧传递
 * @param len 数据帧大小字节数
 * @return YMODEM_RUN_RESULT_Typedef_t 
 */
YMODEM_RUN_RESULT_Typedef_t ymodem_task_run(YMODEM_HANDLE_Typedef_t *handle, uint8_t *data, uint32_t len);

/*Ymodem 获取文件名及大小*/
/**
 * @brief Ymodem 获取文件名及大小
 * 
 * @param handle Ymodem句柄
 * @param file_size 获得文件大小
 * @return const char* 
 */
const char *ymodem_get_file_info(YMODEM_HANDLE_Typedef_t *handle, uint32_t *file_size);

/*Ymodem 获得当前发送或接收进度*/
/**
 * @brief Ymodem 获得当前发送或接收进度
 * 
 * @param handle Ymodem句柄
 * @return float 当前进度
 */
float ymodem_get_progress(YMODEM_HANDLE_Typedef_t *handle);

/*Ymodem 发送文件信息设置*/
/**
 * @brief Ymodem 发送文件信息设置
 * 
 * @param handle Ymodem句柄
 * @param file_name 设置发送的文件名
 * @param file_size 设置发送的文件大小
 */
void ymodem_set_send_file_info(YMODEM_HANDLE_Typedef_t *handle, const char *file_name, uint32_t file_size);

#ifdef __cplusplus ///<end extern c                                             
}                                                                               
#endif                                                                          
#endif                                                                          
/******************************** End of file *********************************/
                                                                                

测试代码

/*STEP 1 创建句柄对象*/
YMODEM_HANDLE_Typedef_t ymodem_handle;

int main(void)
{
  uint8_t data[133] = {0};
  uint32_t len = 0;
  Uart_Dev_Handle_t *uart_handle = Uart_Port_Get_Handle(UART_NUM_1);
  /*STEP 2 初始化为接收,60s为超时退出*/
  ymodem_init(&ymodem_handle, YMODEM_REC_MODE, ymodem_get_data, NULL, ymodem_send_data, 60);
  /* Infinite loop */
  for(;;)
  {
    len = CQ_getLength(uart_handle->cb);
    len = (len > 133)?133:len;
    CQ_getData(uart_handle->cb, data, len);
    /*STEP 3 将来自发送方的数据传递给ymodem执行解析运行 返回 YMODEM_IS_RUNNING代表正常,YMODEM_SUCCESSFUL代表完成 YMODEM_RUN_TIMEOUT代表超时 YMODEM_ABORT_ERROR代表异常中止*/
    ymodem_task_run(&ymodem_handle, data, 133);
    HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
    osDelay(10);
  }
}
/*提供接收文件数据的接口*/
static uint32_t ymodem_get_data(const uint8_t *data, uint32_t size, uint8_t packet_num)
{
  static uint32_t size_cnt = 0;
  printf("ymodem rec:%uBytes PacketNum: %hhu \r\n", size, packet_num);
  size_cnt += size;
  printf("ymodem rec cnt:%uBytes \r\n", size_cnt);
  return size;
}
/*提供发送响应数据的接口*/
static void ymodem_send_data(const uint8_t *data, uint32_t size)
{
//  printf("ymodem send: 0x%02X, Size:%u\r\n", data[0], size);
  Uart_Dev_Handle_t *uart_handle = Uart_Port_Get_Handle(UART_NUM_1);
  Uart_Port_Transmit_Data(uart_handle, (uint8_t *)data, (uint16_t)size);
}

代码获取

github Ymodem

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM单片机通用IAP在线升级YMODEM协议 的相关文章

  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • 毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计

    基于STM32的智能温室控制蓝牙声光报警APP系统设计 1 项目简介 1 1 系统构成 1 2 系统功能 2 部分电路设计 2 1 stm32f103c8t6单片机最小系统电路设计 2 2 LCD1602液晶显示电路设计 2 2 风
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • VSCode——修改VSCode背景图片

    1 以管理员身份运行VS Code 安装background插件 2 打开设置 在搜索框中输入background 选择扩展中的plugin background 选择在setting json中编辑 3 在用户设置中输入以下代码 修改完后
  • [QT入门篇]信号槽机制

    一 信号与槽的引入 信号与槽 Signal Slot 是 Qt 编程的基础 信号槽 实际是观察者模式 发布 订阅模式 当某个事件发生之后 比如 按钮检测到自己被点击了一下 它就会发出一个信号 signal 这种发出是没有目的的 类似广播 如
  • 【NLP】第 1 章 :机器阅读理解简介

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Python可视化-气泡图

    气泡图类似散点图 也是表示XY轴坐标之间的变化关系 也可以像彩色散点图给点上色 区别在于可以通过图中散点的大小来直观感受其所表示的数值大小 一 数据文件准备 1 PeopleNumber csv city people price NJ 8
  • Android VNDK的作用

    本文目的是让你理解VNDK是什么作用 暂不做细节讲解 在Android 8 0及更高版本中 引入了很多技术都是为了将system和vendor分离 这样设备厂商和芯片供应商只需关心vendor实现 那么vendor实现时要加载framewo
  • 【总结】前端常用编码写法合集

    一 css样式 1 文字多行溢出 单行溢出 overflow hidden white space nowrap text overflow ellipsis 多行溢出 display webkit box webkit box orien
  • Vue教程(一):Vue核心

    Vue教程 一 Vue核心 1 1 Vue简介 1 1 1 Vue是什么 一套用于构建用户界面的渐进式JS框架 1 1 2 谁开发的 尤雨溪 2015 10 27 正式发布 Vue1 0 0 Evangelion 新世纪福音战士 2016
  • C语言 结构体初阶

    头文件 define CRT SECURE NO WARNINGS 1 include
  • 毕设系列三之利用tensorflow做深度学习情感分析

    利用tensorflow做深度学习情感分析 深度学习作为一项学习数据的多层特征或表征的强大机器学习技术 此项目中 将使用tensorflow深度学习平台 通过相关模型的构建 以及数据的处理 完成微博评论情感分析 已到达类似百度AI情感分析功
  • 多态(polymorphic)

    目录 1 多态的基本介绍 2 多态实现条件 3 重写 重写的介绍 重写和重载的区别 动 静态绑定机制 5 向上转型和向下转型 向上转型 向上转型的特点 总结 向下转型 多态的优缺点 多态是Java三大基本特征中最抽象也是最重要的特征 多态是
  • Html获取Url参数 解决中文乱码

    Html 获取 Url 参数 解决中文乱码 方法一 分割为数组 function getQueryVariable name var query window location search substring 1 var vars que
  • hibernate 反向生成数据库表

    hibernate 配置属性中 hibernate hbm2ddl auto可以帮助你实现正向工程 即由 java 代码生成数据库脚本 进而生成具体的表结构 在hibernate cfg xml中 java 代码 html view pla
  • idea

    1 本人最近刚开始切换到 Intellij idea 发现一个问题 maven工程项目老是有红色下划线提示错误 Cannot Resolve Symbol 但是这些依赖都已经通过pom引进了 idea的Library中也能看到 试一下Fil
  • mysql 建表语句 及完整案例

    1 最简单的 表名为name info 只包含id列和name列 执行sql语句 CREATE TABLE name info id int not null name char 12 2 将id列设置为主键 执行sql语句 CREATE
  • 数据结构Java实现06----中缀表达式转换为后缀表达式

    本文转载至 http www cnblogs com smyhvae p 4790373 html 本文主要内容 表达式的三种形式 中缀表达式与后缀表达式转换算法 一 表达式的三种形式 中缀表达式 运算符放在两个运算对象中间 如 2 1 3
  • 【华为OD机试真题 JS】火锅

    标题 火锅 时间限制 1秒 内存限制 262144K 语言限制 不限 入职后 导师会请你吃饭 你选择了火锅 火锅里会在不同时间下很多菜 不同食材要煮不同的时间 才能变得刚好合适 你希望吃到最多的刚好合适的菜 但是你的手速不够快 用m代表手速
  • [培训-无线通信基础-2]:无线电磁波传播机制(传播、衰减、链路预算)

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 118667807 引言 既然无
  • vue crypto-js加解密

    1 安装crypto js npm install crypto js save 2 编写encrypt js const CryptoJS require crypto js import md5 from js md5 var key
  • 关于程序员【锁死】服务器

    干程序员这么多年 头一次听说 锁死 服务器这么个名词 乍一听到被媒体造的这个名词 觉着很突兀 自己念两遍就会感到头疼 恶心 想吐这么膈应 服务器到底是怎么 锁死 的 什么玩意 你看看人家 数据库系统概论 里面人家关于 锁 的一个翻译 死锁
  • ARM单片机通用IAP在线升级YMODEM协议

    ARM单片机通用IAP在线升级YMODEM协议 效果 YMODEM协议格式 移植修改接口 测试代码 代码获取 效果 YMODEM协议格式 接收开始流程 接收者1HZ发送接收状态 C C 代表字符 C 进入接收状态 发送者发送起始帧 SOH