爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【.NET 与树莓派】九种手势识别模块(PAJ7620)

      首页 知识中心 其他 文章详情页

      【.NET 与树莓派】九种手势识别模块(PAJ7620)

      2024-06-26 06:17:16 阅读次数:44

      NET,寄存器

      你要是说手势识别这玩意儿到底用处有多大,真的不好说,大不算大,小也不算小。日常生活中见得比较多的像一些小台灯、厨房开关之类,都有使用手势识别。从实用方面看,厨房里装手势开关还不错的,有时候满手都是猪油鸡油的,再用手按按开关,过不了几个月,开关按钮都变成麦牙糖了。或者干脆整个手势开水龙头也行。不过话又说回来,这玩意儿目前的情况,识别率还不算高。你可能会说。花大价钱买个贵一些的就会准确率高了,这个嘛,还真不一定。你懂的,现在许多“高科技”产品,说难听一点就是商业泡沫,哄你去买。它加个传感器,可能成本就是3到5块钱,但它可以忽悠你这多么高端,所以我要卖贵60元。还有一些特熟悉的吹牛口号——“很贵,但很值得”、“不要买XXX,除非你看过我”。

      手势感应有好几种芯片,老周买的是正点原子的 PAJ7620(主要是冲着九种手势识别这功能,有的只是六种手势识别)。话说这货也不便宜,说实话,当初还不如买亚博的。亚博的模块有个优点:支持多种接线法,可以用 X-pin 排线口,可以用杜邦线,也可以用鳄鱼夹。

      该模块长这样子。

      【.NET 与树莓派】九种手势识别模块(PAJ7620)

       不要被图片误导了,拿到手之后,发现这玩意儿很小,这不,你看……

      【.NET 与树莓派】九种手势识别模块(PAJ7620)

       手机拍照时,如果模块正在使用,你从手机屏幕上会看到有个亮点,这是PAJ7620上面的红外发射器。

      此模块使用 IIC(I2C)协议通信,默认的从机地址是 0x73。操作作方式是读写寄存器。每个寄存器都有其各自的地址,只要向相应的地址写入字节,数据就会存到寄存器中。

      1、读寄存器的方法:首先向从机地址0x73写入要读的寄存器的地址;然后从模块读取一个字节,这个字节就是该寄存器的值。

      2、写寄存器的方法:向从机地址0x73写入两个字节——第一个字节指定寄存器的地址,第二个字节是要写入的值。

      举例:

      a、要向寄存器0x42写入0x01,那么就向从机0x73发送两个字节:0x42、0x01。

      b、要读取寄存器0x23的值,先向从机0x73发送一个字节0x23,然后读一个字节。

      ==========================================================

      PAJ7620 模块的寄存器不多,操作起来也不算复杂。发现有些大伙伴们说模块没反应,是不是坏了?这个不好说,不过一般不会,买到坏的模块也是需要运气的。最大的可能是你操作的流程不对。因为这个模块有点奇葩(可以为了节约电费):通电后默认是处于休眠状态,所以是不会识别手势的。

      所以老周估计这位同学大概是没有把模块唤醒就读取数据,那你读到的只能是00 00 00 00了。

      好了,F话不扯,但老周也不打算把寄存器一个个地介绍,那样太无聊了,咱们结合实际的使用来阐述。

      No.1 选择寄存器带区(地址:0xEF)

      PAJ7620虽然寄存器不多,但它热爱分区。其寄存器总共分了两个带区——Bank 0 和 Bank 1。所以,有的寄存器位于 Bank 0,有的寄存器位于 Bank 1,咱们在操作时一定要注意,读写寄存器前要先切换带区,不然读到的值是不对的。

      带区切换方法:

      * 第一带区:向寄存器 0xEF 写入 0x00;

      * 第二带区:向寄存器 0xEF 写入 0x01。

      比如,寄存器地址 0x72 用于启用(使能)或禁用(失能)PAJ7620 模块,它位于 Bank 1 带区。要读写该寄存器,得分两步走(0x73是从机地址)。

      step 1:---> 0x73 写入 0xEF 0x01

      step 2:---> 0x73 读取 0x72

      No.2 使能寄存器(地址:0x72)

      这个寄存器上面提过,它位于 Bank 1 中。向这个寄存器写入 0x00 会禁用PAJ7620模块,写入 0x01 启用此模块。

      No.3 挂起和唤醒模块

      挂起,即休眠状态的值存放在寄存器 0x03 中,位于 Bank 0。寄存器的值只有第一个二进制位有用,0x00 表示模块正在工作,0x01 表示模块进入休眠。

      要让模块进入休眠状态,步骤如下:

      1、向0xEF发送0x01,选择 Bank 1;

      2、向寄存器 0x72 写入 0x00,禁用模块;

      3、向寄存器0xEF写入0x00,选择 Bank 0;

      4、向寄存器0x03写入0x01,进入休眠。

      通电后,模块默认也是进入挂起状态的,所以这时候是识别不了手势的,一定要先把它唤醒。唤醒比较简单,只需要正常的 IIC 信号就可以。正点原子的文档中讲述了一种唤醒方法:读取 0x00 寄存器,如果返回 0x20 表明成功唤醒。

      模块被唤醒后仍然处于被禁用(失能)状怘,故唤醒后还要向地址为 0x72 的寄存器写入 0x01 才算完成。至于 0x03 寄存器(挂起)不必理会,它会自动清零。

      有大伙伴说 PAJ7620 模块没反应,很可能就是在唤醒之后忘了使能(写 0x72 寄存器)模块。

      至此,可以总结出,模块的初始化过程应该是这样的?

      1、向从机 0x73 循环读取 0x00 寄存器,直到它返回 0x20,完成唤醒操作;

      2、向寄存器 0xEF 写入 0x01 切换到 Bank 1 带区;

      3、向寄存器 0x72 写入 0x01,使模块进入正常工作状态。

      No.4 设置手势检测的标志位(寄存器地址:0x41 和 0x42)

      这两个寄存器并不是用来读取被检测到的手势,而是设定模块支持哪几个手势的检测。每个二进制位表示一种手势,若为1则表示可以检测该手势;若为0则模块不检测该手势。每个寄存器存放一个字节,共八位。咱们前面扯过,PAJ7620模块支持九种手势的识别,所以一个字节八位,放不下呢。寄存器 0x41 存放前八种手势的标志,寄存器 0x42 存放剩下一种手势。故实际上 0x42 中只用到了第一个二进制位,其余七个用不上。

      No.5 手势检测结果(寄存器地址:0x43 和 0x44)

      这两个寄存器才是真正用来读取手势检测结果,同理,由于一个字节的八位不够用,所以用了两个寄存器。如果某一位的值为1则表明检测到此手势;反之为0就是没检测到。

      0x41、0x42 与 0x43、0x44 中的二进制位是一一对应的。文档中的默认定义如下:

      【.NET 与树莓派】九种手势识别模块(PAJ7620)

       二进制位从低到高:上、下、左、右、前、后、顺时针、逆时针。剩下一个手势在第二个字节的最低位,手势为挥手——就是 Say Goodbye 的动作,手掌放在模块前来回摇动。

      不过,这个定义只是相对的,毕竟我们在真实环境使用时。模块的安装方向可以旋转 X 角度。这时候,要多做测试,重新定义各个二进制位所对应的手势。按照正点原子的文档所述,正确的放置方位是这样的。

      【.NET 与树莓派】九种手势识别模块(PAJ7620)

       但老周是这样放的。

      【.NET 与树莓派】九种手势识别模块(PAJ7620)

       所以手势的方向就得重新定义了,总之,一个二进制位对应着一种手势,至于代表哪种手势,视你放置模块的方向来确定,可以多试试。

      ====================================================

      好,上面内容是对模块的核心功能介绍,有了上面的认知,再将其转化为程序代码就好办了。为了用起来更香,比较好的方案是进行类封装——老周写了个PAJ7620类,此类包含以下方法:

      * WakeUp:唤醒模块;

      * Suspend:挂起模块;

      * SetEnable:启用/禁用模块;

      * GetGesture:获取检测到的手势;

      * SelectBank0 和 SelectBank1:切换寄存器带区。

      PAJ7620 模块默认情况下会启用对九种手势的检测,因此老周的代码中未对寄存器 0x41 和 0x42 进行读写,有兴趣的大伙伴可以自己加上,反正操作都一样,就是对寄存器的读和写。

      首先,咱们把要用到的寄存器地址作为常量声明,后面引用起来方便。

              const byte SELECTE_BANK = 0xEF; //切换带区
              const byte BANK0 = 0x00;        //带区0
              const byte BANK1 = 0x01;        //带区1
              const byte ISENABLE = 0x72;     //使能/失能模块
              const byte GES_DETECT = 0x43;   //读取手势
              const byte GES_DETECT2 = 0x44;  //读取手势(第九种)
              const byte SUSPEND = 0x03;      //使模块挂起(休眠)

      下面是模块的默认从机地址——0x73。

              public const int DEFAULT_ADDR = 0x73;

      在类的构造函数中,咱们初始化 IIC 设备的连接。

              private I2cDevice _device=default;
      
              public Paj7620(int busid = 1, int address = DEFAULT_ADDR)
              {
                  I2cConnectionSettings settings=new(busid, address);
                  _device = I2cDevice.Create(settings);
              }

      从机地址使用默认地址,就是上面定义的常量 DEFAULT_ADDR。

      接下来就是各种方法的实现了。先看两个寄存器带区的切换,这两个方法我都写成私有方法,没有必要公开。

              private void SelectBank0()
              {
                  Span<byte> buff = stackalloc byte[2]{
                      SELECTE_BANK,
                      BANK0
                  };
                  _device.Write(buff);
              }

      由于要发送的只有两个字节,所以呢,这里可以用 stackalloc 直接在栈上分配内存,主要是速度快,当然你用传统的数组实例化方法也行。

      byte[] buff = new byte[]  {    };

      第一个字节是选择带区的寄存器地址 0xEF,第二个字节就是带区编号。另一个方法的原理一样。

              private void SelectBank1()
              {
                  Span<byte> buff = stackalloc byte[]
                  {
                      SELECTE_BANK, BANK1
                  };
                  _device.Write(buff);
              }

      好,下面是 SetEnable 方法的实现,可以启用或禁用模块。

              public void SetEnable(bool isenable)
              {
                  SelectBank1();  //先切换到 Bank 1
                  byte[] data =
                  {
                      ISENABLE,   //0x72
                      (byte)(isenable? 0x01 : 0x00)
                  };
                  _device.Write(data);
              }

      isenable 参数是个布尔值,如果是true,向寄存器0x72写入1,否则写入0。

      接着是 Suspend 方法,挂起模块。

              public void Suspend()
              {
                  // 先将其失能
                  SetEnable(false);
                  // 再挂起
                  SelectBank0();  //记得切换带区
                  byte[] data = {SUSPEND, 0x01};
                  _device.Write(data);
              }

      挂起前一定要将模块禁用,才能进入挂起状态。

      下面是唤醒模块的方法。

              public void WakeUp()
              {
                  int count = 0;
                  // 尝试唤醒
                  while(0==0)
                  {
                      _device.WriteByte(0x00);
                      // 等待700微秒即可
                      // 1毫秒一般够用
                      Sleep(1);
                      count++;
                      byte back = _device.ReadByte();
                      if(back == 0x20)
                      {
                          break;
                      }
                      if(count > 4)
                      {
                          // 多次尝试均无法唤醒模块
                          throw new Exception("模块无法唤醒");
                      }
                      Sleep(5);
                  }
                  // 使能
                  SetEnable(true);
              }

      WakeUp 方法其实分两个阶段:先是读寄存器0x00,在读寄存器时会向模块发信息,就等于发出唤醒信号(任何 IIC 通信都会包含 Start 时序),然后尝试五次,如果五次都唤不醒,估计是睡死了,就抛异常。

      第二阶段是启用(使能)模块,调用 SetEnable 方法。

      最后是核心方法,读出检测到的手势。

              public int GetGesture()
              {
                  SelectBank0();
                  // 前八个
                  _device.WriteByte(GES_DETECT);
                  byte p1 = _device.ReadByte();
                  // 第九个
                  _device.WriteByte(GES_DETECT2);
                  byte p2 = _device.ReadByte();
                  // 合起来
                  return (p2 << 8) | p1;
              }

      前文说过,手势共有九种,分配在两个字节上,第一个字节从寄存器 0x43 中读出,第二个从 0x44 中读出。为了用起来方便,老周把两个字节合起来,转换为 int 类型的值。从低位起,1 - 9位依次表示检测到的九种手势。

      下面是完整代码,各位可以抄来即食。

      using System;
      using System.Device.I2c;
      using static System.Threading.Thread;
      
      namespace Device
      {
          public class Paj7620 : IDisposable
          {
              #region 寄存器列表
              const byte SELECTE_BANK = 0xEF; //切换带区
              const byte BANK0 = 0x00;        //带区0
              const byte BANK1 = 0x01;        //带区1
              const byte ISENABLE = 0x72;     //使能/失能模块
              const byte GES_DETECT = 0x43;   //读取手势
              const byte GES_DETECT2 = 0x44;  //读取手势(第九种)
              const byte SUSPEND = 0x03;      //使模块挂起(休眠)
              #endregion
      
              /// <summary>
              /// 默认地址
              /// </summary>
              public const int DEFAULT_ADDR = 0x73;
      
              private I2cDevice _device=default;
      
              public Paj7620(int busid = 1, int address = DEFAULT_ADDR)
              {
                  I2cConnectionSettings settings=new(busid, address);
                  _device = I2cDevice.Create(settings);
              }
      
              public void Dispose()
              {
                  Suspend();
                  _device?.Dispose();
              }
      
              #region 公共方法
      
              /// <summary>
              /// 唤醒模块
              /// </summary>
              public void WakeUp()
              {
                  int count = 0;
                  // 尝试唤醒
                  while(0==0)
                  {
                      _device.WriteByte(0x00);
                      // 等待700微秒即可
                      // 1毫秒一般够用
                      Sleep(1);
                      count++;
                      byte back = _device.ReadByte();
                      if(back == 0x20)
                      {
                          break;
                      }
                      if(count > 4)
                      {
                          // 多次尝试均无法唤醒模块
                          throw new Exception("模块无法唤醒");
                      }
                      Sleep(5);
                  }
                  // 使能
                  SetEnable(true);
              }
      
              /// <summary>
              /// 挂起,使模块进入休眠状态
              /// </summary>
              public void Suspend()
              {
                  // 先将其失能
                  SetEnable(false);
                  // 再挂起
                  SelectBank0();  //记得切换带区
                  byte[] data = {SUSPEND, 0x01};
                  _device.Write(data);
              }
      
              /// <summary>
              /// 启用或禁用模块
              /// </summary>
              /// <param name="isenble">true:启用;false:禁用</param>
              public void SetEnable(bool isenable)
              {
                  SelectBank1();  //先切换到 Bank 1
                  byte[] data =
                  {
                      ISENABLE,   //0x72
                      (byte)(isenable? 0x01 : 0x00)
                  };
                  _device.Write(data);
              }
      
              /// <summary>
              /// 获取识别的手势
              /// </summary>
              /// <returns>包含九个标志位</returns>
              public int GetGesture()
              {
                  SelectBank0();
                  // 前八个
                  _device.WriteByte(GES_DETECT);
                  byte p1 = _device.ReadByte();
                  // 第九个
                  _device.WriteByte(GES_DETECT2);
                  byte p2 = _device.ReadByte();
                  // 合起来
                  return (p2 << 8) | p1;
              }
              #endregion
      
              #region 私有方法
      
              /// <summary>
              /// 切换到 Bank0
              /// </summary>
              private void SelectBank0()
              {
                  Span<byte> buff = stackalloc byte[2]{
                      SELECTE_BANK,
                      BANK0
                  };
                  _device.Write(buff);
              }
      
              /// <summary>
              /// 切换到 Bank1
              /// </summary>
              private void SelectBank1()
              {
                  Span<byte> buff = stackalloc byte[]
                  {
                      SELECTE_BANK, BANK1
                  };
                  _device.Write(buff);
              }
              #endregion
          }
      }

      好了,基本类型封装完毕,而后咱们就可以拿来耍了,这里老周没准备高级的应用,仅仅是写个测试程序。

      using System;
      using static System.Threading.Thread;
      using static System.Console;
      using Device;
      
      namespace myapp
      {
          class Program
          {
              static bool isRunning = false;
              static void Main(string[] args)
              {
                  using Paj7620 paj = new();
                  // 唤醒
                  paj.WakeUp();
                  WriteLine("设备已唤醒");
      
                  CancelKeyPress += (_, _) => isRunning = false;
      
                  Sleep(500);
                  isRunning = true;
      
                  while (isRunning)
                  {
                      int res = paj.GetGesture();
                      // 变成二进制显示
                      string str = Convert.ToString(res, 2);
                      str = str.PadLeft(9, '0');
                      str = string.Join(" | ", str.ToCharArray());
                      WriteLine(str);
      
                      WriteLine("按任意键继续");
                      ReadKey(true);
                  }
      
              }
          }
      }

      硬件接线:只接VCC、GND、SCL、SDA四个针脚即可,其他可以不管。

      VCC 接树莓派的 3.3V,5V也可以,模块上有做宽电压兼容;

      GND 接树莓派的GND;

      SCL 接树莓派的 GPIO 3;

      SDA 接树莓派的 GPIO 2。

      【.NET 与树莓派】九种手势识别模块(PAJ7620)

      运行这个程序后,你可以对着它做各种手势,然后随便按个键继续循环,屏幕会打印出各个二进制位的值。

      【.NET 与树莓派】九种手势识别模块(PAJ7620)

      前面老周说过,对九种手势的定义是相对的,取决于你把模块的安装方向和角度。不过,第九位(挥手)是不变的,因为不管你怎么安放,挥手的动作都是来回晃动几下,识别结果一样;再有,前、后两个手势也一样,把模块水平放置,发射光头朝上,然后你的手从上往下接近模块,就是向前的手势;相反,你的手从离模块较近的位置往上抬起就是向后。安装方向的不同一般只影响上、下、左、右四个方向上的手势。

      这个模块其实识别的准确率不是很高,容易受干扰,比如你在旁边开个台灯,或者拿手电筒斜着在模块上晃几下,或者在它旁边吃烤鸭,都会导致识别错误,或者干脆识别不了。

      至于说,使用这个模块能干吗呢?现在流行人工智……Zhang……哦不,Z能,所以,你可以用它来做个手势开灯,手势控制智能车转弯(估计会翻车),手势开门(不知道会不会夹到人),手势操作轮椅(有风险)。再深入一点的,上完厕所,对着马桶挥挥手,自动冲水,不带走一片云彩。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://www.cnblogs.com/tcjiaan/p/14687788.html,作者:东邪独孤,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:【autosklearn 小系列】pipeline模块实现

      下一篇:编写Windows服务疑问2:探索服务与安装器的关系

      相关文章

      2025-05-13 09:53:13

      计算机萌新的成长历程18——指针

      计算机要存储数据的话有以下几种途径,按访问速度由快到慢来排列分别是:寄存器>高速缓存>内存>硬盘。它们的存储空间大小是依次增大的,寄存器的存储空间大小最小,硬盘存储空间大小最大。

      2025-05-13 09:53:13
      内存 , 变量 , 地址 , 寄存器 , 指针
      2025-03-26 09:31:37

      STM32应用实例十一:基于SPI和AD7192的数据采集

      AD7192是一款适合高精密测量应用的低噪声完整模拟前端,内置一个低噪声、 24 位Σ-Δ型模数转换器 (ADC)。片内低噪声增益级意味着可直接输入小信号。

      2025-03-26 09:31:37
      寄存器 , 转换
      2025-03-10 09:53:00

      deeply c-函数栈帧(函数栈帧的过程)

      deeply c-函数栈帧(函数栈帧的过程)

      2025-03-10 09:53:00
      eax , 代码 , 寄存器 , 汇编
      2025-02-19 09:02:32

      【协程】协程与线程、线程与进程的区别

      每个进程都有自己的独立内存空间,进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。

      2025-02-19 09:02:32
      上下文 , 切换 , 协程 , 寄存器 , 线程 , 资源 , 进程
      2025-02-12 09:28:28

      初始JavaEE篇——多线程(3):可重入锁、死锁、内存可见性、volatile关键字

      针对 count++ 操作不是原子性,我们将其进行了加锁的操作,让其可以在执行时,不受操作系统调度的影响(即使调度了别的线程,也不能够进行count++ 操作)。

      2025-02-12 09:28:28
      CPU , 关键字 , 内存 , 加锁 , 寄存器 , 死锁 , 线程
      2024-12-23 09:17:02

      PL真有意思(六):子程序和控制抽象

      PL真有意思(六):子程序和控制抽象

      2024-12-23 09:17:02
      协程 , 参数 , 寄存器 , 语言 , 调用
      2024-12-19 08:47:09

      vim常用指令类表

      vim常用指令类表

      2024-12-19 08:47:09
      光标 , 寄存器 , 文本 , 标签
      2024-10-29 09:05:04

      掌握计算机底层:汇编语言及其核心概念全解析

      汇编语言是编程世界中最基础且最接近机器语言的一种编程语言。它提供了对计算机硬件深入了解的途径,允许程序员直接与处理器交流,控制每一个底层细节。学习汇编语言,不仅能够增强对程序运行原理的理解,还能提升解决复杂问题的能力。这些技能对于成为一名高级程序员至关重要。

      2024-10-29 09:05:04
      寄存器 , 汇编语言
      2024-06-26 06:18:07

      【.NET深呼吸】(WPF)跨窗口完成绑定

      在99.999975%的情形下,可视化元素之间的相互绑定都会在同一个容器中完成,如同一个窗口,同一个UserControl等。但在极少数的情况下,为了从最大限度减少代码赋值的前提下考虑,是可以使用跨窗口绑定。

      2024-06-26 06:18:07
      NET , WPF
      2024-06-26 06:17:16

      【.NET 与树莓派】TM1638 模块的按键扫描

      TM1638 的数码管驱动,这个模块除了驱动 LED 数码管,还有一个功能:按键扫描。

      2024-06-26 06:17:16
      NET
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5243306

      查看更多

      最新文章

      vim常用指令类表

      2024-12-19 08:47:09

      【.NET深呼吸】(WPF)跨窗口完成绑定

      2024-06-26 06:18:07

      【.NET 与树莓派】TM1638 模块的按键扫描

      2024-06-26 06:17:16

      【.NET 与树莓派】WS28XX 灯带的颜色渐变动画

      2024-06-26 06:17:16

      【.NET 与树莓派】LED 数码管驱动模块——TM1638

      2024-06-17 09:52:23

      安卓逆向 -- IDA动态调试

      2024-04-22 07:17:11

      查看更多

      热门文章

      Win32汇编:汇编基本知识总结

      2023-06-19 06:57:29

      Win32汇编:过程与宏调用

      2023-06-21 06:37:08

      ARM64基础12:ARM64的异常模式及异常向量表

      2024-03-18 09:20:50

      【.NET深呼吸】Zip文件操作(2):动态生成Zip文档

      2024-03-28 08:17:27

      安卓逆向 -- IDA动态调试

      2024-04-22 07:17:11

      .NET NPOI导出时间、公式等格式化

      2024-04-16 08:52:39

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      【.NET 与树莓派】WS28XX 灯带的颜色渐变动画

      【.NET深呼吸】(WPF)跨窗口完成绑定

      .NET NPOI导出时间、公式等格式化

      ARM64基础12:ARM64的异常模式及异常向量表

      【.NET 与树莓派】TM1638 模块的按键扫描

      vim常用指令类表

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号