ModbusRTU.cs
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace thinger.ModebusLib
{
public class ModbusRTU
{
// 连接
// 断开
// 读取
// 写入
// 字段
// 属性
// 方法
private SerialPort seriaPort=new SerialPort();
/// <summary>
/// 建立串口连接
/// </summary>
/// <param name="portName"></param> 端口号
/// <param name="baudRate"></param> 波特率
/// <param name="parity"></param> None
/// <param name="dataBits"></param> 8
/// <param name="stopBits"></param> 1
/// <returns></returns>
public bool Connect(string portName,int baudRate, Parity parity,int dataBits,StopBits stopBits
)
{
seriaPort.PortName = portName;
seriaPort.BaudRate = baudRate;
seriaPort.Parity = parity;
seriaPort.DataBits = dataBits;
seriaPort.StopBits = stopBits;
try
{
seriaPort.Open();
}
catch(Exception)
{
return false;
}
return true;
}
/// <summary>
/// 断开串口连接
/// </summary>
public void DisConnect()
{
if(seriaPort.IsOpen)
{
seriaPort.Close();
}
}
public byte[] ReadOutputRegisters(byte slaved,ushort start,ushort count)
{
//通讯方法五步
//拼接报文
List<byte> Sendcommand = new List<byte>();
Sendcommand.Add(slaved);
Sendcommand.Add(0x03);//功能码 0x03 读取输出寄存器
/*
*“256” 这个数字可以看出,这里的高8位就是2字节二进制的高8位,也可以是16进制的高位字节。
* 这里所说的“高8位”转换成10进制的数,也是从0~255 。
* 一个2字节的数比如0x00ff ,低8位是1111 1111(2进制)或0xff(16进制)转换成10进制就是255 。
* 如果再加1,=0x0100,高8位是1,低8位是0 。很明显,高8位的这个“1” ,就是代表的256 。
*/
//将ushort转byte类型
Sendcommand.Add((byte)(start / 256));//高8位
Sendcommand.Add((byte)(start % 256));//低8位
//Sendcommand.Add((byte)(start >> 8));//高位
//Sendcommand.Add((byte)(start&0xff));//低位
Sendcommand.Add((byte)(count / 256));
Sendcommand.Add((byte)(count % 256));
byte[] crc = CalculateCRC(Sendcommand.ToArray(), Sendcommand.Count);
Sendcommand.AddRange(crc);
//发送
seriaPort.Write(Sendcommand.ToArray(), 0, Sendcommand.Count);
//接收
Thread.Sleep(50);
int lengh = seriaPort.BytesToRead;
byte[] buffer=new byte[lengh];
seriaPort.Read(buffer, 0, lengh);
//验证
if (CheckCRC(buffer))
{
byte[] result = new byte[count * 2];
Array.Copy(buffer,3,result,0,count*2);
return result;
}
else
{