WinCE下VB.NET程序的开发

简介: 最近朋友的一个项目有这样的需求,让我帮忙探个路。经过两天的努力,总算是有点收获。       VB.NET是一种面向对象的计算机编程语言,可以看做是Visual Basic的升级版。它也是Visual Studio.NET的核心语言之一。

      最近朋友的一个项目有这样的需求,让我帮忙探个路。经过两天的努力,总算是有点收获。

      VB.NET是一种面向对象的计算机编程语言,可以看做是Visual Basic的升级版。它也是Visual Studio.NET的核心语言之一。开发人员可以利用它快速而高效的创建出基于.NET Framework的应用程序。.NET Framework家族也包括了面向移动设备领域的两个成员,它们分别是.NET Compact Framework和.NET Micro Framework。其中.NET CF可以认为是WinCE平台上.NET Framework的精简版,而.NET MF则面向更小型的设备。

     要让WinCE支持VB.NET,需要在定制系统时添加.NET Compact Framework组件。这很简单,在PB5.0或6.0中将相应的组件选入到Catalog中,重新编译系统即可。主要问题是如何编写一个应用程序,并且能访问底层硬件的数据。

     翻箱倒柜,找出很久以前买的一本VB.NET的书,快速地翻看了几个重要的章节,对VB.NET有了大概的了解,并基本确定了实现方式——使用动态链接库(DLL)。

     实现过程中,最大的麻烦就是语言不熟悉。传说中的“拖拉拽”快速编程方式在我这变成了拖拉机。好在之前先用C实现了功能,参照着改到VB下来,要容易不少。下面就VB的代码部分做一个简单的总结,以备后用。

     首先是自定义常量,效果等同于宏定义。

    Const WRITE_BASE_ADDRESS = &H0           ' 用于写入数据的基地址
    Const READ_BASE_ADDRESS = &H1000         ' 用于读取数据的基地址

     VB.NET中的结构体定义格式如下。

Private Structure CMDINFO
      Dim pCMDBuf As UInteger         ' 指令缓冲区,应用申请空间,指针类型
       Dim dwWriteAddr As UInteger     ' 指令写入的地址
       Dim dwCMDLen As UInteger        ' 指令的长度
       Dim dwRetryCount As UInteger    ' 重试的次数
       Dim dwDelayTime As UInteger     ' 重试的周期,以ms为单位
End Structure
Private Structure READINFO
      Dim pReadBuf As UInteger         ' 读取数据的缓冲区,库申请空间,指针类型
      Dim dwDataAddr As UInteger       ' 读取RAM的地址
      Dim dwReadLen As UInteger        ' 读取数据的长度
      Dim dwRetryCount As UInteger     ' 重试的次数
      Dim dwDelayTime As UInteger      ' 重试的周期
  End Structure

    DLL中实现的库函数的声明。

    Private Declare Function SendCommand Lib "DPRAMLib" (ByVal CMDInfo As CMDINFO) As Integer
    Private Declare Function ReadDPRAM Lib "DPRAMLib" (ByRef ReadInfo As READINFO) As Integer
    Private Declare Sub WritePort Lib "DPRAMLib" (ByVal Port As UShort, ByVal Value As Byte)
    Private Declare Function ReadPort Lib "DPRAMLib" (ByVal Port As UShort) As Byte

     需要注意的是,如果函数有返回值须使用Function,如果没有返回值,则使用Sub,否则,程序在运行过程中会出现异常。如果函数的参数为指针或者引用类型,则用ByRef,如果是值传递,则用ByVal。

Private Sub ButtonRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRead.Click
        Dim i As Integer
        Dim szTmp As String
        Dim szShowBuf As String
        Dim ReadBuf As Byte()
        ' 获取地址
        RamAddr = Val("&H" + TextBoxAddr.Text.Substring(2))
        ' 获取长度
        Length = Val("&H" + TextBoxLength.Text.Substring(2))
        ' 调用库函数读取RAM
        stReadInfo.dwDelayTime = 2
        stReadInfo.dwRetryCount = 5
        stReadInfo.dwDataAddr = RamAddr     
        stReadInfo.dwReadLen = Length       
        stReadInfo.pReadBuf = vbNullString  
        ReadDPRAM(stReadInfo)
 
        Length = stReadInfo.dwReadLen - 1 ' 将长度转换为索引的最大值
        ' 获取读取出来的数据长度,并分配相应的内存
        ReDim ReadBuf(Length)
        ' 将库中读取的数据拷贝至托管代码的数组中,以便处理
        Marshal.Copy(stReadInfo.pReadBuf, ReadBuf, 0, stReadInfo.dwReadLen)
        ' 显示读取到的内容
        szShowBuf = "0000:"
        For i = 0 To Length Step 1
            szTmp = Hex(ReadBuf(i))
            If szTmp.Length = 1 Then
                szTmp = "0" & szTmp
            End If
            szShowBuf = szShowBuf & szTmp & " "
            If (i + 1) Mod (8) = 0 Then
                szShowBuf = szShowBuf & vbCrLf ' 加入换行符
                If i < Length Then
                    szTmp = Hex(i + 1)
                    Dim szTmp2 As New String("0", 4 - Len(szTmp))
                    szTmp = szTmp2 & szTmp & ":"
                    szShowBuf = szShowBuf & szTmp
                End If
            End If
        Next
        TextBoxValue.Text = szShowBuf
    End Sub

     以上代码调用库函数读取数据,并在EDIT控件中以十六进制的方式显示出来。其中,用Val和Hex做字符串和十六进制数据之间的转换。Marshal用来处理托管代码和非托管代码之间的数据封送。

Private Sub ButtonWrite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonWrite.Click
        Dim i As Integer, j As Integer, nLength As Integer
        Dim nValue As Byte
        Dim szTmp As String
        Dim WriteBuf As Byte()
        
        RamAddr = Val("&H" + TextBoxAddr.Text.Substring(2))
 
        ' 获取需要写入的数据
         nLength = TextBoxValue.Text.Length()
        ReDim WriteBuf((nLength + 1) / 3)
        i = 0
        j = 0
        While i < nLength
            szTmp = "&H" + Mid(TextBoxValue.Text, i + 1, 2)
            nValue = Val(szTmp)
            WriteBuf(j) = nValue
            i += 3
            j += 1
        End While
        Dim pt As New IntPtr
        pt = Marshal.AllocHGlobal(j)        ' 从进程的非托管内存中分配内存
         Marshal.Copy(WriteBuf, 0, pt, j)    ' 将数据从托管数组复制到非托管内存指针
        ' 调用库函数写入RAM
        stCmdInfo.pCMDBuf = pt
        stCmdInfo.dwCMDLen = j
        stCmdInfo.dwDelayTime = 2
        stCmdInfo.dwRetryCount = 5
        stCmdInfo.dwWriteAddr = RamAddr
        SendCommand(stCmdInfo)
        Marshal.FreeHGlobal(pt)   ' 释放使用AllocHGlobal 从进程的非托管内存中分配的内存
    End Sub

     以上代码调用库函数,将用户输入的十六进制数据写入到RAM中。

目录
相关文章
|
20天前
|
开发框架 算法 Java
.NET 开发:实现高效能的秘诀
【7月更文挑战第4天】探索.NET高效开发涉及理解运行时(如GC、JIT)、代码与算法优化及工具利用。关键点包括适应性垃圾回收、异步编程、明智的并发控制;编写高效代码(避免对象创建,选对数据结构和算法);使用性能分析工具,善用高性能框架如ASP.NET Core,并借助云服务和CI/CD流程持续优化。性能优化是持续学习与实践的过程。
27 1
|
1天前
|
开发框架 搜索推荐 前端开发
【.NET全栈】ASP.NET开发Web应用——Web部件技术
【.NET全栈】ASP.NET开发Web应用——Web部件技术
|
1月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
40 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
20天前
|
人工智能 前端开发 Devops
NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。
【7月更文挑战第4天】**.NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。实际应用涵盖企业系统、Web、移动和游戏开发,以及云服务。面对性能挑战、容器化、AI集成及跨平台竞争,.NET持续创新,开发者应关注技术趋势,提升技能,并参与社区,共同推进技术发展。**
16 1
|
20天前
|
机器学习/深度学习 人工智能 开发者
.NET 技术:为开发带来新机遇
【7月更文挑战第4天】**.NET技术开启软件开发新篇章,通过跨平台革命(.NET Core, Xamarin, .NET MAUI)、云服务与微服务(Azure, DevOps, Docker)及AI集成(ML.NET, 认知服务, TensorFlow)为开发者创造新机遇。开源社区的繁荣与性能提升使.NET更具竞争力,推动智能应用的创新与发展。开发者需紧跟潮流,利用这些工具和框架构建高效、创新的解决方案。**
17 1
|
27天前
|
存储 安全 C#
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
|
27天前
|
开发框架 前端开发 JavaScript
程序与技术分享:ASP.NET发展史(【译】)
程序与技术分享:ASP.NET发展史(【译】)
16 0
|
28天前
|
网络协议
技术好文:Smark.Net实现简单聊天程序
技术好文:Smark.Net实现简单聊天程序
15 0
|
2月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
118 0
|
2月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
46 0