加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2011-03-09 13:44:27)
标签:

单片机

元器件

半导体

电子工程师

pcb

mcu

it

分类: 移动通信
http://s2/middle/44e1ebdbg9e063985ff01&690串口转以太网NPORT使用笔记 1" TITLE="C#环境下 串口转以太网NPORT使用笔记 1" />

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

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

http://s10/middle/44e1ebdbg9e063d019fa9&690串口转以太网NPORT使用笔记 1" TITLE="C#环境下 串口转以太网NPORT使用笔记 1" />

接着把摩莎提供的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();

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有