HOWTO · Arduino
Arduino 串口打印多个变量
可以使用 Serial.print()和 Serial.println()函数在串口监视器上显示变量值。
本页内容
要在 Arduino 串口监视器中显示多个变量的值,先用 Serial.begin() 初始化串口通信,再用 Serial.print() 或 Serial.println() 发送各个值。连续调用 Serial.print() 会继续在当前行写入;Serial.println() 会在输出值后换行。在值之间加入文本,可以让结果更易读。请将串口监视器设置为与 Serial.begin() 使用相同的波特率。
下面的完整示例展示了如何在同一行输出带分隔符的值、设置浮点数精度、将值分别输出到多行,以及输出一对不断变化的值。示例中的主机模拟层让同一份源码也能作为标准 C++ 运行:在 Arduino 上,开发板核心库提供 Serial 和 delay();在计算机上,模拟层将内容写入标准输出,并运行两次示例循环。使用开发板时,请将串口监视器设置为与 Serial.begin() 相同的波特率。
使用 Serial.print() 在同一行输出多个值
Serial.print() 会将值转换为文本并写出,但不会添加换行符。对每个字段依次调用它,并在字段之间输出分隔符。示例在温度和湿度读数之间使用制表符("\t"),因此输出中包含的是一个制表符,而不是反斜杠和 t 这两个可见字符。
对于浮点数,可选的第二个参数用于指定小数点后显示的位数。这里,Serial.print(temperature, 2) 表示显示两位小数。它改变的是显示格式,不会改变变量中存储的值。最后调用 Serial.println(),即可在这一行末尾添加换行符。可选的精度参数用于浮点数格式;整数则以整数形式输出。
使用 Serial.println() 将值分别输出到多行
如果希望每个值都从新的一行开始,请使用 Serial.println(value)。它会先写出该值,再添加换行符,因此连续调用会形成纵向列表。在示例程序中,标签和对应的值会显示在同一行:每个标签用 Serial.print() 输出,相应的值则用 Serial.println() 输出。
请以 9600 波特打开串口监视器,使其与 Serial.begin(9600) 相匹配。如果监视器使用了不同的速率,即使程序发送的是预期值,接收到的字符也可能显得杂乱。每次调用 Serial.println() 都会在值后添加换行符,因此下一次调用会从新的一行开始。
组合使用两个函数,格式化不断变化的值
对于重复读取的值,可以用 Serial.print() 输出第一个值和分隔符,再用 Serial.println() 输出这一行的最后一个值。下面的循环会输出一对不断变化的值,两者之间以制表符分隔,每对值之后换行。湿度值会在下一次循环前递增,因此第二个值始终比第一个值大五。在开发板上,循环会持续运行,并在每行输出之间短暂停顿。主机模拟层运行两次循环,以展示数值变化。前面介绍同一行输出和分行输出的部分都引用这一个完整示例,因此变量声明和串口设置集中在一处。代码示例及其输出中的标签仍为英文。
修改示例时,如果其他程序要解析这些行,请保持字段顺序和分隔符一致;改变其中任一项都可能影响该程序。主机模拟层只演示格式化效果,不会模拟开发板或串口监视器。
运行此示例。主机模拟层会将内容输出到标准输出;在开发板上,Arduino 核心库会提供相同的 Serial 调用,而 loop() 会持续重复运行。
#ifndef ARDUINO
#include <iostream>
class HostSerial {
public:
void begin(unsigned long) {}
void print(const char* value) { std::cout << value; }
void print(int value) { std::cout << value; }
void print(double value, int digits = 2) {
std::cout.setf(std::ios::fixed);
std::cout.precision(digits);
std::cout << value;
std::cout.unsetf(std::ios::fixed);
}
void println(const char* value) { print(value); std::cout << '\n'; }
void println(int value) { print(value); std::cout << '\n'; }
void println(double value, int digits = 2) { print(value, digits); std::cout << '\n'; }
};
HostSerial Serial;
void delay(unsigned long) {}
#endif
int humidity = 40;
void setup() {
Serial.begin(9600);
}
void loop() {
float temperature = 23.456;
Serial.print("Temperature: ");
Serial.print(temperature, 2);
Serial.print("\t");
Serial.print("Humidity: ");
Serial.println(humidity);
Serial.print("Temperature on its own line: ");
Serial.println(temperature, 2);
Serial.print("Humidity on its own line: ");
Serial.println(humidity);
int first = humidity;
int second = humidity + 5;
Serial.print(first);
Serial.print("\t");
Serial.println(second);
humidity++;
delay(1000);
}
#ifndef ARDUINO
int main() {
setup();
loop();
loop();
}
#endif
Temperature: 23.46 Humidity: 40
Temperature on its own line: 23.46
Humidity on its own line: 40
40 45
Temperature: 23.46 Humidity: 41
Temperature on its own line: 23.46
Humidity on its own line: 41
41 46