在Arduino中更好的使用Serial.print

本文介绍了如何在Arduino编程中利用#define预处理器开关来控制Serial.print的使用,以便在调试完成后提升程序的运行效率。通过定义DEBUG0或DEBUG1,可以方便地开启或关闭串口打印功能,从而在不影响程序功能的同时减少不必要的代码执行。

Serial.print在调试阶段是比较好的助手,但是一旦你调试完成好后建议停止使用Serial.print函数,因为它会增加代码量降低程序运行效率。

可以用如下方法开关Serial.print功能。

#include <Arduino.h>

#define DEBUG 0

#if DEBUG == 1
#define debug(x) Serial.print(x)
#define debugln(x) Serial.println(x)
#else
#define debug(x)
#define debugln(x)
#endif

int addOne(int inX) {
    debug("Received value:");
    debugln(inX);
    
    // Other processing done here

    debugln("Returning.");
    return inX + 1;
}

void setup() {
    Serial.begin(9600);
    debugln("Setup complete.");
}

void loop () {
    static unsigned long counter = 0;
    unsigned long b = addOne(counter);
    debug("Counter:");
    debugln(b);

    // Emulate other processing being done herek
    delay(5000);
}

通过#define DEBUG 1或者#define DEBUG 0开关串口输出。

#include <Arduino.h> // 定义帧结构(与发送端一致) struct Frame { uint8_t syncByte; // 同步帧(1字节) uint8_t deviceAddr; // 设备地址帧(1字节) uint8_t registerAddr; // 寄存器帧(1字节) uint8_t data; // 数据帧(1字节) uint8_t crc; // CRC校验帧(1字节) }; // 串口帧接收器类(无CRC验证) class SimpleSerialReceiver { private: uint8_t frameBuffer[5]; // 接收缓冲区(5字节) Frame currentFrame; // 当前接收的帧 uint8_t frameState; // 帧接收状态(0-4表示接收进度) uint8_t expectedSync; // 预期的同步字节 bool frameComplete; // 帧接收完成标志 unsigned long lastByteTime; // 最后接收字节的时间戳 public: // 构造函数(默认同步字节0x55) SimpleSerialReceiver(uint8_t syncByte = 0x55) { expectedSync = syncByte; resetReceiver(); } // 重置接收状态 void resetReceiver() { frameState = 0; frameComplete = false; memset(frameBuffer, 0, sizeof(frameBuffer)); memset(&currentFrame, 0, sizeof(Frame)); lastByteTime = millis(); } // 处理接收到的一个字节 bool processByte(uint8_t byte) { // 检查帧超时(超过10ms没有新字节则重置) if (millis() - lastByteTime > 10) { resetReceiver(); } lastByteTime = millis(); // 状态机处理 switch (frameState) { case 0: // 等待同步字节 if (byte == expectedSync) { frameBuffer[0] = byte; frameState = 1; Serial.println("Sync byte detected"); } break; case 1: // 接收设备地址 frameBuffer[1] = byte; frameState = 2; break; case 2: // 接收寄存器地址 frameBuffer[2] = byte; frameState = 3; break; case 3: // 接收数据 frameBuffer[3] = byte; frameState = 4; break; case 4: // 接收CRC frameBuffer[4] = byte; // 填充帧结构(无CRC验证) currentFrame.syncByte = frameBuffer[0]; currentFrame.deviceAddr = frameBuffer[1]; currentFrame.registerAddr = frameBuffer[2]; currentFrame.data = frameBuffer[3]; currentFrame.crc = frameBuffer[4]; frameComplete = true; // 重置状态机准备下一帧 resetReceiver(); break; } return frameComplete; } // 获取完整帧(调用后重置完成标志) Frame getFrame() { frameComplete = false; return currentFrame; } // 检查是否有完整帧 bool hasFrame() { return frameComplete; } // 获取当前接收状态 uint8_t getState() { return frameState; } }; // 创建接收器实例(使用默认同步字节0x55) SimpleSerialReceiver receiver; void setup() { Serial.begin(9600); // 波特率必须与发送端一致 Serial.println("Receiver Ready"); Serial.println("Waiting for frames..."); } void loop() { // 检查串口是否有数据 if (Serial.available() > 0) { // 读取一个字节 uint8_t byte = Serial.read(); // 显示接收到的原始字节 Serial.print("RX: 0x"); if (byte < 0x10) Serial.print("0"); // 确保两位数格式 Serial.println(byte, HEX); // 处理字节 if (receiver.processByte(byte)) { // 获取完整帧 Frame frame = receiver.getFrame(); // 打印接收到的帧信息 Serial.println("\n--- FRAME RECEIVED ---"); Serial.print("Sync: 0x"); if (frame.syncByte < 0x10) Serial.print("0"); Serial.println(frame.syncByte, HEX); Serial.print("DevAddr: 0x"); if (frame.deviceAddr < 0x10) Serial.print("0"); Serial.println(frame.deviceAddr, HEX); Serial.print("RegAddr: 0x"); if (frame.registerAddr < 0x10) Serial.print("0"); Serial.println(frame.registerAddr, HEX); Serial.print("Data: 0x"); if (frame.data < 0x10) Serial.print("0"); Serial.println(frame.data, HEX); Serial.print("CRC: 0x"); if (frame.crc < 0x10) Serial.print("0"); Serial.println(frame.crc, HEX); Serial.println("----------------------\n"); } } // 添加短暂延时减少CPU负载 delay(10); } 是不是缺少定义导致烧录不了
最新发布
11-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

armcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值