qq_36044120 2023-12-07 18:04 采纳率: 0%
浏览 5

unity串口发送16进制问题

unity中想发送16进制给串口 这是16进制的内容: 01 03 00 00 00 01 84 0A

下面都是把十六进制字符串转换成字节型

 public static sbyte[] StringToByte(string InString)
    {
        string[] ByteStrings;
        ByteStrings = InString.Split(" ".ToCharArray());
        sbyte[] ByteOut;
        ByteOut = new sbyte[ByteStrings.Length];
        for (int i = 0; i <= ByteStrings.Length - 1; i++)
        {
            //ByteOut[i] = System.Text.Encoding.ASCII.GetBytes(ByteStrings[i]);
            ByteOut[i] = SByte.Parse(ByteStrings[i], System.Globalization.NumberStyles.HexNumber);
            //ByteOut[i] =Convert.ToByte("0x" + ByteStrings[i]);
        }
        return ByteOut;
    }

 private sbyte[] StrToHex(string strText)
    {
        strText = strText.Replace(" ", "");
        sbyte[] bText = new sbyte[strText.Length / 2];
       
        for (int i = 0; i < strText.Length / 2; i++)
        {
            int temp= Convert.ToSByte(strText.Substring(i * 2, 2), 16);
         
           
            bText[i] = (sbyte)temp;
            print(bText[i]);
           // var temp= Byte.Parse(strText.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber);
           //bText[i] = temp;
        }
       
        return bText;
    }

但是不管那种方法,串口收到的都是01 03 00 00 00 01 04 0A
本来的84都会变成04 。再比如{ 63, 69, 72, 20, 32, 32, 0D, 0A };发这个得到的也永远是23 29 32 20 32 32 0D 0A
求看看原因在哪里??

  • 写回答

3条回答 默认 最新

  • helloworld88990 2023-12-07 18:28
    关注

    在Unity中发送16进制数据到串口时,你可以使用以下方法将十六进制字符串转换为字节数组:

    private byte[] HexStringToByteArray(string hexString)
    {
        hexString = hexString.Replace(" ", ""); // 移除空格
        byte[] byteArray = new byte[hexString.Length / 2];
        
        for (int i = 0; i < hexString.Length; i += 2)
        {
            byteArray[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
        }
        
        return byteArray;
    }
    

    这个方法将十六进制字符串转换为字节数组,而不是有符号字节数组。有符号字节数组 (sbyte[]) 是带有符号的 8 位整数,可能会导致数据解释错误。正确的做法是使用无符号字节数组 (byte[]) 来表示十六进制数据。

    你可以使用以下代码示例发送十六进制数据到串口:

    using UnityEngine;
    using System.IO.Ports;
    
    public class SerialPortTest : MonoBehaviour
    {
        SerialPort serialPort;
    
        void Start()
        {
            serialPort = new SerialPort("COM1", 9600);
            serialPort.Open();
            serialPort.Write(HexStringToByteArray("01 03 00 00 00 01 84 0A"), 0, 8);
        }
    
        void OnDestroy()
        {
            serialPort.Close();
        }
    
        private byte[] HexStringToByteArray(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            byte[] byteArray = new byte[hexString.Length / 2];
            
            for (int i = 0; i < hexString.Length; i += 2)
            {
                byteArray[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
            }
            
            return byteArray;
        }
    }
    

    确保将 COM1 替换为正确的串口名称,并根据需要调整波特率。这段代码在启动时打开串口并发送十六进制数据,然后在销毁时关闭串口。

    如果你仍然遇到问题,可能是由于串口接收端的解析方式不正确。请确保接收端正确地解析和处理十六进制数据。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月7日

悬赏问题

  • ¥30 Diodes 霍尔开关AH337已经obselete,他的升级替代料【不改变现有电路图】
  • ¥30 关于#微信#的问题:微信实名不绑卡 可以实现吗 有没有专家 可以解决
  • ¥15 (标签-考研|关键词-set)
  • ¥15 求修改代码,图书管理系统
  • ¥15 请问有没求偏多标签数据集yeast,reference,recreation,scene,health数据集。
  • ¥15 传感网应用开发单片机实训
  • ¥15 Delphi 关于sAlphaImageList使用问题
  • ¥15 寻找将CAJ格式文档转txt文本的方案
  • ¥15 shein测试开发会问些啥我是写java的
  • ¥15 关于#单片机#的问题:我有个课程项目设计,我想在STM32F103veTX单片机,M3主控模块上设计一个程序,在Keil uVision5(C语言)上代码该怎么编译?(嫌钱少我可以加钱,急急急)