C# ModbusRtu 读取 03功能码

该博客内容涉及使用C#进行串口通信,通过指定端口和波特率初始化SerialPort对象。博主发送特定命令字节序列,包括起始地址和读取长度,并计算CRC16校验。在接收到响应后,将字节数据转换为16进制字符串并解析为有符号短整型数值。整个过程展示了串口通信和数据解析的基本步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值