(精华)Ring3与Ring0通信方法若干

PyTorch DDP分布式训练实战:从Ring AllReduce到代码调试全解析 本文深入解析PyTorch DDP分布式训练的核心原理与实战技巧,从Ring AllReduce通信机制到代码调试全流程。通过对比DP与DDP的性能差异,展示DDP在多卡训练中的显著优势,并提供单机多卡与多机多卡的详细配置指南,帮助开发者高效实现大规模模型训练。 阅读详情

本人在[(原创)应用程序与驱动通信的若干方式]文章中阐述了,上下层通信的技术实现部分,但没有结合应用,下面的文章就具体应用给大家展示了使用方法,希望能够大家一些启发。 
             Ring3与Ring0同步是很有用的手段,在此做一个简要的整理,希望对开发这方面程序的朋友有帮助,好了,开始吧。
         1 同步的策略
         初写驱动的朋友都知道,通过DeviceIoControl这个API函数, 可以将Ring3的数据及控制请求发送给Ring0.但这是单向的,由Ring3主动发起,Ring0被动接受。可以说这是单向轮询的。
                                          询问(CTL_CODE)
         Ring3     ---------------------------------------------------------------- >     Ring0  
                                          回答(通过OUT参数)
         Ring3     <----------------------------------------------------------------    Ring0  
         这种方式用于主动获取Ring0数据,又不要求效率,和具有实时性的开发情况。
         但做监控类软件却与此相反,是Ring0先监控到事件,具有主动权,发起询问通知Ring3。
                                       监控到事件(通知)
         Ring0(监控)----------------------------------------------------------------> Ring3  
         在实时性要求不高的情况下可以采用Ring3定时询问Ring0,当然Ring0保存了事件的状态。
         这里介绍的就是高实时性,大数据传输的同步解决办法。
         原理:通过Ring3创建事件,并将该事件传递给Ring0,同时Ring3创建监控线程,等待Ring0发起事件,此为应用层驱动层共享事件。同时Ring0在内核分配非分页内存,通过DeviceIoControl 传递给Ring3,此为应用层驱动层共享内存。因在DeviceIoControl 中传送Buffer,涉及到内核数据拷贝,大数据量下使用效率很低,故用共享内存的方法。
         2     具体实现
Ring3 CODE     :
HANDLE m_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);     // 创建事件
// 发事件给ring 0
if (0 == DeviceIoControl(hFile, \ 
    SET_EVENT, \                                     
    &m_hEvent, \
    sizeof(HANDLE), \
    NULL, \
    0,\
    &uRetBytes,
    NULL)) 
{
    CloseHandle(hFile);
    CloseHandle(m_hEvent); 
    return ;
} 
// 获得ring 0 的共享内存
unsigned int add = 0;
if (0 == DeviceIoControl(hFile, \                
GET_SHARE_ADD, \
NULL, \
0, \
&add, \
sizeof (unsigned int),\
&uRetBytes,
NULL)) 
{
    CloseHandle(hFile);
    CloseHandle(m_hEvent); 
    return ;
} 
m_pShareMem =(PVOID)add;                         //映射的共享内存
当Ring0有事件产生时,Ring3的线程就可处理m_pShareMen了。
UINT    WorkThread(PVOID param)
{              ...............
            while(!bExit)
                {
                            WaitForSingleObject(g_hEvent,INFINITE); 
                            ......................
                            // 可以处理分析m_pShareMen 了
                }
}
Ring0 CODE : 
PVOID g_pSysAdd       = NULL; 
PMDL     g_pMdl                 = NULL;    // 与ring 3 的共享内存描述
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
    {
                                 ......
         g_pSysAdd = ExAllocatePool(NonPagedPool, SHARE_MLEN + IPHEDLEN);
         g_pMdl = IoAllocateMdl(g_pSysAdd, SHARE_MLEN + IPHEDLEN, FALSE, FALSE, NULL);
         MmBuildMdlForNonPagedPool(g_pMdl);                   
                                 ......
    } 
// I/O控制派遣例程
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);

