如何下载和使用MOXA的PComm Lite串口编程动态库

本文详细介绍了如何使用MOXA的PCommLite库进行串口通信,包括下载、安装和C#封装。PCommLite是一个简单易用的串口编程开发包,提供了丰富的函数接口,如打开、关闭串口,设置波特率,发送和接收数据等。通过封装的PCommHelper类,可以更方便地在C#中调用这些功能,实现高效稳定的串口通信。
摘要由CSDN通过智能技术生成

1.MOXA的PComm Lite

Moxa是经营工业串口卡、串口服务器之类设备的公司,PComm Lite是一套易用性、可靠性久经考验串口编程开发包。

相比用API或mscomm控件开发,使用PComm Lite则简单太多了。

使用方法:运行安装后有类库、例程、帮助和几个小工具。关键的有四个文件:pcomm.h/pcomm.lib两个文件复制到项目目录并引用,pcomm.dll丢到windows\system32下或跟应用程序放在一起,

pcomm.chm帮助备查。
函数介绍:整个库包含50多个函数,最常用的也就10来个:

  1. 打开、关闭、设波特率的:sio_open()sio_close()sio_baut()
  2. 发送数据的:sio_putch()sio_write()
  3. 接收数据的:sio_getch()sio_read()
  4. 查询输入输出缓冲区状态的:sio_iqueue(), sio_oqueue()
  5. 有时可能要设读写超时:sio_SetReadTimeouts(), sio_SetWriteTimeouts()

这些函数见名知义,用法查一下PComm.chm就行了。

编程方法:
接收数据一般免不了要开线程的,在接收线程里sio_iqueue()看一下有没有数据,有就处理,没就Sleep()一会。接收数据时它至少会帮你缓冲几十k,一般也不会丢数据。也可以用sio_term_irq()指定接收一定长数据数据就调用一个CALLBACK函数。

这些基本就齐活了。需要控制DTS/RTS、自动流控制都有,甚至还有Xmoderm/Ymoderm/Zmoderm发送文件。如果要Modbus之类的协议就要自己写了。

与其它串口开发方式比较:简单地说API是基础零件,自己做起来麻烦。MSComm控件、CSerialPort类是实验室产品,Pcomm lite是工业成熟产品。

2.下载PComm Lite

MOXA的官方网址:https://www.moxa.com/en/

  1. 搜索PComm Lite,点击如下链接:
    在这里插入图片描述

  2. 点击NPort 5100 Services,如下图所示:
    在这里插入图片描述

  3. 点击工具,下载PComm Lite安装包,如下:
    在这里插入图片描述

3.安装 setup_pcommlite_1.6_12041917.exe

安装 setup_pcommlite_1.6_12041917.exe ,默认安装在目录C:\Program Files\Moxa\PCommLite 1.6下,如下:
在这里插入图片描述
安装目录下有帮助文档和示例,有x86和x64的dll动态库文件等。

4.使用C#封装PCommHelper类

为了方便使用,封装的代码如下:

public class PCommHelper
{
    /// <summary>
    /// 打开串口
    /// </summary>
    /// <param name="port">串口号</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_open(int port);

    /// <summary>
    /// 配置串口通讯参数
    /// </summary>
    /// <param name="port">串口号</param>
    /// <param name="baud">波特率,详见PComm.chm</param>
    /// <param name="mode">模式,如:数据位、停止位和校验位。详见PComm.chm</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_ioctl(int port, int baud, int mode);

    /// <summary>
    /// 获取在输入缓冲区中积累的数据的长度
    /// </summary>
    /// <param name="port">串口号</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_iqueue(int port);

    /// <summary>
    /// 设置数据终端准备好 DTR(Data Terminal Ready)
    /// </summary>
    /// <param name="port">串口</param>
    /// <param name="mode">模式 0-DTR关闭 1-DTR启用</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_DTR(int port, int mode);

    /// <summary>
    /// 设置请求发送 RTS(Request To Send)
    /// </summary>
    /// <param name="port">串口</param>
    /// <param name="mode">模式 0-RTS关闭 1-RTS启用</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_RTS(int port, int mode);

    /// <summary>
    /// 刷新驱动程序的输入/输出缓冲区中的任何数据
    /// </summary>
    /// <param name="port">串口号</param>
    /// <param name="func">模式 0-刷新输入缓冲区 1-刷新输出缓冲区 2-刷新输入和输出缓冲区</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_flush(int port, int func);

    /// <summary>
    /// 关闭串口
    /// </summary>
    /// <param name="port">串口号</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_close(int port);

    /// <summary>
    /// 读取驱动程序的输入缓冲区数据
    /// </summary>
    /// <param name="port">串口号</param>
    /// <param name="buf">接收缓冲区指针</param>
    /// <param name="length">每次要读取的数据的长度</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_read(int port, ref byte buf, int length);

    /// <summary>
    /// 将一个数据块放到驱动程序的输出缓冲区中
    /// </summary>
    /// <param name="port">串口号</param>
    /// <param name="buf">传输缓冲区指针</param>
    /// <param name="length">传输缓冲区长度 </param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_write(int port, ref byte buf, int length);

    /// <summary>
    /// 将一个字符写入驱动程序的输出缓冲区
    /// </summary>
    /// <param name="port">串口号</param>
    /// <param name="term">字符(0 - 255)</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_putch(int port, int term);

