NPORT串口转以太网 学习笔记

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
,MessageBoxButtons.OK,MessageBoxIcon.Error); } }
写完了打开事件和关闭事件,现在终于可以开始描述 write 函数了,我个人觉得向 NPORT 写入数据要
完成了界面的设计和类之后,接着就开始逐个熟悉 NPORT 函数,先来 nsio_init()函数和 nsio_end()这 两个函数在界面初始化和关闭的时候使用,具体的代码如下。 private void MainForm_Load(object sender, EventArgs e) {
//初始化NPORT,调用静态方法 NPORT.nsio_init(); }
关闭按钮单击事件的函数代码如下:
private void buttonClose_Click(object sender, EventArgs e) {
//调用close函数 int returnValue = NPORT.nsio_close(portID); if (returnValue == (int)ReturnCode.NSIO_OK) {
NPORT 串口转以太网学习笔记 使用 C#开发
最近几天发现写博客非常有意思,以前总是上网搜资料看别人的东西,现在自己也该写点东西和大家 分享。我觉得分享是一件非常快乐的事情,在分享的过程中我也会对自己有所反思,一些东西通过文字表 达时,会突然发现自己没有发现的问题,经过这么一个过程以前理解不清楚的就有很能豁然开朗。
具体的代码如下: private void buttonOpen_Click(object sender, EventArgs e) {
string serverIP = textBoxServerIP.Text; int portIndex = Convert.ToInt32(textBoxPortIndex.Text); try {
class NPORT {
[DllImport("IPSerial.dll", EntryPoint = "nsio_init", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{ //结束NPORT,调用静态方法 NPORT.nsio_end();
} 初始化 NPORT 之后就可以尝试打开 NPORT 了,NPORT 的 nsio_open 有三个参数,在打开之前首先
首先建立了一个工程(这是废话),然后照着摩莎提供的 VC 的范例,设计了一个相似的界面,功能无 非是打开和关闭 NPORT,读取数据或者写入数据到 NPORT,简单的几个按钮和文本框完全可以搞定这件 事。没有 C#基础的人也一定可以完成这件事。
接着把摩莎提供的 DLL 文件,放入工程(解决方案)的 bin->Debug 目录下面。然后添加了一个类文 件,取名为 NPORT,命名空间改为 IPSerial,类的名称取了型号的名字,而命名空间就写成为 IPSerial, 使用了 DLL 文件的名称。在该类中必须添加如下命名空间 using System.Runtime.InteropServices;
//枚举体,错误代码 enum ReturnCode:int {
NSIO_OK = 0, NSIO_BADPORT = -1, NSIO_BADPARM = -2, NSIO_THREAD_ERR = -3, NSIO_MEMALLOCERR = -4, NSIO_INVALID_PASSWORD = -100, NSIO_RESET_TIMEOUT = -101, NSIO_NOT_ALIVE = -102, NSIO_CONNECT_FAIL = -200, NSIO_SOCK_INIT_FAIL = -201, NSIO_SOCK_ERR = -202, NSIO_TIMEOUT = -203 }
MessageBox.Show("NPORT关闭成功", "NPOR操作提示"); //使能能打开按钮 buttonOpen.Enabled = true; //禁能关闭按钮 buttonClose.Enabled = false; } else { MessageBox.Show("NPORT关闭失败", "NPOR操作提示"
根据返回值对参照 NPORT 的说明书寻找答案。
关闭 NPORT 的事件和上面的相似,为了更方便地编程,我在 IPSeria 命名空间下加入了错误代码,错
误代码为 C#的枚举类型,而这个 C#的枚举型被定义为了 int 型,可以通过强制类型转换和 C#的整数相比 较,例如 returnValue == (int)ReturnCode.NSIO_OK。IPSeria 命名空间下加入如下代码:
需要设定 NPORT 的 IP 地址,使得 NPORT 可以正常的连接到调试的 PC 机,说的简单点就需要在同一个
局域网中,设定的工具就是摩莎的 NPORT Administration,接着就是一个 PortIndex 参数,如果操作的是第
一个串口设定为 1,如果设定的第二个串口则设定 2。以此类推,最后就是一个超时时间的设置,这个保
//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 类,具体如何使用下面再说。
留一个默认值就可以了,一般设定 3000 毫秒。调用 nsio_open 这个函数返回一个非常重要的参数,这个参
数名为 PortID,得到这个参数后应该保留,调用读写命令的时候还会用到 PortID 参数,所以我把它作为窗
体类的字段,说的明白点就是一个“全局变量”。为了防止意外,使用 try catch 语句打开或者关闭 NPORT。
由于 NPORT 是非托管的代码,说白了不是用.Net 开发的,所以使用这个命名空间才可以把 DLL 文件中的函数载入进来,载入则使用 DllImport 方法。具体的代码如下: using System; using System.Text; //调用非托管的DLL文件 using System.Runtime.InteropServices; namespace IPSerial {
//打开NPORT portID = NPORT.nsio_open(serverIP, portIndex, 3000); //若返回值不小于0,打开成功 if (portID >= 0) {
MessageBox.Show("NPORT打开成功" + Environment.NewLine + "portID = " + portID.ToString(), "NPOR操作提示");
//禁能打开按钮 buttonOpen.Enabled = false; //使能关闭按钮 buttonClose.Enabled = true; } else { MessageBox.Show("NPORT打开失败" + Environment.NewLine
+ "错误代码 " + portID.ToString(), "NPOR操作提示"); } } catch (System.Exception ex) { MessageBox.Show(ex.Message, "NPOR操作提示"); } } 如果获得的 PortID 参数不小于 0,那么 NPORT 打开正常,如果返回负数的话就说明打开存在问题,
今天和大家分享一下一款摩莎的串口转以太网模块——NPORT,在这里我不会介绍摩莎公司,也不去 刻意介绍 NPORT。这次我主要和大家分享一下,如何使用 C#编写 NPORT 的上位机程序(型号 NPORT5510, 单串口)。虽然摩莎给了非常详细的范例,使用 VC,VB,Delphi 三种不同的平台演示如何调用 NPORT 的 DLL 文件,但这些平台都是上个世纪的“版本”,现在比较流行的 C#却只字未提,在摩莎的官网上也有人 问如何使用 C#调用这些 DLL 文件,但是官方的回答也很官方“你ຫໍສະໝຸດ Baidu以去访问 MSDN 寻找答案”。实在没 有办法,只好搜集资料研究这个 NPORT 的 DLL 中调用了,那么我就来详细说说在 C#中如何使用这个 DLL 文件。
相关文档
最新文档