所以,我试图通过C#中的serialport对象与设备通信。设备正在查找要作为命令字符串的一部分发送给它的掩码值。例如,其中一个字符串将类似于“SETMASK:{}”,其中{}是无符号的8位掩码。
当我使用终端(例如BRAY)与设备通信时,我可以让设备工作。例如,在BRAY终端中,字符串SETMASK:$ FF将掩码设置为0xFF。但是,我不能为我的生活弄清楚如何在C#中做到这一点。
我已经尝试过以下函数,其中Data是掩码值,CMD是周围的字符串(在本例中为“SETMASK:”)。我哪里错了?
public static string EmbedDataInString(string Cmd, byte Data)
{
byte[] ConvertedToByteArray = new byte[(Cmd.Length * sizeof(char)) + 2];
System.Buffer.BlockCopy(Cmd.ToCharArray(), 0, ConvertedToByteArray, 0, ConvertedToByteArray.Length - 2);
ConvertedToByteArray[ConvertedToByteArray.Length - 2] = Data;
/*Add on null terminator*/
ConvertedToByteArray[ConvertedToByteArray.Length - 1] = (byte)0x00;
Cmd = System.Text.Encoding.Unicode.GetString(ConvertedToByteArray);
return Cmd;
}
答案 0 :(得分:0)
不能肯定,但我敢打赌你的设备期望1字节字符,但C#字符是2字节。尝试使用Encoding.ASCII.GetBytes()将字符串转换为字节数组。您可能还需要返回byte []数组而不是字符串,因为您最终会将其转换回2字节字符。
using System.Text;
// ...
public static byte[] EmbedDataInString(string Cmd, byte Data)
{
byte[] ConvertedToByteArray = new byte[Cmd.Length + 2];
System.Buffer.BlockCopy(Encoding.ASCII.GetBytes(Cmd), 0, ConvertedToByteArray, 0, ConvertedToByteArray.Length - 2);
ConvertedToByteArray[ConvertedToByteArray.Length - 2] = Data;
/*Add on null terminator*/
ConvertedToByteArray[ConvertedToByteArray.Length - 1] = (byte)0x00;
return ConvertedToByteArray;
}
如果您的设备接受其他字符编码,请将ASCII替换为适当的编码。
答案 1 :(得分:0)
问题解决了,System.Buffer.BlockCopy()命令在字符串中的每个字符后嵌入了零。这有效:
public static byte[] EmbedDataInString(string Cmd, byte Data)
{
byte[] ConvertedToByteArray = new byte[(Cmd.Length * sizeof(byte)) + 3];
char[] Buffer = Cmd.ToCharArray();
for (int i = 0; i < Buffer.Length; i++)
{
ConvertedToByteArray[i] = (byte)Buffer[i];
}
ConvertedToByteArray[ConvertedToByteArray.Length - 3] = Data;
ConvertedToByteArray[ConvertedToByteArray.Length - 2] = (byte)0x0A;
/*Add on null terminator*/
ConvertedToByteArray[ConvertedToByteArray.Length - 1] = (byte)0x00;
return ConvertedToByteArray;
}