3

我正在尝试将文本框中的数字转换为 2 个字节,然后可以通过串行发送。数字范围从 500 到 -500。我已经有一个设置,所以我可以简单地发送一个字符串,然后将其转换为一个字节。这是一个例子:

发送序列号(“137”、“1”、“244”、“128”、“0”)

文本框编号将位于第 2 和第 3 个字节中

这将使我的 Roomba(所有这些代码用于的机器人)以 500 毫米/秒的速度向前行驶。发送的第 1 个数字告诉 Roomba 开车,第 2 和第 3 个数字是速度,第 4 和第 5 个数字是转弯的半径(在 2000 和 -2000 之间,还有一个特殊情况,即 32768 是直的)。

4

2 回答 2

2
var value = "321";
var shortNumber = Convert.ToInt16(value);
var bytes = BitConverter.GetBytes(shortNumber);

或者,如果您需要 Big-Endian 排序:

var bigEndianBytes = new[]
{
    (byte) (shortNumber >> 8), 
    (byte) (shortNumber & byte.MaxValue)
};
于 2012-12-23T03:47:24.927 回答
0

假设您正在使用System.IO.Ports.SerialPort,您将编写 usingSerialPort.Write(byte[], int, int)来发送数据。

如果您的输入是这样的:99,255,您将执行此操作以提取两个字节:

// Split the string into two parts
string[] strings = textBox1.text.Split(',');
byte byte1, byte2;
// Make sure it has only two parts,
// and parse the string into a byte, safely
if (strings.Length == 2
    && byte.TryParse(strings[0], System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out byte1)
    && byte.TryParse(strings[1], System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out byte2))
{
    // Form the bytes to send
    byte[] bytes_to_send = new byte[] { 137, byte1, byte2, 128, 0 };
    // Writes the data to the serial port.
    serialPort1.Write(bytes_to_send, 0, bytes_to_send.Length);
}
else
{
    // Show some kind of error message?
}

在这里,我假设您的“字节”是从 0 到 255,这与 C# 的byte类型相同。我曾经byte.TryParse将 解析stringbyte.

于 2012-12-23T03:56:59.563 回答