当前位置: 首页 > 编程语言 > C#

C#操作串口通信协议Modbus的常用方法介绍分享

时间:2023-04-10 20:40:44 C#

C#学习教程:C#操作串口通讯协议ModbusstartAddr=0常用方法介绍与分享;ushortreadLen=10;vara=BitConverter.GetBytes(readLen);//请求//byte[]需要指定长度;不支持LinqListcommand=newList();命令。Add(0x01);//1号从站命令.Add(0x01);//功能码:读取线圈状态//起始地址命令.Add(BitConverter.GetBytes(startAddr)[1]);//命令。添加(BitConverter.GetBytes(开始地址)[0]);//读取数量command.Add(BitConverter.GetBytes(readLen)[1]);命令.Add(BitConverter.GetBytes(readLen)[0]);//CRC命令=CRC16(命令);//消息组装完成//send-"SerialPortSerialPortserialPort=newSerialPort("COM1",9600,Parity.None,8,Stop位.One);//打开串口serialPort.Open();serialPort.Write(command.ToArray(),0,command.Count);//接收并解析响应消息byte[]respBytes=newbyte[serialPort.BytesToRead];serialPort.Read(respBytes,0,respBytes.Length);//respBytes->0101020000B9FC//检查校验位ListrespList=newList(respBytes);respList.RemoveRange(0,3);//截断:从站地址功能码字节数respList.RemoveRange(respList.Count-2,2);//截断:校验位respList.Reverse();varrespStrList=respList.Select(r=>Convert.ToString(r,2)).ToList();varvalues=string.Join("",respStrList).ToList();值.反向();值。ForEach(c=>Console.WriteLine(Convert.ToBoolean(int.Parse(c.ToString()))));}2.读取保持寄存器///

///读取保持寄存器///staticvoidTest_0x03(){ushortstartAddr=0;ushortreadLen=10;//请求//byte[]需要指定长度;不支持LinqListcommand=newList();command.Add(0x01);//1号从站command.Add(0x03);//功能码:读保持寄存器//起始地址command.Add(BitConverter.GetBytes(startAddr)[1]);命令.Add(BitConverter.GetBytes(startAddr)[0]);//读取数量command.Add(BitConverter.GetBytes(readLen)[1]);命令.Add(BitConverter.GetBytes(readLen)[0]);//CRC命令=CRC16(命令);//消息组装完成//Send-"SerialPortSerialPortserialPort=newSerialPort("COM1",9600,Parity.None,8,StopBits.One);//打开串口serialPort.Open();serialPort.Write(command.ToArray(),0,command.Count);//接收并分析响应消息byte[]respBytes=newbyte[serialPort.BytesToRead];serialPort.Read(respBytes,0,respBytes.Length);//respBytes->0101020000B9FC//检查校验位ListrespList=newList(respBytes);respList.RemoveRange(0,3);//截断:从机地址功能码字节数respList.RemoveRange(respList.Count-2,2);//截断:校验位//获取实际数据部分,分析数据//明确:读取无符号单精度//byte[]data=newbyte[2];//for(inti=0;i///写入多个保持寄存器///staticvoidTest_0x10(){ushortstartAddr=2;ushortwriteLen=4;float[]values=newfloat[]{123.45f,14.3f};//请求//byte[]需要指定长度;不支持LinqListcommand=newList();命令。Add(0x01);//1号从站命令.Add(0x10);//功能码:写多个保持寄存器//写地址命令.Add(BitConverter.GetBytes(startAddr)[1]);命令.Add(BitConverter.GetBytes(startAddr)[0]);//写入数量command.Add(BitConverter.GetBytes(writeLen)[1]);命令.Add(BitConverter.GetBytes(writeLen)[0]);//获取值的byte[]ListvalueBytes=newList();for(inti=0;itemp=newList(BitConverter.GetBytes(values[i]));temp.Reverse();//调整字节顺序valueBytes.AddRange(temp);}//字节数command.Add((byte)valueBytes.Count);命令。添加范围(值字节);//CRC命令=CRC16(命令);//数据包组装完成//Send-"SerialPortSerialPortserialPort=newSerialPort("COM1",9600,Parity.None,8,StopBits.One);//打开串口serialPort.Open();serialPort.Write(命令.ToArray(),0,command.Count);}4.CRC校验staticListCRC16(Listvalue,ushortpoly=0xA001,ushortcrcInit=0xFFFF){if(value==null||!value.Any())thrownewArgumentException("");//操作ushortcrc=crcInit;对于(inti=0;i>1)^poly):(ushort)(crc>>1);}}bytehi=(byte)((crc&0xFF00)>>8);//高位字节lo=(byte)(crc&0x00FF);//低位Listbuffer=newList();//添加校验和原值buffer.AddRange(value);//添加校验和值buffer.Add(lo);缓冲区。添加(喜);//将原始校验值添加到returnreturnbuffer;}至此,本篇串口通讯协议协议Modbus的C#操作介绍完毕。希望对大家的学习有所帮助,希望大家多多支持。以上就是C#学习教程:C#操作串口通讯协议Modbus常用方法介绍分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: