"串行" (RS-232 / RS-422 串行协议)

"Serial" 通过 RS-232 和 RS-422 协议为串行通信提供通用的接口.

串行通信一般通过基于 Unix 系统的 /dev/ttyXX 设备或基于 Windows 系统的 COM 端口起作用.

串行通信经常使用 UART 在硬件中实现.

串行口的物理连接器包括 D-超小型 25 针连接器和 DE-9 9 针连接器.

串行通信也经常通过 USB、蓝牙等实现.

设备发现

  • 串行连接一般不会自动被发现,一般可以根据文档来确定.
  • 在基于 Unix 的系统中,串行连接的名称有时可以通过比较特定连接插入前后的 /dev/tty* 设备列表来识别.

打开设备

    DeviceOpen["Serial"]

    打开默认的串行端口.

    DeviceOpen["Serial",name]

    打开带有指定名称的串行端口. 在基于 Unix 的系统中一般的名称为 "/dev/ttyXX" 或 "/dev/tty.usbserialXX",在 Windows 中为 "COM1"、"COM2" 等.

    DeviceOpen["Serial",opts]

    打开带有指定选项的默认串行端口.

  • 可以给出以下选项:
  • "BaudRate"9600数据传输率(比特/秒)
    "DataBits"8每帧使用的数据位数
    "Handshake"None流控制握手协议
    "IgnoreBreak"False是否忽略中断
    "Parity"None设置校验位
    "ReadBufferSize"4096读缓冲区的大小(字节)
    "StopBits"None使用的停止位数
  • 典型的波特率包括:48009600192003840057600115200230400.
  • "DataBits" 给出用于传送数据的每字节的位数. 可能的值为:56789.
  • 流控制握手协议 "Handshake" 的可能设置为:None"RTS"\"XOnXoff\.
  • "Parity",指定校验位应如何设定。可能值为:None"Even""Odd""Mark""Space".
  • "StopBits" 给出用于分离数据帧的位数. 可能值为:None11.52.

配置设备

  • 不需要配置. 使用 DeviceOpen 为串行连接设置参数.

读取数据

    DeviceRead[dev]

    从串行连接读取单个字节,返回整数值.

    DeviceRead[dev,"String"]

    从串行连接读取单个字符,以字符串形式返回字符.

    DeviceReadBuffer[dev]

    读取串行连接缓冲区中的所有字节,返回整数列表.

    DeviceReadBuffer[dev,n]

    读取串行连接缓冲区中的最新 n 个字节.

    DeviceReadBuffer[dev,"ReadTerminator"->term]

    从串行端口缓冲区中读取字节直到结束符号 term.

  • Wolfram 语言函数例如 DeviceReadLatestDeviceReadTimeSeries 也被支持.
  • 在 Wolfram 语言中字节用整数值表示.
  • 字节列表可以使用 FromCharacterCode 转换成字符串.
  • "ReadTerminator" 的设定可以是单个字节或字符.
  • 如果没有数据可读,读函数在预设 10 秒后会超时.

写入数据

    DeviceWrite[dev,b]

    把一个字节 b 编写入串行连接.

    DeviceWrite[dev,{b1,b2,}]

    把一个字节列表 bi 编写入串行连接.

    DeviceWrite[dev,"string"]

    以字符串形式把字节写入串行连接.

  • Wolfram 语言函数例如 DeviceWriteBuffer 也被支持.
  • 字节可被指定为 0 到 255 间的整数或单个 ASCII 字符串.

执行命令

    DeviceExecute[dev,"ReadFlush"]

    刷新任何已读和缓冲的数据.

    DeviceExecute[dev,"SerialReadyQ"]

    如果有任何可读的缓冲数据,则给出 True,否则为 False.

  • "SerialReadyQ" 命令可用于检查从串行连接读取是否被阻挡.

关闭和释放资源

    DeviceClose[dev]

    关闭串行连接并释放相关资源.

范例

基本范例  (1)

这些例子运行在通过 USB 连接的运行 Arduino 的树莓派上. Arduino 运行自定义的、称为 sketch 的程序.

打开一个连接树莓派的 Arduino 的连接,读取从 Arduino 返回的字符串:

读取从 Arduino 返回的下一个字节:

把一个字节写入 Arduino:

把一个字符串写入 Arduino:

关闭 Arduino 的连接: