SerialPort serialPort = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
int startaddr = startaddress; //起始地址
int readlen = readlength;//地址长度
List<byte> command = new List<byte>();
command.Add(1);
command.Add(0x3);
command.Add(BitConverter.GetBytes(startaddr)[1]);
command.Add(BitConverter.GetBytes(startaddr)[0]);
command.Add(BitConverter.GetBytes(readlen)[1]);
command.Add(BitConverter.GetBytes(readlen)[0]);
command = GetCRC16(command);
var sendmsg = string.Empty;
command.ForEach(x =>
{
sendmsg += x.ToString("x2").ToUpper() + " ";
});
Console.WriteLine("发送报文:" + sendmsg);
if (!serialPort.IsOpen)
{
serialPort.Open();
}
serialPort.Write(command.ToArray(), 0, command.Count);
DateTime beginTime = DateTime.Now;
while (serialPort.BytesToRead == 0 && DateTime.Now - beginTime <= TimeSpan.FromMilliseconds(serialPort.ReadTimeout))
{
Thread.Sleep(20);
}
byte[] respbyte = new byte[serialPort.BytesToRead];
List<byte> resplist = new List<byte>(respbyte);
var length = serialPort.Read(respbyte, 0, respbyte.Length);
string receive = string.Empty;
for (int i = 0; i < respbyte.Length; i++)
{
receive += respbyte[i].ToString("x2").ToUpper() + " ";
}
Console.WriteLine("接收报文:" + receive);
//有符号的短整型
for (int i = 1; i <= resultData.Count() / 2; i++)
{
var beginindex = i * 2;
byte[] getData = new byte[2];
Array.Copy(resultData, beginindex - 2, getData, 0, 2);
var resultints = getData.Select(x => x.ToString("x2").ToUpper()).ToList();
var value = GetHexadecimalValue(resultints[0] + resultints[1]);
Console.WriteLine("16进制报文:" + value);
var Value = BitConverter.ToInt16(getData.Reverse().ToArray(), 0);
Console.WriteLine(Value);
Console.WriteLine("\r\n");
}
serialPort.Close();
C# ModbusRtu 读取 03功能码
最新推荐文章于 2025-03-16 19:06:10 发布