// 取得I/O控制代码
ULONG uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
   switch(uIoControlCode)
   {
      case SET_EVENT:     // 处理Ring3的事件

         if(g_pInBuffer == NULL||g_nInBuffSize < sizeof(HANDLE))
         {
                      status = STATUS_INVALID_BUFFER_SIZE;
                      break;
         }
         hEvent = *(HANDLE *)g_pInBuffer;

         status = ObReferenceObjectByHandle(hEvent,
         SYNCHRONIZE,
         *ExEventObjectType,
         KernelMode,
         (PVOID *)&g_pEvent,
         &objHandleInfo
         ); 

          if(!NT_SUCCESS(status))
          {
                   g_pEvent = NULL;
          }
          DbgPrint("g_pEvent: %x\n",g_pEvent);    // 得到了ring 3 事件句柄
          break; 
      
      case GET_SHARE_ADD:                         //     传给ring 3 内存地址 
   
         UserAddr = MmMapLockedPages(g_pMdl, UserMode);
         *((PVOID *)(pIrp->AssociatedIrp.SystemBuffer)) = UserAddr;
         status = STATUS_SUCCESS; 
             break;  
    }
..............
}
RtlCopyMemory(g_pSysAdd,pSource,dwLen)             //     将写数据到共享内存,
KeSetEvent((PKEVENT)g_pEvent,0,false);                 //    此刻Ring3就可以接受数据了。
最后一步记得释放内存。
void DriverUnload(PDRIVER_OBJECT pDriverObj)
{ 
// 清除共享内存

IoFreeMdl(g_pMdl);
ExFreePool(g_pSysAdd);

// 删除设备对象
IoDeleteDevice(pDriverObj->DeviceObject);
}
以上就是整个处理过程

1. 驱动中IoCreateNotificationEvent,KeClearEvent 
应用中OpenEvent(SYNCHRONIZE, FALSE, EVENT_NAME) 
这样,只能在应用中WaitForSingleObject,而不能SetEvent,ResetEvent 
驱动中可以KeSetEvent,(而且必须紧接着KeClearEvent,因为在应用中不能修改核心态创建的对象的状态,只能在这个时候清除状态了),即只能由驱动通知应用,在某些应用只需要等待通知的场合足够了,如应用等待数据准备好的通知,这时可以在中断处理函数中设置事件有信号 
注意,OpenEvent第一个参数不能为EVENT_ALL_ACCESS,因为应用没有这么大权限操作在系统上下文创建的事件

2.在驱动中创建事件,并把时间句柄传给应用,应用不必OpenEvent。应用程序可以随意set,reset事件,这样可以和驱动中的系统线程进行同步 
这种方法的前提条件是,event是在应用的进程上下文(在系统上下文创建的话就不可以)创建,并传给应用的,比如可以在某个IOCtl分支中创建事件并传给应用。 
解释:在使用EVENT的PROCESS context中创的HANDLE就在这个进程的句柄表里,经检验没有权限限制,可以由应用直接使用;而在system context中创建的HANDLE当然就在SYSTEM进程里啦,若单单传句柄值给应用,而句柄表里根本就没有对应的句柄,当然不成功了。 

代码如下 
驱动中: 
void ppppp(PVOID event) 
{ 
KeWaitForSingleObject((PKEVENT)event,Executive,UserMode,0,0); 
//......验证处 
} 
...... 
WCHAR wEventNameBuf[]=L"\\BaseNamedObjects\\SharedEvent";  
UNICODE_STRING uEventName;  
PKEVENT pEvent;  
HANDLE hEvent,hThread;  
...... 
case IOCTL_******: 
RtlInitUnicodeString(&uEventName,wEventNameBuf);  
pEvent = IoCreateNotificationEvent(&uEventName,&hEvent);  
KeResetEvent(pEvent); 
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&hEvent,4); 
PsCreateSystemThread(&hThread,THREAD_ALL_ACCESS,0,0,0,ppppp,pEvent); 


应用中: 
if(!DeviceIoControl(hDevice,IOCTL_******,0,0,&Handle,4,&Bytes,0)) 
MessageBox("DeviceIo Error!"); 
esle{ 
wsprintf(str,"%x,%x,%x",hDevice,Bytes,Handle); 
MessageBox(str); 
if(!SetEvent((HANDLE)Handle)) 
...... 
} 
会看到,点击MessageBox OK后ppppp的确继续执行了。 

