开发者社区> 技术小美> 正文

WinCE5.0平台下的Moxa DA66x设备应用开发心得

简介:
+关注继续查看

最近金日隧道广告系统的通信系统要升级,用Moxa的DA66x设备取代原先的Moxa5630通信模块,由于DA66x内嵌了WinCE5.0系统,系统的功能可以有很大的发挥余地。

DA66x这款产品功能很强,可以说WinCE5.0在工业通信领域被用到了极致(2个10/100M的Tcp/IP通信口,16+1个高波特率串口)我更为喜欢的是,它给PC机提供了多种渠道去控制该设备,内建了Web服务器,可以通过网页进行各种配置,开启了ftp服务,可以通过ftp上传下载文件,此外我更为喜欢的是提供了Pocket CMD 5.0(如下图),可以通过超级终端进行控制(和DOS界面没有什么区别,很早的时候,我开发AB PLC的一个接口板程序时,就是用到类似的东西)。

通过Moxa提供的SDK,我还是学了不少.net的技术,比如静态构造函数的使用,以前是不知道的,所以以后直接使用静态函数的时候,知道在哪里初始化变量了(题外话:在msdn查静态构造函数的时候,意外的发现在VS2005目录里有好东西,VS2005安装目录\VC#\Specifications\2052下面有两个中文版的C#规范的word文件,很是详细,值得一看)。此外还学到了向API函数传结构体的技术,如:

[StructLayout(LayoutKind.Sequential)]    //该结构体变量内存连续存储

       


  1. public struct LCM_POS  
  2.  
  3.        {  
  4.  
  5.            [MarshalAs(UnmanagedType.U1)]        //无符号字节变量  
  6.  
  7.            public byte x;  
  8.  
  9.            [MarshalAs(UnmanagedType.U1)]  
  10.  
  11.            public byte y;  
  12.  
  13.     }  
  14.  
  15.  
  16.  
  17.          mxdevice.LCM_POS pos = new mxdevice.LCM_POS();  
  18.  
  19.          pos.x = x;  
  20.  
  21.          pos.y = y;  
  22.  
  23.          IntPtr lpPos = Marshal.AllocHGlobal(Marshal.SizeOf(pos)); //分配空间  
  24.  
  25.      Marshal.StructureToPtr(pos, lpPos, false);           //获取结构体指针  
  26.  
  27.      mxdevice1.IoControl(mxdevice.IOCTL_LCM_GOTO_XY, lpPos);     

     有时间这方面的技术,我在专门论述。

 

 

由于DA66x没有提供触摸屏,只是提供了一个16*2的LED显示屏和4个按钮,所以功能控制比较麻烦,值得提出的时,moxa公司提供的SDK还是有bug的,比如下面的一个函数:

   


  1. public bool IoControl(uint code, ref byte input, ref byte output)  
  2.  
  3.        {  
  4.  
  5.            int num1 = 0;  
  6.  
  7.            byte num2 = 0;  
  8.  
  9.            if (!DeviceIoControl(hLCMPort, IOCTL_KEYPAD_GET_DOWN_STATE, (void*)0, 0, pkey, sizeof(UCHAR), &dwBackSize, NULL))  
  10.  
  11.     }  

上面的output参数竟然没用,幸好moxa的dll没有加密可以获得源码,否则我修改起来就麻烦了。

此外DA66x系列的设备和UC7400的设置共用一个.net开发包,并且DA66x没有LCD显示和按键的控制(该需求反馈到Moxa后,据说近期就要发布相关代码),还好,moxa发过来LCM(EVC程序)的源码,可以把相关的EVC代码转换为.net代码。

Moxa最大的设计败笔(个人认为)就是按钮和LCD的驱动设备为同一个“LCM1:”,按钮和LCD就不能独立设计,否则通过线程不断检查按钮状态时会和显示冲突。没有办法,只好设计在一起了,我自己开发一个DA66x的.net驱动,效果还不错(有时间在设计一个二级菜单和多页文本显示的功能)。此外我还是看看moxa提供的开发包是怎么设计的吧,说不定又学到不少东西。

下面是我自己开发的相关代码,有类似需求的朋友可以参考一下:

//LCD显示&按键控制
   


  1. public class LCMKEY  
  2.    {  
  3.        private mxdevice mxdevice1;  
  4.        private Thread trdKeypadlisten;  
  5.        private bool bStop;  
  6.        public static int Key = 0;   //按键信息  
  7.          
  8.        public LCMKEY()  
  9.        {           
  10.        }  
  11.  
  12.        public void Init()  
  13.        {  
  14.            mxdevice1 = new mxdevice("LCM1:");  
  15.            mxdevice1.Open();  
  16.            this.bStop = false;  
  17.  
  18.            this.trdKeypadlisten = new Thread(new ThreadStart(this.ThreadTask));  
  19.            this.trdKeypadlisten.Priority = ThreadPriority.Normal;  
  20.            this.trdKeypadlisten.Start();  
  21.        }  
  22.  
  23.        public void Exit()  
  24.        {  
  25.            mxdevice1.Close();  
  26.            try  
  27.            {  
  28.                if (!this.bStop)  
  29.                {  
  30.                    this.bStop = true;  
  31.                }  
  32.                this.trdKeypadlisten = null;  
  33.            }  
  34.            catch  
  35.            {  
  36.                return;  
  37.            }            
  38.        }  
  39.         ~LCMKEY()  
  40.        {  
  41.            Exit();  
  42.        }  
  43.        //光标控制  
  44.        public void Cursor(bool bFlag)  
  45.        {  
  46.            byte num = 0;  
  47.            mxdevice1.IoControl(bFlag ? mxdevice.IOCTL_LCM_CURSOR_ON : mxdevice.IOCTL_LCM_CURSOR_OFF, ref num); //mxdevice.IOCTL_LCM_BLINK_ON  
  48.        }  
  49.        //清屏  
  50.        public void Clear()  
  51.        {  
  52.            byte num = 0;  
  53.            mxdevice1.IoControl(mxdevice.IOCTL_LCM_CLEAR, ref num);  
  54.        }  
  55.        //光标定位  
  56.        public void GotoXY(byte x, byte y)  
  57.        {  
  58.            mxdevice.LCM_POS pos = new mxdevice.LCM_POS();  
  59.            pos.x = x;  
  60.            pos.y = y;  
  61.            IntPtr lpPos = Marshal.AllocHGlobal(Marshal.SizeOf(pos));  
  62.            Marshal.StructureToPtr(pos, lpPos, false);  
  63.            mxdevice1.IoControl(mxdevice.IOCTL_LCM_GOTO_XY, lpPos);  
  64.        }  
  65.        //文本显示  
  66.        public void Show(string text, byte x, byte y)  
  67.        {  
  68.            int num = 0;  
  69.            GotoXY(x, y);  
  70.            mxdevice1.WriteDev(Encoding.Default.GetBytes(text), text.Length, out num);  
  71.        }  
  72.        //文本显示  
  73.        public void Show(string text1, string text2)  
  74.        {             
  75.            //清屏  
  76.            Clear();  
  77.            //写第一行  
  78.            Show(text1, 0, 0);  
  79.            //写第二行  
  80.            Show(text2, 0, 1);            
  81.        }             
  82.  
  83.        //按钮控制  
  84.        protected virtual void OnKeyClick(int e)  
  85.        {  
  86.            if (this.KeyClick != null)  
  87.            {  
  88.                this.KeyClick(this, e);  
  89.                Key = e;  
  90.            }  
  91.        }  
  92.        //按钮监控  
  93.        private void ThreadTask()  
  94.        {  
  95.            
  96.            byte pTemp = 0pKey = 0;  
  97.            do  
  98.            {  
  99.                if (mxdevice1.IoControl(mxdevice.IOCTL_KEYPAD_GET_MENU_STATE, ref pTemp, ref pKey))  
  100.                {  
  101.                    if (pKey == 1)  
  102.                    {  
  103.                        OnKeyClick(1);  
  104.                    }  
  105.                }  
  106.                if (mxdevice1.IoControl(mxdevice.IOCTL_KEYPAD_GET_UP_STATE, ref pTemp, ref pKey))  
  107.                {  
  108.                    if (pKey == 1)  
  109.                    {  
  110.                        OnKeyClick(2);  
  111.                    }  
  112.                }  
  113.                if (mxdevice1.IoControl(mxdevice.IOCTL_KEYPAD_GET_DOWN_STATE, ref pTemp, ref pKey))  
  114.                {  
  115.                    if (pKey == 1)  
  116.                    {  
  117.                        OnKeyClick(3);  
  118.                    }  
  119.                }  
  120.                if (mxdevice1.IoControl(mxdevice.IOCTL_KEYPAD_GET_SELE_STATE, ref pTemp, ref pKey))  
  121.                {  
  122.                    if (pKey == 1)  
  123.                    {  
  124.                        OnKeyClick(4);  
  125.                    }  
  126.                }  
  127.                Thread.Sleep(100);  
  128.            }  
  129.            while (!this.bStop);  
  130.        }      
  131.        // Events  
  132.        public event KeyClickEventHandler KeyClick;  

 











本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323776,如需转载请自行联系原作者

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

相关文章
iOS设备支持的ARM平台
iOS设备支持的ARM平台
15 0
RISC-V生态开发套件解析(五):LicheeRV 86开发板BSP SDK开发和Xboot 镜像体验
随着RISC-V生态的蓬勃发展,相关开源开发套件也开始逐渐丰富。为了帮助开发者快速了解、玩转新推出的RISC-V开发套件,OCC推出RISC-V生态开发套件解析系列内容,详细讲解生态开发套件的功能特点与上手教程。
311 0
RISC-V生态开发套件解析(七):LicheeRV 86开发板快速开始Waft应用
随着RISC-V生态的蓬勃发展,相关开源开发套件也开始逐渐丰富。为了帮助开发者快速了解、玩转新推出的RISC-V开发套件,OCC推出RISC-V生态开发套件解析系列内容,详细讲解生态开发套件的功能特点与上手教程。
282 0
RISC-V生态开发套件解析(三):LicheeRV 86开发板外设介绍
随着RISC-V生态的蓬勃发展,相关开源开发套件也开始逐渐丰富。为了帮助开发者快速了解、玩转新推出的RISC-V开发套件,OCC推出RISC-V生态开发套件解析系列内容,详细讲解生态开发套件的功能特点与上手教程。
699 0
RISC-V生态开发套件解析(一):LicheeRV 86开发板基础介绍
RISC-V生态开发套件解析(一):LicheeRV 86开发板基础介绍
443 0
RISC-V MCU开发 (二):工程创建与管理
MounRiver® Studio(MRS)内置了GD、WCH等芯片厂家的RISC-V/ARM以及RISC-V通用指令集系列的芯片工程模板,支持Harmony LiteOS-M、RT-Thread、FreeRTOS等嵌入式操作系统开发。同时,MRS还在Eclipse开发平台体系中引入了工程文件的概念,与Keil、VS等其他集成开发环境一样,支持双击工程文件打开IDE并加载工程。
150 0
HaaS UI - 轻量级IoT小程序解决方案
HaaS UI是一套应用在HaaS硬件上的轻量级IoT小程序解决方案,支持AliOS Things内核,支持用JS开发UI应用,同时也支持Native App(不做主要推荐)。
1726 0
【阿里云IoT+YF3300】10.快速开发188协议设备驱动
188协议的全称为CJ-T188-2004 《户用计量仪表数据传输技术条件》,是针对水表、燃气表、热量表和其他集中采集的一个国家行业标准协议。
1504 0
【阿里云IoT+YF3300】9.快速开发modbus设备驱动
Modbus是一种串行通信协议,是莫迪康公司为PLC(编程逻辑控制器)通信而设计的协议。Modbus目前已经成为工业领域通信协议的业界标准,大部分的仪器仪表都支持该通信协议。很早以前就开发过基于Modbus协议的各种驱动,在2007年的时候还曾写了一篇《我的Modbus Slave/Client开发历程》的博客文章 。
1707 0
+关注
技术小美
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
无需从0开发 平头哥教你1天上手蓝牙Mesh应用解决方案
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载