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();
}