并行通信 (Parallel Communication)串行通信 (Serial Communication) 是数据传输的两种基本方式,它们描述了数据位在时间上的组织方式。理解这两种模式对于设计和选择合适的通信接口至关重要,无论是在计算机内部、设备之间还是网络通信中。

核心思想:

  • 并行通信:一次传输多个数据位,速度快,但需要多条线路。
  • 串行通信:一次传输一个数据位,速度相对慢,但只需要少数线路。

一、并行通信 (Parallel Communication)

1.1 基本原理

并行通信是指数据以比特组(通常是一个字节或一个字)的形式,在多条独立的线路上同时进行传输。每条线传输一个比特位,所有比特位在同一时刻并行到达接收端。

特点:

  • 多条数据线:需要与数据宽度相同数量的数据线(例如,传输 8 位数据需要 8 条数据线)。
  • 同时传输:所有数据位在同一时钟周期内同时传输。
  • 高速率:理论上,在相同的时钟频率下,并行通信的传输速率是串行通信的 N 倍(N 为数据位数)。

1.2 同步与异步并行通信

  • 同步并行通信:发送端和接收端共享一个时钟信号(或由发送端提供时钟),数据在时钟的上升沿或下降沿同时有效。
  • 异步并行通信:不共享时钟信号。通常会使用额外的控制线(如数据准备好/Data Ready、数据已接收/Data Acknowledge)进行握手,以确保数据传输的同步性。

1.3 优缺点

优点:

  • 高传输速率:一次传输多个比特,因此在相同频率下,吞吐量远高于串行通信。
  • 实现相对简单(短距离):在短距离内,硬件设计和同步问题较少。

缺点:

  • 需要大量传输线:数据线数量多,导致线缆笨重、成本高,连接器复杂。
  • 信号串扰 (Crosstalk):多条线并行传输,信号之间容易相互干扰,影响信号质量,限制传输距离和速度。
  • 时钟偏斜 (Clock Skew):在长距离传输中,不同数据线上的信号到达接收端的时间可能不完全一致,导致接收端对数据的采样错误。这限制了并行通信的距离和最高频率。
  • 电磁兼容性 (EMC) 问题:多条高速并行线容易产生电磁辐射,增加 EMC 设计难度。

1.4 典型应用

  • 内部总线:计算机内部的 CPU 与内存、北桥与南桥等之间的通信(如 PCI、PCI-X 总线)。
  • 打印机接口:早期的并口打印机 (Centronics 接口)。
  • 存储设备:早期的 IDE (Integrated Drive Electronics) 硬盘接口。
  • LCD/LED 显示器接口:某些显示器接口直接并行传输像素数据。
  • FPGA/ASIC 之间:芯片内部或板级短距离高速数据传输。

二、串行通信 (Serial Communication)

2.1 基本原理

串行通信是指数据以比特流的形式,在一个时钟周期内只传输一个比特位。所有比特位沿着同一条数据线(或少数几条线)依次传输。

特点:

  • 少量数据线:通常只需要一条数据线(单向)或两条数据线(双向),有时会加上时钟线和地线。
  • 依次传输:数据位按照时间顺序一个接一个地传输。
  • 低速率(相对):在相同的时钟频率下,传输速率低于并行通信,但通过提高频率可以实现非常高的吞吐量。

2.2 同步与异步串行通信

  • 异步串行通信:发送端和接收端没有共享的时钟线。双方约定好相同的波特率(比特率),并通过起始位和停止位来同步每个数据帧。
    • 典型协议:UART (Universal Asynchronous Receiver/Transmitter)、RS-232、RS-485、RS-422。
  • 同步串行通信:发送端和接收端共享一个时钟信号(或由发送端提供时钟),数据在时钟的每个脉冲下传输。
    • 典型协议:SPI (Serial Peripheral Interface)、I2C (Inter-Integrated Circuit)、USB (Universal Serial Bus)、Ethernet、PCIe。

2.3 优缺点

优点:

  • 传输线少:线缆和连接器简单、成本低,适合长距离传输。
  • 信号完整性好:由于只有少数几条线,串扰和时钟偏斜问题大大减轻,有利于提高传输距离和频率。
  • 电磁兼容性 (EMC) 良好:辐射较小,更容易满足 EMC 标准。
  • 易于实现全双工:通过两对独立的收发线可以轻松实现全双工通信。

缺点:

  • 理论传输速率较低:在相同频率下,一次只能传输一个比特。然而,通过提高时钟频率和复杂的编码技术,实际的串行通信可以达到比并行通信更高的吞吐量。
  • 需要串并行转换:数据在发送前需要进行并行到串行的转换,在接收后需要进行串行到并行的转换,这增加了硬件的复杂性。

2.4 典型应用

  • 外部设备连接:USB (键盘、鼠标、打印机、U盘)、SATA (硬盘)、PCIe (显卡、固态硬盘)。
  • 芯片间通信:SPI、I2C (传感器、EEPROM、显示屏)。
  • 网络通信:Ethernet (以太网)、光纤通信。
  • 远程通信:RS-232、RS-485 (工业控制、Modem)。
  • 无线通信:蓝牙、Wi-Fi (本质上也是串行传输)。

三、并行通信与串行通信的对比

特性 并行通信 (Parallel Communication) 串行通信 (Serial Communication)
数据传输方式 多位数据同时传输 一位数据依次传输
所需线路 多条(与数据位宽相同的数据线 + 控制线/时钟线) 少量(1-4 条数据线 + 可能的时钟线/地线)
传输速度 理论上快(单位时钟周期传输比特多) 理论上慢(单位时钟周期传输比特少)
实际高速 受限于时钟偏斜和串扰,距离短时较快 通过高频和复杂编码,可实现超高速(长距离)
传输距离 短距离 长距离
布线复杂度
成本 高(线缆、连接器) 低(线缆、连接器)
信号完整性 易受串扰和时钟偏斜影响 较好,抗干扰能力强
EMC 差,易产生辐射 优,辐射小
硬件实现 短距离较简单 需要串并行转换器,但对长距离和高速有成熟方案
主要应用 短距离高速、总线级内部通信 长距离、高频、设备间、网络通信

四、选择哪种通信方式?

在实际应用中,选择并行还是串行通信取决于以下因素:

  • 传输距离:长距离通常选用串行通信。
  • 传输速率要求:超高速率(如 Gbps 甚至 Tbps)现在多通过高速串行链路实现,因为其对时钟偏斜和串扰的控制更好。低速或中高速短距离,并行可能仍有优势。
  • 成本:串行通信的线缆和连接器成本通常较低。
  • 物理空间:串行通信占用更少的引脚和布线空间。
  • 电磁兼容性要求:串行通信更容易满足 EMC 要求。
  • 协议复杂性:串行通信的协议通常更复杂,需要更多的编码/解码逻辑。

五、Go 语言中串行通信的简单示例

Go 语言本身没有内置的串行端口库,但可以使用第三方库如 go.bug.st/serial

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main

import (
"fmt"
"log"
"time"

"go.bug.st/serial"
)

func main() {
// 获取所有可用的串行端口
ports, err := serial.GetPortsList()
if err != nil {
log.Fatal(err)
}
if len(ports) == 0 {
log.Fatal("No serial ports found!")
}
for _, port := range ports {
fmt.Printf("Found port: %v\n", port)
}

// 选择一个端口 (这里假设选择第一个,实际应用中可能需要用户选择或配置)
portName := ports[0]
fmt.Printf("Using port: %v\n", portName)

// 配置串行端口模式
mode := &serial.Mode{
BaudRate: 9600,
DataBits: 8,
Parity: serial.NoParity,
StopBits: serial.OneStopBit,
}

// 打开串行端口
port, err := serial.Open(portName, mode)
if err != nil {
log.Fatal(err)
}
defer port.Close() // 确保在函数结束时关闭端口

// 写入数据
n, err := port.Write([]byte("Hello, Serial!\n"))
if err != nil {
log.Fatal(err)
}
fmt.Printf("Sent %v bytes\n", n)

// 读取数据 (非阻塞方式,需要自行处理超时或等待)
buf := make([]byte, 128)
fmt.Println("Waiting for data...")
for i := 0; i < 5; i++ { // 尝试读取5次
time.Sleep(500 * time.Millisecond) // 等待一段时间
n, err := port.Read(buf)
if err != nil {
if err != serial.ErrTimeout { // 忽略超时错误
log.Fatal(err)
}
}
if n > 0 {
fmt.Printf("Received %v bytes: %q\n", n, buf[:n])
break
}
}
fmt.Println("Finished serial communication example.")
}

六、总结

并行通信和串行通信各有优势和局限性。早期,由于技术限制和对速度的追求,并行通信在短距离高速传输中占据主导地位。然而,随着技术的发展,特别是时钟频率的提高和串行化/解串行器 (SerDes) 技术的成熟,串行通信克服了其理论上的速度劣势,并通过复杂的编码和均衡技术,在长距离和超高速传输领域展现出无与伦比的优势,成为现代数据通信的主流。如今,从计算机内部的总线(如 PCIe)到外部接口(如 USB、SATA),再到光纤网络,高速串行通信无处不在。