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协议 的相关文章

  • STM32在Debug时程序运行时间不对,Debug时定时器中断每次进入断点时间不对,定时器一开启就进入中断的解决办法

    一 Debug时程序时间不对解决办法 1 点击魔术棒 2 点击Debug 点击Settings 3 点击Trace 在Core Clock里修改为你的系统时钟 二 Debug时定时器中断每次进入断点时间不对 在Debug时 程序停下来 定时
  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include

随机推荐

  • 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