开发者社区> helpful> 正文

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中。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
我与VB.net再次重逢,最简单的一个小程序
我与VB.net再次重逢,最简单的一个小程序
22 0
用VB.net开发.NET Micro Framework
.NET Micro Framework从4.2版本开始就支持VB.net,这对VB爱好者是一个福音,想当年,我也是用VB6开发工控项目,开发了若干年呀,对VB还是比较有感情的,不过后来转到.NET平台选择的是C#而不是VB.NET。
776 0
【.Net Micro Framework PortingKit – 14】TinyCLR编译与测试
由于TinyCLR的相关代码与硬件无关,我们所做的就是根据实际需要,添加不同的Feature,此外就是合理配置堆栈和代码存储位置。
1744 0
再谈.NET Micro Framework移植
从代码角度来说,不仅STM32F103的移植代码在不断完善,并且也已经移植和优化了基于STM32F207和STM32F407的相关代码。从硬件角度来说,也由最初完全借助第三方的硬件作为.NET Micro Framework开发板,演变为今天推出自行设计的开发板和物联网产品。
537 0
VB.net_音乐播放器
2015年11月25日21:51:50网名:浩秦; 邮箱:root#landv.pw; 只要我能控制一個國家的貨幣發行,我不在乎誰制定法律。金錢一旦作響,壞話隨之戛然而止。
859 0
WinCE下VB.NET读写注册表的参考代码
与桌面Windows系统类似,WinCE将有关操作系统、应用程序和驱动的设置信息都保存在系统注册表中。WinCE的注册表与桌面系统中的组织方式也差不多,包括了如下四个根键:       HKEY_CLASS_ROOT,包含了文件扩展名信息和COM子系统的配置信息       HKEY...
821 0
CADVBA代码移植到.NET
之前写的VBA代码,如果全部用.NET改写,比较劳命伤财,没什么兴趣改写。所以用了一种很偷懒的方法。       通过com方式调用AutoCAD 200x Type Library,和AutoCAD/ObjectDBX Common xx.x Type Library,定义VBA中的ThisDrawing对象,书写比较规范的VBA代码基本上不用做什么修改就能运行了。
986 0
水晶报表VB.NET中的使用
水晶报表是一个优秀的报表开发工具,本人在开发通用管理系统的时候,所有报表都使用水晶报表,其简单、易用和强大的功能令笔者倍加喜爱,现将水晶报表使用手记呈现给大家。   一、在使用自带的水晶报表时,请注册,否则只能使用30次   水晶报表注册码  注册号:6707437608  密码:AAP5GKS0000GDE100DS   二、使用CrystalReportViewer进行预览   CrystalReportViewer控件允许在应用程序中查看 Crystal Report。
1224 0
+关注
helpful
长期从事嵌入式软件开发,包括&micro;C/OS 、WinCE、Linux和Android等。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载