3.在应用中创建事件,然后通过ioctl传给驱动,驱动中ObReferenceObjectByHandle来引用该事件对象。 
这样应用和驱动中都可以检查和修改事件状态。 
应用程序: 
HANDLE m_hCommEvent = CreateEvent(NULL, 
                                  false, 
                                  false, 
                                  NULL); 
// download event object to device driver,  
// m_hCommDevice is the device object 

DeviceIoControl(m_hCommDevice,  
                IO_REFERENCE_EVENT, 
                (LPVOID) m_hCommEvent, 
                0,  
                NULL,  
                0,  
                dwReturn,  
                NULL); 
在需要的地方等待 
while(true) 
{ 
WaitForSingleObject(m_hCommEvent, INFINITE); 
// After this function, the event is set to  
// non signaled. Get information and deal with it. 
} 

驱动程序: 
case IO_REFERENCE_EVENT: 
hEvent = (HANDLE) irpStack-> 
       Parameters.DeviceIoControl.Type3InputBuffer; 

status = ObReferenceObjectByHandle(hEvent, 
                                     GENERIC_ALL, 
                                     NULL, 
                                     KernelMode, 
                                     &gpEventObject, 
                                     &objHandleInfo); 
the gpEventObject is a PRKEVENT object, so we can use KeEventXXX and KeWaitForXXX to operate it.  


当事件发生时,置信号 


KeSetEvent(gpEventObject, 0, FALSE); 


当不再需要事件对象时: 

case IO_DEREFERENCE_EVENT: 
if(gpEventObject) 
   ObDereferenceObject(gpEventObject);

深入解析Linux USB 3.0设备控制器驱动框架与开发实践 USB(通用串行总线)是现代计算机连接外设的核心技术,其协议栈实现了从物理连接到高层应用的无缝交互。在Linux内核中,USB子系统通过分层架构管理设备通信,其中设备控制器驱动负责底层硬件操作。USB 3.0引入双总线架构和xHCI控制器,显著提升传输速率,其驱动框架围绕UDC、Gadget Function和Composite Driver三层模型构建,通过端点与请求机制实现异步数据传输。理解这套框架对于开发嵌入式USB设备、虚拟外设及调试驱动问题至关重要,尤其在涉及高速数据传输和复杂状态管理的场景下。本 阅读详情

相关推荐

STM32串口DMA通信实战:HAL库实现DMA发送与空闲中断接收不定长数据

在嵌入式系统开发中,串口通信是连接微控制器与外部设备的基础接口。其原理是通过异步串行传输,将数据按位发送和接收。传统轮询或中断方式在高速数据流下会占用大量CPU资源,成为性能瓶颈。DMA(直接存储器访问)技术的核心价值在于解放CPU,它作为硬件“搬运工”,能在不中断CPU的情况下在外设与内存间直接传输数据,极大提升系统吞吐量和实时性。这一技术广泛应用于数据采集、工业控制、物联网网关等需要高效、稳定数据交换的场景。本文聚焦于STM32平台,结合HAL库与CubeMX工具,深入讲解如何利用DMA发送数据,并巧妙

weixin_33933118的博客 334

FUTo: Bypassing Blacklight and IceSword

By: petersilberman  This article was released in the Uninformed Journal Vol 3. It is important to remember that this article displays Proof of Concept (POC) ideas and code. FUTo may result in spec

1万+

嵌入式通信协议实战:UART、SPI、I2C、CAN选型与避坑指南

在嵌入式系统开发中,通信协议是实现设备间数据交换的核心技术。其基本原理是通过定义统一的电气特性、时序和帧格式,确保数据在发送方和接收方之间可靠传输。从技术价值看,掌握通信协议是嵌入式工程师的基本功,它直接决定了系统的稳定性、实时性和扩展性。在实际应用中,根据速率、距离、节点数和抗干扰需求,工程师需要选择合适的协议,例如,UART常用于调试和模组对接,SPI适用于高速显示和存储,I2C适合连接多个低速传感器,而CAN则在汽车和工业控制等要求高可靠性的分布式系统中扮演关键角色。本文基于【项目实战】和【调试技巧】

weixin_34121282的博客 364

iOS编译报错: "_OBJC_CLASS_$_QQApiInterface", referenced from: XXXXXX.o

"_OBJC_CLASS_$_QQApiInterface", referenced from: XXXXXX.o

