编写第一个库-串行流对象


8

我已经用Arduino完成了许多项目,但是从来没有做过C语言中的“ Hello World”。我正在编写我的第一个库,并且许多面向对象的内容正在我头顶上。无论如何,我的库正在按预期的方式工作,我向函数传递了一个float并对其进行了正确的格式化并通过串行发送出去。但是,我以笨拙的方式实现了它。在Arduino的API设计指南中提到,似乎更好的方式:

使用串行通信时,允许用户指定任何Stream对象,而不是硬编码“ Serial”。这将使您的磁带库与Mega和Due上的所有串行端口兼容,还可以使用SoftwareSerial等备用接口。可以将Stream对象传递到库的构造函数或begin()函数(作为引用,而不是指针)。有关每种方法的示例,请参见Firmata 2.3或XBee 0.4。

有人可以详细说明如何执行此操作,或向我显示一些代码吗?

Answers:


9

这是一个简单的示例(使用mega2560构建和测试),该类可以传递Stream对象,并通过该通用流对象发送Hello。构造对象时,可以传递要实际通信的Stream对象:

#include "Arduino.h"

class MyProtocol
{
public:
    MyProtocol(Stream& s):serial(s){}
    void send(){
        serial.println("Hello");
    }
private:
    Stream& serial;
};

MyProtocol p(Serial);

void setup() {
    Serial.begin(9600);
}

void loop() {
    delay(1000);
    p.send();
}

注意:serial.println()不是Serial全局对象,请注意小写字母,它是内部Stream类变量。

如果您对OO和类感到困惑,请考虑到(虽然您可以获得更多知识)该方法也可以与简单函数一起使用,则可以传递串行参数。此外,不必永远为串行接口进行硬连线,实际上,您可以在运行时切换并根据某些条件使用不同的通道:

#include "Arduino.h"

void send(Stream& serial){
    serial.println("Hello");
}

void setup() {
    Serial.begin(9600);
    Serial1.begin(9600);
}

void loop() {
    delay(1000);
    if(someCondition)
        send(Serial);
    else
        send(Serial1);
}

您还可以将构造函数声明为MyProtocol(Stream&s = Serial):serial(s){},因此您不需要传递序列号,但是可以通过。您将先构建然后再构建对象,就像MyProtocol p;一样。
hithwen14年

谢谢,这真的很有帮助,花了一些工夫,但我想通了。您可以在我的Github上看到结果。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.