ASCII 到 HEX 的 C# 代码问题.需要洞察力

本文关键字:问题 洞察力 代码 HEX ASCII | 更新日期: 2023-09-27 18:32:49

我正在做大学项目,面临一个大问题。 我正在C# Visual Studio 2010上开发一个UI。我需要打开一个串行连接并将一些值输入微控制器。基本上我有 24 位地址(3 字节(的节点,例如 0x78A26F。

我在文本框中从GUI中的用户那里获取我的输入。 用户应输入此78A26F,我希望串行端口0x6F 0xA2 0x78发送以下数据。

但是用户输入保存为字符串,当我通过串行连接发送它时,会发送 ASCII,例如0x37 0x38 0x41 0x32 0x36 0x46。 我可以在 uC 中进行处理并执行一些检查以减去 0x30 如果在 0x30 和 0x39 之间,或者减去 0x37 如果在 0x41 和 0x46 之间。 但我不想使用 uC 进行此计算。 我想在用于发送正确的十六进制值的 GUI C#。所以我写了下面的程序。但是我收到一个错误。"值对于无符号字节来说太大或太小",在代码行中指出(data[2 - i] = Convert.ToByte(x*16 + y((。

我无法弄清楚这个问题,现在受够了,因为无论如何都不应该发生这种情况。如果有人能在这方面帮助我,无论是用这段代码还是任何其他算法/方法,我将不胜感激。拜托,我宁愿永远不要在uC上实现一些算法。

谢谢

马利哈

    /***********************************************************************/
    /*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);
    }

ASCII 到 HEX 的 C# 代码问题.需要洞察力

.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);

你能使用内置的方法吗?

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 中调用该方法。

代码的问题似乎是将字符直接转换为 int 的行x = Convert.ToInt32(text[2 * i + 1]);y = Convert.ToInt32(text[2 * i]);。 要使您的解决方案正常工作,您应该执行以下操作x = ((byte)text[2 * i + 1]) - 48;

你对 Convert.ToInt32(( 的调用没有做你认为它正在做的事情。

以下是Convert.ToInt32((的不同用法的概述:http://msdn.microsoft.com/en-us/library/bb311038.aspx


逻辑存在三个问题:

  1. 查看确定 x 和 y 是否属于特定数字范围的 if 语句。 考虑一下如果 x = 100 会发生什么。 记住 ||表示"或"。

  2. 如果 x 或 y 是使用 Convert.ToInt32(( 表示数字的字符,则转换需要采用字符串而不是字符,以便获得所需的转换。

  3. 一旦你通过了这两个,检查你的 convert(( 方法的输出。您应该注意到最后一个问题。