You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#串口发送前将文本框32位十进制值追加至数组末尾的实现问题

正确实现32位十进制转4字节二进制并追加数组串口发送的C#代码

原代码的核心问题

  • 用System.Text.Encoding.Unicode.GetBytes把输入字符串转字节数组完全错误——这是把字符串的字符编码转字节,并非将十进制数值转换为对应二进制字节
  • 试图给固定长度数组addressAndOpcode的索引6赋值数组类型,既存在语法错误又触发数组越界(原数组仅6个元素,索引范围0-5)
  • 获取数组长度的写法错误,C#中数组长度属性是首字母大写的Length,而非小写的length

正确实现代码

private void btnSendData_Click(object sender, EventArgs e)
{
    if (!serialPort1.IsOpen) return;

    // 验证输入是否为有效的32位无符号十进制数
    if (!uint.TryParse(tBoxDataOut.Text, out uint inputValue))
    {
        MessageBox.Show("请输入有效的32位十进制数值(0~4294967295)", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        return;
    }

    // 将32位数值转换为4字节二进制数组,匹配示例的小端序格式
    byte[] valueBytes = BitConverter.GetBytes(inputValue);
    // 若系统为大端序,反转数组以符合示例的低字节在前要求
    if (!BitConverter.IsLittleEndian)
    {
        Array.Reverse(valueBytes);
    }

    // 合并固定前缀数组与4字节数值数组
    byte[] addressAndOpcode = new byte[] { 0x0A, 0x08, 0x04, 0x01, 0x02, 0x03 };
    byte[] sendData = new byte[addressAndOpcode.Length + valueBytes.Length];
    Buffer.BlockCopy(addressAndOpcode, 0, sendData, 0, addressAndOpcode.Length);
    Buffer.BlockCopy(valueBytes, 0, sendData, addressAndOpcode.Length, valueBytes.Length);

    // 串口发送合并后的完整数组
    try
    {
        serialPort1.Write(sendData, 0, sendData.Length);
    }
    catch (Exception err)
    {
        MessageBox.Show(err.Message, "发送错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

关键说明

  • 输入验证:通过uint.TryParse确保输入在32位无符号整数范围内,避免非法输入引发异常
  • 字节转换:BitConverter.GetBytes(uint)自动将32位数值转为4字节数组,通过判断系统字节序并按需反转,保证输出格式与示例一致
  • 数组合并:用Buffer.BlockCopy高效完成数组拼接,避免手动赋值的繁琐与越界风险
  • 串口发送:直接发送合并后的完整数组,通过sendData.Length确保所有字节被正确发送

内容的提问来源于stack exchange,提问作者Mustapha Alkhafaaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 08:07:13