跳舞的芒果 6146

MC9RS08LA8串行通信实战:SCI与SPI寄存器配置与调试指南

串行通信是嵌入式系统中实现微控制器与外部设备数据交换的基础技术,其核心原理在于通过特定的时序和协议,在有限的引脚上实现可靠的数据传输。从技术价值看,异步串行通信(如UART/SCI)以其简单、可靠和远距离传输能力,成为调试接口和低速设备连接的基石;而同步串行通信(如SPI)则凭借其高速、全双工的特性,广泛应用于显示、存储和高速数据采集等场景。本文聚焦于飞思卡尔(恩智浦)经典8位MCU MC9RS08LA8,深入解析其内置的SCI(串行通信接口)和SPI(串行外设接口)模块。针对实际开发中易错的唤醒机制、中断

justJavaC的专栏 401

瑞萨电容触摸开发工具QE V4.3.0实战:从自动调谐到高级监控

电容式触摸感应技术通过检测人体手指引起的微小电容变化,实现非接触式人机交互。其核心原理基于电荷转移或电容耦合,将物理接触转化为电信号。这项技术的价值在于提供了美观、耐用且灵活的交互方式,广泛应用于智能家电、工业控制面板和消费电子等领域。在嵌入式开发中,电容触摸的稳定性和灵敏度高度依赖于对抗环境噪声和寄生电容的精细调谐。瑞萨电子的QE for Capacitive Touch工具正是为此而生,它将复杂的寄存器配置和参数优化过程可视化与自动化。作为一款集成在e2 studio环境中的开发利器,其**自动调谐引擎

weixin_30718391的博客 753

string和stringBuilder区别

String 对象 是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder 类。 StringBulider类

kiven 9701

工业机器人PROFINET通信故障诊断:Wireshark实战指南

工业以太网通信是自动化系统的神经中枢,其稳定性和实时性直接决定了产线的运行效率。PROFINET作为基于标准以太网的现场总线协议,通过实时(RT)和等时同步实时(IRT)机制,实现了控制器、机器人、IO设备间毫秒级的数据交换。理解其协议栈,特别是DCP发现配置、周期性RT帧传输及PTCP时钟同步原理,是进行高效网络调试与性能优化的基础。这项技术能精准定位通信中断、数据抖动等顽疾,将故障排查从经验猜测提升至数据驱动的精准分析,对于保障机器人、PLC等关键设备的稳定协同至关重要。本文聚焦于利用Wireshark

weixin_33719619的博客 332

springBoot连OB数据库

###oceanbase 测试。

cbd451304045的专栏 2682

深入解析NXP LPC32x0系列ARM9微控制器:架构、外设与实战指南

在嵌入式系统设计中,微控制器(MCU)的选型与深度理解是项目成功的基石。ARM架构因其生态丰富和性能均衡,成为众多工业控制、消费电子和医疗设备的核心。其工作原理基于精简指令集(RISC)和高效的流水线,通过片上系统(SoC)集成CPU、存储器和外设,实现特定场景的优化。这种高集成度的技术价值在于,它能以较低功耗和成本,提供稳定的处理能力、丰富连接性和可靠的数据管理,尤其适用于需要复杂人机交互、实时网络通信和大容量存储的应用。本文聚焦于NXP经典的LPC32x0系列,该系列基于ARM926EJ-S内核,以其独

weixin_30566111的博客 390

PowerQUICC MPC885通信处理器:双核架构与硬件加速解析

通信处理器是嵌入式网络设备的核心,它通过专用硬件模块高效处理网络数据流,其核心原理在于将控制平面与数据平面分离。这种架构通过独立的通信处理器模块(CPM)和硬件DMA通道,实现了网络协议处理与数据搬移的硬件卸载,从而显著提升系统吞吐量和实时性。其技术价值在于能以单芯片方案替代传统多芯片组合,降低系统复杂度与成本。在应用场景上,这类处理器广泛用于路由器、VPN网关、工业控制网关等设备,处理以太网、HDLC等协议。本文聚焦的PowerQUICC MPC885系列,便是这一设计哲学的经典体现,它集成了双Fast

weixin_30383279的博客 382

原生PHP缓存Html 待PHP执行完成后获取Html内容 PHP内置缓存ob_xxx函数实现页面静态化 获取PHP文件输出的内容

