原创 C#环境下 串口转以太网NPORT使用笔记 1

2011-3-1 17:06 4318 6 6 分类: 通信

90870599-213d-42a1-b533-838d35d5475d.jpg


最近几天发现写博客非常有意思,以前总是上网搜资料看别人的东西,现在自己也该写点东西和大家分享。我觉得分享是一件非常快乐的事情,在分享的过程中我也会对自己有所反思,一些东西通过文字表达时,会突然发现自己没有发现的问题,经过这么一个过程以前理解不清楚的就有很能豁然开朗。


 今天和大家分享一下一款摩莎的串口转以太网模块——NPORT,在这里我不会介绍摩莎公司,也不去刻意介绍NPORT。这次我主要和大家分享一下,如何使用C#编写NPORT的上位机程序(型号NPORT5510,单串口)。虽然摩莎给了非常详细的范例,使用VC,VB,Delphi三种不同的平台演示如何调用NPORT的DLL文件,但这些平台都是上个世纪的“版本”,现在比较流行的C#却只字未提,在摩莎的官网上也有人问如何使用C#调用这些DLL文件,但是官方的回答也很官方“你可以去访问MSDN寻找答案”。实在没有办法,只好搜集资料研究这个NPORT的DLL中调用了,那么我就来详细说说在C#中如何使用这个DLL文件。


 首先建立了一个工程(这是废话),然后照着摩莎提供的VC的范例,设计了一个相似的界面,功能无非是打开和关闭NPORT,读取数据或者写入数据到NPORT,简单的几个按钮和文本框完全可以搞定这件事。没有C#基础的人也一定可以完成这件事。


b9c49f54-591b-4fc5-b21d-89fb9407a18c.jpg


接着把摩莎提供的DLL文件,放入工程(解决方案)的bin->Debug目录下面。然后添加了一个类文件,取名为NPORT,命名空间改为IPSerial,类的名称取了型号的名字,而命名空间就写成为IPSerial,使用了DLL文件的名称。在该类中必须添加如下命名空间


using System.Runtime.InteropServices;


    由于NPORT是非托管的代码,说白了不是用.Net开发的,所以使用这个命名空间才可以把DLL文件中的函数载入进来,载入则使用DllImport方法。具体的代码如下:


using System;


using System.Text;


//调用非托管的DLL文件


using System.Runtime.InteropServices;


namespace IPSerial


{


    class NPORT


    {


        [DllImport("IPSerial.dll", EntryPoint = "nsio_init", SetLastError = true,


        CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]


        //NPORT初始化函数


        public static extern int nsio_init();


        [DllImport("IPSerial.dll", EntryPoint = "nsio_end", SetLastError = true,


        CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]


        //NPORT结束函数


        public static extern int nsio_end();


        [DllImport("IPSerial.dll", EntryPoint = "nsio_open", SetLastError = true,


        CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]


        //NPORT打开函数


        public static extern int nsio_open(string server_ip, int port_index, int timeouts);


        [DllImport("IPSerial.dll", EntryPoint = "nsio_close", SetLastError = true,


        CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]


        //NPORT关闭函数


        public static extern int nsio_close(int port_id);


        [DllImport("IPSerial.dll", EntryPoint = "nsio_read", SetLastError = true,


        CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]


        //NPORT读命令函数


        public static extern int nsio_read(int port_id, StringBuilder buf, int len);


        [DllImport("IPSerial.dll", EntryPoint = "nsio_write", SetLastError = true,


        CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]


        //NPORT写命令函数


        public static extern int nsio_write(int port_id, string buf, int len);


    }


}


在这里还需要注意两点,第一点:在NPORT的这个类中的所有方法都是“静态方法”,所以不需要实例化一个类就可以直接通过类名调用,例如这样调用NPORT.nsio_read();第二点,关于C#和C的数据类型,在C中有*char这个类型,通过传入一个字符指针,经过函数体内的操作可以改变这个字符串的值,而C#中没有*char类型,是否可以使用string类型代替呢。答案当然是可以的,但是要注意一点,如果传入的字符串不需要改变值,那么使用string类型,如果需要改变字符串的值,那么需要使用StringBuilder类,具体如何使用下面再说。


      


       完成了界面的设计和类之后,接着就开始逐个熟悉NPORT函数,先来nsio_init()函数和nsio_end()这两个函数在界面初始化和关闭的时候使用,具体的代码如下。


private void MainForm_Load(object sender, EventArgs e)


{


//初始化NPORT,调用静态方法


NPORT.nsio_init();


}


 


private void MainForm_FormClosed(object sender, FormClosedEventArgs e)


{


//结束NPORT,调用静态方法


NPORT.nsio_end();


}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条