首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# 串口通信發送數據:除了 byte[] 還能用什麼?

     編輯:程式設計疑難解答

核心回答

串口硬體本質上是逐位元組(byte)收發的。 `SerialPort.Write(byte[], int, int)` 是最底層、最高效的 API。所有其他型別最終都會被轉換為位元組陣列才發送。

常見型別轉換為 byte[] 的方法

來源型別轉換方式範例
字串指定編碼 `Encoding.GetBytes()``Encoding.ASCII.GetBytes("AT\r\n")`、`Encoding.UTF8.GetBytes(str)`
整數 (int/short/long)`BitConverter.GetBytes()` 或手動移位`BitConverter.GetBytes(0x1234)` → 小端序 `{0x34, 0x12}`
浮點數 (float/double)`BitConverter.GetBytes()``BitConverter.GetBytes(3.14f)`
結構體`Marshal.StructureToPtr` + `byte[]` / `BinaryWriter`需 `[StructLayout(LayoutKind.Sequential)]`,注意對齊
16進位字串自寫解析或 `SoapHexBinary``"AA BB 01"` → `new byte[]{0xAA,0xBB,0x01}`
物件序列化`BinaryFormatter` / `protobuf-net` / `MessagePack`跨語言建議用 Protobuf/MessagePack

實用封裝擴充方法

public static class SerialPortExtensions {
    public static void WriteString(this SerialPort port, string text, Encoding encoding = null) {
        encoding = encoding ?? Encoding.ASCII;
        port.Write(encoding.GetBytes(text), 0, encoding.GetByteCount(text));
    }

    public static void WriteInt32(this SerialPort port, int value, bool littleEndian = true) {
        byte[] bytes = BitConverter.GetBytes(value);
        if (!littleEndian) Array.Reverse(bytes);
        port.Write(bytes, 0, 4);
    }

    public static void WriteHex(this SerialPort port, string hex) {
        // 移除空格、換行
        hex = hex.Replace(" ", "").Replace("\r", "").Replace("\n", "");
        byte[] bytes = new byte[hex.Length / 2];
        for (int i = 0; i < bytes.Length; i++)
            bytes[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
        port.Write(bytes, 0, bytes.Length);
    }
}

// 使用
serialPort.WriteString("AT+RESET\r\n");
serialPort.WriteInt32(sensorId);
serialPort.WriteHex("AA 55 01 02 03");

注意事項

  • 編碼一致性:雙端必須約定相同編碼(ASCII/UTF-8/GB2312),否則中文亂碼。
  • 位元組序:多位元組數值(int/float)約定大端/小端,網路序通常用大端,x86 小端。
  • 幀協議:實務中需自定義幀頭/幀尾/長度/校驗(CRC/Checksum),單純發送 byte[] 無法區分黏包/半包。
  • 執行緒安全:`SerialPort` 非執行緒安全,多執行緒寫入需 `lock` 或佇列單一寫入執行緒。
  • 緩衝區:`WriteBufferSize` 預設 2048,大數據分塊寫入並檢查 `BytesToWrite`。

總結

「除了 byte[] 還能用什麼」→ 任何型別,只要能轉成 byte[] 就能發送。掌握 `Encoding.GetBytes`、`BitConverter.GetBytes`、結構體編組、16進位解析等轉換技巧,並封裝強型別擴充方法,能大幅提升串口開發效率與可讀性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved