我在做大学项目并面临一个大问题。我正在C#visual studio 2010上开发UI。我需要打开一个串行连接并将一些值输入微控制器。基本上我有24位地址(3字节)的节点,例如0x78A26F。
我在文本框的GUI中从用户那里获取我的输入。用户应输入此78A26F,我希望串口发送以下数据0x6F 0xA2 0x78。
但是用户输入保存为字符串,当我通过串行连接发送时,ASCII被发送,例如0x37 0x38 0x41 0x32 0x36 0x46。我可以在uC中进行处理并执行一些检查,如果在0x30和0x39之间,则减去0x30,如果在0x41和0x46之间,则减去0x37。但我不想在这个计算中使用uC。我想在GUI c#中实现一些算法来发送正确的HEX值。所以我写了以下程序。但我收到一个错误。 “对于无符号字节,值太大或太小。”在代码行说明(数据[2 - i] = Convert.ToByte(x * 16 + y))。
我无法弄清楚这个问题并且现在厌倦了,因为在任何情况下都不会发生这种情况。 如果有人可以在这方面帮助我,无论是使用此代码还是任何其他算法/方法,我都会非常感激。拜托,我宁愿永远不要在uC上实施一些算法。
由于
Maleeha
/***********************************************************************/
/*The code for opening the serial connection and converting it appropriately*/
/***********************************************************************/
byte[] conversion()
{
string text = label16.Text.ToUpper(); // if user enters not capital letters
byte[] data = new byte[3];
int x, y;
bool valid;
for (int i = 2; i >= 0; i--)
{
valid = true;
x = (Convert.ToInt32(Convert.ToChar(text[2 * i + 1])));
y = (Convert.ToInt32(Convert.ToChar(text[2 * i]))); // I want to first send the 0x6F then 0xA2 and finally 0x78. ToChar is so that i can check for A-F
if(x >= 48 || x <= 57) // i,e it is already a number
x = Convert.ToInt32(text[2 * i + 1]);
else if (x >= 65 || x <= 70) // it is between A-F
x = x - 55; // in case of A, i get 10
else // any other value i.e greater than F or any other.
{
valid = false;
break;
}
if (y >= 48 || y <= 57) // same for y
y = Convert.ToInt32(text[2 * i]);
else if (y >= 65 || y <= 70)
y = y - 55;
else
{
valid = false;
break;
}
if (valid == true)
data[2 - i] = Convert.ToByte(x*16 + y); // max will be 15*16 + 15 = 255 which should be OK for convert.ToByte.
}
return data;
}
void serial(byte[] text)
{
SerialPort serialPort1 = new SerialPort();
//configuring the serial port
serialPort1.PortName = "COM1";
serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
//opening the serial port
serialPort1.Open();
//write data to serial port
serialPort1.Write(text, 0, 3);
//close the port
serialPort1.Close();
}
/***********************************************************************/
private void button3_Click(object sender, EventArgs e)
{
byte[] data = conversion();
serial(data);
}
答案 0 :(得分:0)
您对Convert.ToInt32()的调用没有按照您的想法进行。
以下是Convert.ToInt32()的不同用法概述: http://msdn.microsoft.com/en-us/library/bb311038.aspx
逻辑存在三个问题:
查看确定x和y是否在某些数字范围内的if语句。考虑如果x = 100会发生什么。请记住||意为“或”。
如果x或y是使用Convert.ToInt32()表示数字的字符的转换,则需要获取字符串而不是字符,以获得您正在寻找的转换。
一旦超过这两个,请检查convert()方法的输出。你应该注意到最后的问题。
答案 1 :(得分:0)
您可以使用built in methods吗?
byte[] conversion()
{
string text = label16.Text;
for (int i = 0; i < text.length - 1; i+=2) //Make sure to increment by 2, currently ignores a trailing char.
{
string hex = text.Substring(i * 2, 2);
data[i / 2] = Convert.ToByte(hex, 16);
}
return data;
}
不是最干净的代码,但你明白了。
您应该将data[i / 2] = Convert.ToByte(hex, 16);
行包装在try catch中,但我不确定您是否要为该行执行此操作,或者只是在try catch中调用该方法。
您的代码的问题似乎是将{char}直接转换为int的行x = Convert.ToInt32(text[2 * i + 1]);
和y = Convert.ToInt32(text[2 * i]);
。要使您的解决方案能够正常工作,您应该执行x = ((byte)text[2 * i + 1]) - 48;
答案 2 :(得分:0)
.NET框架已经支持转换十六进制字符串。使您的代码看起来像这样:
uint value;
if (!uint.TryParse(label16.Text, // Ought to be a text box
System.Globalization.NumberStyles.HexNumber, null, out value)) {
MessageBox.Show("Invalid hex value");
return;
}
serialPort1.Write(BitConverter.GetBytes(value), 0, 3);