    /// <summary>
    /// 从驱动程序的输入缓冲区中读取一个字符
    /// </summary>
    /// <param name="port">串口号</param>
    /// <returns>详见PComm.chm</returns>
    [DllImport("PComm.dll")]
    public static extern int sio_getch(int port);

    /// <summary>
    /// 波特率 50Bd
    /// </summary>
    public const int B50 = 0;

    /// <summary>
    /// 波特率 75Bd
    /// </summary>
    public const int B75 = 1;

    /// <summary>
    /// 波特率 110Bd
    /// </summary>
    public const int B110 = 2;

    /// <summary>
    /// 波特率 134Bd
    /// </summary>
    public const int B134 = 3;

    /// <summary>
    /// 波特率 150Bd
    /// </summary>
    public const int B150 = 4;

    /// <summary>
    /// 波特率 300Bd
    /// </summary>
    public const int B300 = 5;

    /// <summary>
    /// 波特率 600Bd
    /// </summary>
    public const int B600 = 6;

    /// <summary>
    /// 波特率 1200Bd
    /// </summary>
    public const int B1200 = 7;

    /// <summary>
    /// 波特率 1800Bd
    /// </summary>
    public const int B1800 = 8;

    /// <summary>
    /// 波特率 240Bd
    /// </summary>
    public const int B2400 = 9;

    /// <summary>
    /// 波特率 4800Bd
    /// </summary>
    public const int B4800 = 10;

    /// <summary>
    /// 波特率 7200Bd
    /// </summary>
    public const int B7200 = 11;

    /// <summary>
    /// 波特率 9600Bd
    /// </summary>
    public const int B9600 = 12;

    /// <summary>
    /// 波特率 19200Bd
    /// </summary>
    public const int B19200 = 13;

    /// <summary>
    /// 波特率 38400Bd
    /// </summary>
    public const int B38400 = 14;

    /// <summary>
    /// 波特率 57600Bd
    /// </summary>
    public const int B57600 = 15;

    /// <summary>
    /// 波特率 115200Bd
    /// </summary>
    public const int B115200 = 16;

    /// <summary>
    /// 波特率 230400Bd
    /// </summary>
    public const int B230400 = 17;

    /// <summary>
    /// 波特率 460800Bd
    /// </summary>
    public const int B460800 = 18;

    /// <summary>
    /// 波特率 921600Bd
    /// </summary>
    public const int B921600 = 19;

    /// <summary>
    /// 数据位 BIT_5
    /// </summary>
    public const int BIT_5 = 0;

    /// <summary>
    /// 数据位 BIT_6
    /// </summary>
    public const int BIT_6 = 1;

    /// <summary>
    /// 数据位 BIT_7
    /// </summary>
    public const int BIT_7 = 2;

    /// <summary>
    /// 数据位 BIT_8
    /// </summary>
    public const int BIT_8 = 3;

    /// <summary>
    /// 停止位 STOP_1
    /// </summary>
    public const int STOP_1 = 0;

    /// <summary>
    /// 停止位 STOP_2
    /// </summary>
    public const int STOP_2 = 4;

    /// <summary>
    /// 校验位 无校验 P_NONE
    /// </summary>
    public const int P_NONE = 0;

    /// <summary>
    /// 校验位 偶校验 P_EVEN
    /// </summary>
    public const int P_EVEN = 24; // 0x18

    /// <summary>
    /// 校验位 奇校验 P_ODD
    /// </summary>
    public const int P_ODD = 8;

    /// <summary>
    /// 校验位 标记位 P_MRK
    /// </summary>
    public const int P_MRK = 40; // 0x28

    /// <summary>
    /// 校验位 空白位 P_SPC
    /// </summary>
    public const int P_SPC = 56; // 0x38

    /// <summary>
    /// 返回值 成功
    /// </summary>
    public const int SIO_OK = 0;

    /// <summary>
    /// 返回值 失败 串口号无效
    /// </summary>
    public const int SIO_BADPORT = -1;

    /// <summary>
    /// 返回值 失败 该板卡不是与MOXA兼容的智能板卡
    /// </summary>
    public const int SIO_OUTCONTROL = -2;

    /// <summary>
    /// 返回值 失败 没有要读取的数据
    /// </summary>
    public const int SIO_NODATA = -4;

    /// <summary>
    /// 返回值 失败 没有该端口或该端口被其他程序占用
    /// </summary>
    public const int SIO_OPENFAIL = -5;

    /// <summary>
    /// 返回值 失败 无法控制该端口,因为它被sio_flowctrl设置为自动H/W流量控制
    /// </summary>
    public const int SIO_RTS_BY_HW = -6;

    /// <summary>
    /// 返回值 失败 参数错误
    /// </summary>
    public const int SIO_BADPARM = -7;

    /// <summary>
    /// 返回值 失败 调用Win32函数失败,可尝试调用GetLastError获取错误码
    /// </summary>
    public const int SIO_WIN32FAIL = -8;

    /// <summary>
    /// 返回值 失败 该端口不支持该函数
    /// </summary>
    public const int SIO_BOARDNOTSUPPORT = -9;

    /// <summary>
    /// 返回值 失败 用户中止阻塞的写入
    /// </summary>
    public const int SIO_ABORT_WRITE = -11;

    /// <summary>
    /// 返回值 失败 写入超时
    /// </summary>
    public const int SIO_WRITETIMEOUT = -12;
}

5.PComm安装包下载地址

csdn资源下载,5积分,没积分的私聊,有积分的支持一下,谢谢!https://download.csdn.net/download/CGS_______/21009569

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值