双页缓冲(Ping-Pong Buffer) 2026-07-17
前言在嵌入式系统中,经常会遇到这样的问题:一个模块不断产生数据,例如ADC采样、摄像头采图、音频录制、通信接收等;另一个模块需要处理这些数据,例如滤波、压缩、存储、发送。如果数据产生速度和处理速度不完全一致,就需要一个缓冲机制,否则很容易出现数据丢失或者处理等待的问题。最常见的一种方法就是双页缓冲(Ping-PongBuffer,也叫乒乓缓冲)。一、为什么需要缓冲?假设有一个ADC,每秒采集10000个数据。CPU每采集一点就处理一点:采集数据↓CPU处理↓继续采集↓CPU处理看起来没问题,但是实际情况中:CPU处理某一次数据可能需要较长时间;中断可能打断当前任务;存储设备可能暂时忙;通信发送
硬件常用通信协议简介 2026-07-17
前言在现代电子设备中,通信协议是连接不同芯片和设备的重要基础。单片机(MCU)通常不会单独工作,而是需要与各种外围器件进行数据交换,例如传感器、显示屏、存储芯片、电机驱动器、无线模块以及其他控制节点。为了让不同设备能够按照统一规则交换数据,人们设计了各种通信协议。不同通信协议有不同的设计目标。有些协议追求简单低成本,适合芯片之间短距离连接;有些协议强调高速传输,适用于显示屏和存储设备;还有一些协议专门为工业环境设计,需要长距离、高可靠、多节点通信。常见的通信协议主要包括UART、I2C、SPI、RS-232、RS-485、CAN、USB、Ethernet等。UART:最基础的串行通信方式UAR
MCU GPIO 输入输出模式详解 2026-07-17
前言在使用单片机进行硬件设计时,GPIO(GeneralPurposeInputOutput,通用输入输出)是最基础也是最常用的外设接口。无论是控制LED、电机、继电器,还是读取按键、传感器信号,甚至实现I2C、SPI、UART等通信,都离不开GPIO的不同工作模式。很多初学者接触MCU时,只知道GPIO可以设置为“输入”或者“输出”,但实际上GPIO内部结构远比简单的开关复杂。不同的输入输出模式决定了引脚是否能够主动输出电平、是否可以连接多个设备、是否需要外部电阻以及适合什么应用场景。常见的GPIO模式包括:推挽输出(Push-Pull)开漏输出(OpenDrain/OpenCollecto
RS-485 通信技术全面介绍 2026-07-16
一、什么是RS-485?RS-485是一种由美国电子工业协会(EIA)制定的差分串行通信标准,全称为TIA/EIA-485。它主要用于解决传统串口通信距离短、抗干扰能力弱、无法连接多个设备等问题。在工业自动化、智能仪表、楼宇控制、电机控制等领域,RS-485是目前应用非常广泛的一种通信方式。很多工业设备,例如PLC、变频器、温控器、智能电表、传感器和远程IO模块,都采用RS-485作为设备之间的通信接口。需要注意的是,RS-485本身只是一个物理层标准,它规定的是信号如何传输,而不是规定数据内容如何组织。例如:RS-485规定:电压、电流、线路结构、通信距离等。ModbusRTU规定:数据格式
谷歌浏览器强制页面黑暗模式 2026-07-15
晚上打开浏览器虽然可以设置主题为深色,但是大部分网址还是白色背景,可以用以下方式进行设置1.打开网址:chrome://flags/#enable-force-dark2.选择Enabled,然后重启浏览器即可
CH32V003F4P6使用回顾 2026-07-11
背景想要做智能抽屉想找一款价格最低的同时能满足控制电机+串口控制+读取ADC数据的一款IC,AI给的结果就是这一款,他也出色的完成了他的任务,外围器件少焊接也很方便,使用电路图立创开源平台有众多案例,烧录器使用WCH-LinkE,连接PCB的三根线即可(3.3V/5VGNDSWDIO),IDE使用MounRiverStudioⅡ,代码AI即可完成,这里注意的一点是我这个芯片需要将,闪存->下载配置->调试器模式,设置为RISC-V,使用默认的ARM连芯片都识别不了
Vue & Python将pywebview执行的操作改为同步 2025-02-26
constbatchOperate=async(type)=>{for(letrowofmultipleSelection.value){varpath=awaitpywebview.api.uploadOrder(row['create_date']+"/"+row['file']);}}
Element 根据JSON数据自动合并单元格 2025-02-26
使用一级JSON,而不是多级嵌套JSON-数据需要排序letstr=""conststroageValue:Record<string,string|number>=reactive({})constgoodsSpanMethod=({row,column,rowIndex,columnIndex}:SpanMethodProps)=>{if(columnIndex==0||columnIndex==1){letspanCount=1//从当前行往下找for(leti=rowIndex+1;i<productData.value.length;i++
Mysql将查询记录内容拼接为JSON 2025-02-26
SELECTo.field1,o.field,c.fieldfield,o.field,DATE(o.field)field,`field`,`field`,`field`,IF(cp.fieldISNULL,'[]',JSON_ARRAYAGG(JSON_OBJECT('product_id',cp.field,'product_name',cp.field)))ASfieldFROMtableoleftJOINtablecONo.field=c.fieldleftJOINtablecpONo.field=cp.fieldWHERE(field
后端技术
PHPObject转Array 2025-02-26
publicfunctionobject_to_array($obj){$_arr=is_object($obj)?get_object_vars($obj):$obj;$arr=null;foreach($_arras$key=>$val){$val=(is_array($val))||is_object($val)?$this->object_to_array($val):$val;$arr[$key]=$val;}return$arr;}$task_data=$this->object_to_array(json_decode(htmlspecialchars_deco
热门文章
专栏