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。