C# 串行通信-通过Modbus发送十六进制数据

C# 串行通信-通过Modbus发送十六进制数据,c#,serial-port,modbus,C#,Serial Port,Modbus,我不熟悉使用Modbus通信,我在这里发现了一些其他相关的线程,但不幸的是,这是针对其他语言的,或者使用TCP而不是Modbus的RTU连接 所以我有一段C代码可以用来发送数据: byte address = Convert.ToByte(txtSlaveID.Text); ushort start = Convert.ToUInt16(txtWriteRegister.Text); short[] value = new short[1]; if(Int16.TryParse

我不熟悉使用Modbus通信,我在这里发现了一些其他相关的线程,但不幸的是,这是针对其他语言的,或者使用TCP而不是Modbus的RTU连接

所以我有一段C代码可以用来发送数据:

  byte address = Convert.ToByte(txtSlaveID.Text);
  ushort start = Convert.ToUInt16(txtWriteRegister.Text);
  short[] value = new short[1];

  if(Int16.TryParse(txtWriteValue.Text, out short numberValue))
  {
     value[0] = numberValue; //This part works!
  }
  else
  {
     value = new short[3] { 0x52, 0x4E, 0x56 }; //This is where I am trying to send letters/ASCII
  }
                
 try
 {
     mb.SendFc16(address, start, (ushort)value.Length, value);
 }
     catch (Exception err)
 {
    WriteLog("Error in write function: " + err.Message);
 }

 WriteLog(mb.modbusStatus);
因此,当我想要向下发送一个值时,这段代码可以工作。构建数据包需要短阵列和以下步骤:

  //Put write values into message prior to sending:
  for (int i = 0; i < registers; i++)
  {
    message[7 + 2 * i] = (byte)(values[i] >> 8);
    message[8 + 2 * i] = (byte)(values[i]);
  }
//在发送前将写入值放入消息中:
用于(int i=0;i<寄存器;i++)
{
消息[7+2*i]=(字节)(值[i]>>8);
消息[8+2*i]=(字节)(值[i]);
}
如你所见,我试图在数组中使用十六进制值,并将它们发送到寄存器


如何修改第一个代码示例,使其能够向下发送十六进制值,并将字符写入第一个图像中的寄存器空间?

我认为您无法在设备的寄存器中写入字符。 您不需要将十六进制值存储到短数组中。只需将字符存储到数组中,然后再将其写入寄存器并将其转换为字节


注意-写入设备寄存器的数据应以字节为单位。

无法回答问题。没有任何意义,示例代码缺少变量的定义。RTU只有8位,所以我不知道为什么要移位8位,而缺少CRC计算。请参阅Wiki:Jay-什么不起作用(您是否收到Modbus错误,或者显示器是否不符合您的预期?)-如果您能够识别Modbus代码的来源(是否来自库?),这也会有所帮助。ASCII是8位,而保持寄存器是16位,所以很可能显示器要求每个寄存器有两个字符。