HOWTO · Arduino

Arduino 串口刷新

可以使用 Serial.flush()函数检查串口传输是否完成。

本页内容

在 Arduino 上,Serial.flush() 会等待串口输出数据传输完毕。它不会清除接收数据,也不能确认另一台设备是否收到了消息或对消息采取了行动。若后续步骤需要等 Arduino 完成本次传输后才能进行,就可以使用它。

Arduino 中的 Serial.flush() 有什么作用?

Serial.flush() 会在串口接口发送排队中的输出数据时阻塞程序。该函数返回后,Arduino 才会继续执行下一项操作。如果必须先完成输出才能进行后续操作,例如将收发器的方向引脚从发送切换为接收,这个函数就很有用。

它作用于发送路径,不会清空接收缓冲区,也不会告知你连接的传感器或计算机是否理解了数据。如果需要确认,请定义一套消息交互流程,并等待另一台设备返回确认消息。

在 Arduino 草图中使用 Serial.flush()

下面的 Arduino 调用顺序会先发送一行数据,等待串口输出传输完毕,然后继续执行。请根据连接到开发板的设备调整波特率和消息内容。下面的完整 C++ 程序使用一个简单的本地 Serial 替代对象,因此可以在计算机上演示这一调用顺序;改写为草图时,请将该替代对象换成开发板对应 Arduino 核心库提供的对象。

#include <iostream>

class SerialPort {
public:
  void begin(unsigned long baud) { (void)baud; }
  void println(const char* message) { std::cout << message << '\n'; }
  void flush() {}
};

SerialPort Serial;

void setup() {
  Serial.begin(9600);
  Serial.println("Starting transmission...");
  Serial.flush();
  Serial.println("Transmission finished; continuing.");
}

int main() {
  setup();
  return 0;
}
Starting transmission...
Transmission finished; continuing.

在开发板上,请使用 Arduino 提供的 Serial 对象和适用于该开发板的核心库。计算机上的替代对象只用于演示该调用在执行顺序中的位置,不会模拟电气传输,也无法验证接收端是否处理了第一行数据。要在硬件上检查,请针对你的开发板编译并上传草图,然后使用波特率设为 9600 的串口监视器观察。

PySerial 的 flush() 有何不同?

在使用 PySerial 的 Python 程序中,ser.flush() 同样会等待待发送的输出写入完成。它属于 PySerial 的 Serial 对象,而 Serial.flush() 属于 Arduino 串口接口。两者都处理输出数据;它们本身都不会等待应用层确认,也不会清除已接收的输入数据。

若要可靠地确认命令已处理,可以让 Arduino 在解析并处理命令后发送响应。随后,Python 程序可以读取并验证该响应。请将这一步协议交互与 ser.flush() 区分开来:刷新输出只表示主机已完成写入待发送数据,响应才会说明 Arduino 做了什么。串口名称(例如 COM3)取决于操作系统,因此请根据自己的环境配置端口和波特率。

关于串口刷新的常见问题

Serial.flush() 会清空接收缓冲区吗? 不会。它会等待输出数据传输完毕。要读取传入字节,请使用相应的接收读取逻辑。

刷新完成是否意味着另一台设备收到了消息? 不意味着。这只表示本地串口接口已完成传输,无法证明远端设备收到了、解析了或处理了数据。要确认这些情况,请使用确认消息。

什么时候应该调用它? 当后续代码必须等待待发送的输出完成时,可以调用 Serial.flush(),例如在将半双工收发器切换到接收模式之前。普通日志通常不需要每发送一行都显式等待。

PySerial 也使用同名方法吗? PySerial 在串口连接对象上提供 ser.flush()。它的用途相似,都是处理待发送的输出,但它与 Arduino 的 Serial.flush() 是两个不同的 API。