文章目录
1.MOXA的PComm Lite
Moxa
是经营工业串口卡、串口服务器之类设备的公司,PComm Lite
是一套易用性、可靠性久经考验串口编程开发包。
相比用API或mscomm控件开发,使用PComm Lite则简单太多了。
使用方法:运行安装后有类库、例程、帮助和几个小工具。关键的有四个文件:pcomm.h/pcomm.lib两个文件复制到项目目录并引用,pcomm.dll丢到windows\system32下或跟应用程序放在一起,
pcomm.chm
帮助备查。
函数介绍:整个库包含50多个函数,最常用的也就10来个:
- 打开、关闭、设波特率的:
sio_open()
、sio_close()
、sio_baut()
- 发送数据的:
sio_putch()
,sio_write()
- 接收数据的:
sio_getch()
,sio_read()
- 查询输入输出缓冲区状态的:
sio_iqueue()
,sio_oqueue()
- 有时可能要设读写超时:
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/
-
搜索PComm Lite,点击如下链接:
-
点击
NPort 5100 Services
,如下图所示:
-
点击工具,下载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