前言 目前项目访问量较高,数据量比较大,更新不频繁 突然想到使用Redis+HTML直接返回HTML静态页,如果使用Redis存储Html字符串会出现Redis中bigKey的问题。 所以使用Redis String过期key-value + Html文件策略,使一个HTML文件对应的Key存活5分钟,五分钟后出现访问重新生成新的Html静态页。 遇到问题,执行完成的PHP代码无法获取,截获路由使用file_get_content(url)重新请求路由会出现连续请求两次的情况,如果大量的key过期会

FuJinlong94的博客 6306

思科模拟器Cisco Packet Tracer交换机的管理配置

一、交换机的管理方式:带内管理和带外管理 通过交换机的 Console 端口管理交换机属于带外管理;这种管理方式不占用交换机的网络端口,第一次配置交换机必须利用 Console 端口进行配置。 通过 Telnet、拨号等方式属于带内管理。 二、控制台配置思科交换机 1.新建拓扑图 新建拓扑,选择console线连接交换机和PC,一端接交换机的console口,一端接PC的RS 232 口(...

qq_37992321的博客 2万+

TI AM64x/AM243x RINGACC与SEC_PROXY实战:多核通信与DMA数据传输核心模块解析

在嵌入式系统与SoC设计中,硬件加速的数据队列和代理机制是提升多核通信效率与DMA传输性能的关键技术。其核心原理在于通过专用硬件模块管理数据流,将队列维护、索引计算等开销从软件卸载,从而显著降低延迟、提升吞吐量。这种硬件辅助的消息传递机制,对于构建高效、确定性的实时系统具有重要价值,广泛应用于工业通信、边缘计算和汽车电子等对数据流可靠性要求极高的场景。本文聚焦于**环形加速器(RINGACC)**和**安全代理(SEC_PROXY)**这两个TI DMSS子系统的核心硬件模块,深入剖析其作为硬件加速队列管理

weixin_33845881的博客 369

高光谱知识(1)-高光谱成像技术的理解

系列文章目录 高光谱技术可以获得待观测目标或场景的连续单色光谱图像,并通过空间维(x, y)数据和光谱维(λ)数据共同组成三维观测数据立方体,从而为研究人员提供探测目标或场景中的每一个点的空间和光谱特征细节。这种兼具相机的高分辨成像能力和光谱仪的高光谱分辨能力使得高光谱被广泛应用于测绘遥感、目标识别、环境监测与评估、临床影像诊断、过程监控等任务中,并在地理、空间、海洋、气候、大气、农业、植被、生态、医药、安防、制造与色度等多个领域中发挥巨大作用。 文章目录系列文章目录前言一、按获取数据的过程划分二、按照光

Echo_Code的博客 1万+

HyperMesh实战:5种复杂载荷场景下的field映射技巧(附TCL脚本)

本文详细介绍了HyperMesh在5种复杂载荷场景下的field映射技巧,包括轴承载荷的圆柱坐标系映射、粉末压力中的切向力处理、实验数据到有限元模型的场映射、多工况载荷的组合映射以及局部细化网格的边界条件传递。通过实战案例和TCL脚本,帮助工程师高效解决有限元分析中的载荷映射难题,提升工作效率。

fanta的博客 294

多核异构处理器AM64x/AM243x架构解析与工业通信实战

多核异构处理器架构是现代嵌入式系统设计的核心技术,旨在解决高性能计算与高实时性控制之间的矛盾。其原理是通过集成不同特长的处理器核心,如应用处理器、实时处理器和可编程实时单元,实现任务的专业化分工与性能隔离。这种架构的技术价值在于能够同时满足复杂应用处理和微秒级实时响应的需求,在工业自动化、机器人控制和新能源等领域具有广泛应用。以德州仪器AM64x/AM243x为例,其集成了Arm Cortex-A53、Cortex-R5F和独有的可编程实时单元,特别适合实现工业实时以太网协议。通过合理的核心任务分配与高效的

677

工业界实战:小红书推荐系统中的AB测试策略解析——分层、Holdout与反转实验

本文深入解析了小红书推荐系统在工业界实践中采用的AB测试核心策略。重点阐述了分层实验如何解决多实验并行与干扰问题,Holdout机制如何作为评估黄金标准提供稳定基准,以及反转实验如何作为全量上线后的终极安全网进行风险控制。这些策略共同构成了科学、严谨的线上评估体系,是保障推荐系统迭代效果与决策质量的关键。

transformer2023的博客 475

【2025全球C++技术大会精华】:低时延消息队列设计的7大核心原则

掌握低时延系统设计核心方法,解析2025全球C++及系统软件技术大会:低时延C++消息队列实现的7大原则。涵盖高频交易、实时通信等场景,聚焦无锁队列、内存池、缓存亲和等关键技术,显著降低消息延迟。性能提升实践方案值得收藏。

ProceNest的博客 767

SNAP计算哨兵二号的叶面积指数(LAI)

对于哨兵二号数据以及LANDSAT8数据,SNAP提供已经集成好的模块计算LAI。在Optical->Thematic Land Processing->Biopyhsical Processor目录下面。 对于经过Sen2Cor处理好的数据,需经过重采样才可进行计算。重采样工具在Raster->Geometric->Resampling。 如果选择Biopyhsical Processor S2_10m进行计算,需要将所有的波段都重采样为10米(哨兵二号的第二波段为10米,可据此波

gxwwww的博客 9416

C#报表,使用微软rdlc模板,生成Excel, PDF, Word, Image文件,使用自定义对象做数据集不连接数据库

我项目是用vs2017 建的,.NET farmwork 4.7.2 这种报表可以用于任何模式的应用,web,桌面,因为这只是生成一个文件或者文件流 步骤比较详细啰嗦,其中有讲到rdlc怎么新建设计,如果已经会设计rdlc了的可以直接跳到底部看代码的执行结果, 底部还有源码下载链接,百度盘 首先控制台安装报表包 新建rdlc 报表 建立rdlc里要用的数据模型 模型建完,或者修改都要重新...

qq_35955916的博客 5202

STM32 USART串口通信:从基础配置到DMA与协议解析实战

串口通信(UART/USART)是嵌入式系统中最基础且核心的通信方式,它基于异步串行通信原理,通过约定的波特率、数据位和停止位实现设备间的数据交换。其技术价值在于提供了简单、可靠且低成本的调试与通信手段,是连接微控制器与传感器、上位机及其他外设的通用桥梁。在嵌入式开发与物联网应用中,串口常用于固件调试、数据传输和模块控制等场景。本文聚焦STM32的USART外设,深入讲解其配置要点、中断与DMA高效驱动模式,并探讨如何结合环形缓冲区和状态机解析自定义协议帧,以解决实际工程中的乱码、数据丢失等问题,实现稳定可

weixin_34296641的博客 332

YOLOv12涨点改进| Kimi团队 2026 |独家创新首发、注意力改进篇|爆火AttnRes残差自注意力模块,含多种创新改进,借助残差思想,缓解细节信息在传播过程中被稀释,促进YOLOv12涨点

🔥本文提出AttnRes残差自注意力模块改进YOLOv12模型,通过深度维度的注意力加权机制替代传统固定残差累加方式。该模块能自适应选择更有价值的历史层特征进行聚合,缓解浅层信息在深层传播中被稀释的问题,提升小目标和复杂场景的检测能力。文章详细介绍了模块结构、原理及优势,并提供了完整的代码实现和配置方法,包括三种改进方案:yolov12n_AttnRes.yaml、yolov12n_AttnRes-2.yaml和yolov12n_A2C2f_AttnRes2D.yaml。

Ai缝合怪、助力小伙伴高效发论文 183

来电显示软件测试自学,用MSComm控件实现来电显示

来电显示的实现MODEM的AT命令CID和VCID是设置是不是来电显示的,如果般来说来电显示的信息为:DATE = MMDD "来电日期 MMDDTIME = HHMM "来电时间 HHMMNMBR = ######## "来电号码程序实现如下,设置MSComm1的相关设置,并建两个Label为Label1和Label2Function OpenCID(OpenCLose As Boolean) ...

weixin_29865333的博客 335

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

海康Visionmaster-通讯管理:ModBus 通信发送非整型 数据的方法

视觉人机器视觉的博客 1741

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 阴沟里翻船之KeSetEvent
下一篇: 应用程序与驱动通信的若干方式
vbsourcecode
博客等级 码龄17年 19粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值