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
相关产品推荐
相关产品推荐

