使用Arduino以太网屏蔽,什么';‘write()’、‘print()’和‘printIn()’之间的区别是什么?
使用,之间的区别是什么:使用Arduino以太网屏蔽,什么';‘write()’、‘print()’和‘printIn()’之间的区别是什么?,arduino,ethernet,Arduino,Ethernet,使用,之间的区别是什么: server.write(数据),, server.print(数据),以及 server.println(数据) 我知道,printIn添加了一个新行,而print没有。我找不到server.write()的任何示例(答案很长,如果不方便,请跳到底部的TL;DR) 其中print()和write()来自哪里 要找到答案,我们可以查看来源Server是arduino/libraries/Ethernet/EthernetServer.h中定义的EthernetServe
server.write(数据)代码>,,
server.print(数据)代码>,以及
server.println(数据)代码>
我知道,printIn
添加了一个新行,而print
没有。我找不到server.write()的任何示例代码>(答案很长,如果不方便,请跳到底部的TL;DR)
其中print()
和write()
来自哪里
要找到答案,我们可以查看来源Server
是arduino/libraries/Ethernet/EthernetServer.h
中定义的EthernetServer
类的一个实例(仅适用于选定的行)
好的,这是一个服务器<代码>服务器
是在/usr/share/arduino/hardware/arduino/cores/arduino/Server.h
中定义的,它的内容很少:
class Server : public Print {
public:
virtual void begin() =0;
};
这意味着服务器是Print
的一个子类,因此我们可以查找write()
和Print()
之间的差异
print()
和write()
参数
我们看到这个类(即Print
)定义了许多重载的Print()
方法:
size_t print(const __FlashStringHelper *);
size_t print(const String &);
size_t print(const char[]);
size_t print(char);
size_t print(unsigned char, int = DEC);
size_t print(int, int = DEC);
size_t print(unsigned int, int = DEC);
size_t print(long, int = DEC);
size_t print(unsigned long, int = DEC);
size_t print(double, int = 2);
size_t print(const Printable&);
virtual size_t write(uint8_t) = 0;
size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); }
virtual size_t write(const uint8_t *buffer, size_t size);
以及三种重载的write()
方法:
size_t print(const __FlashStringHelper *);
size_t print(const String &);
size_t print(const char[]);
size_t print(char);
size_t print(unsigned char, int = DEC);
size_t print(int, int = DEC);
size_t print(unsigned int, int = DEC);
size_t print(long, int = DEC);
size_t print(unsigned long, int = DEC);
size_t print(double, int = 2);
size_t print(const Printable&);
virtual size_t write(uint8_t) = 0;
size_t write(const char *str) { return write((const uint8_t *)str, strlen(str)); }
virtual size_t write(const uint8_t *buffer, size_t size);
正如您所看到的,C字符串write
使用块write
(第三种方法),在默认实现中,块写入使用字节写入(第一种方法),这是纯虚拟方法:虚拟大小写入(uint8\t)=0代码>。它必须在从Print
派生的每个类中重写。此外,还可以覆盖块write()
,以便更有效地写入多字节数据
因此,参数方面:
write()
:在字节(uint8\t
)、字节缓冲区和字符数组指针(=常规C字符串)上
print()
:ArduinoString
s、int
s和long
s(在任何基中)、float
s以及从Printable
派生的任何类,以及chars
和C字符串
如您所见,在形式上,参数write()
和print()
之间几乎没有重叠。例如,只有write()
接受uint8\u t
,但只有print()
可以接受char
。唯一的重叠区域是C样式的字符串:有print(constchar[])代码>和写入(常量字符*str)代码>。但是,即使在像char
这样的情况下,print()
函数也只是调用write(uint8\t)
:
这同样适用于打印(char[])
write()
in`EthernetServer
EthernetServer
类引入了块写入方法
size_t EthernetServer::write(const uint8_t *buffer, size_t size)
在EthernetServer
中,写入(uint8\t)
只需点击块写入:
size_t EthernetServer::write(uint8_t b)
{
return write(&b, 1);
}
由于所有print()
调用和非uint8\u t
write()
调用都使用write(uint8\u t)
或write(uint8\u t*,size\u t)
,因此在EthernetServer
类中,每个print
/write
调用都使用块写入
性能和在print()
和write()
thunkingprint()
函数(例如print(char c)
)很可能由gcc编译器内联,不过如果您担心这一点,可以调用write()
,而不是print()
在一种情况下,您可能希望调用write()
而不是print()
来保存两个时钟周期,即您持有一个字节
/uint8\u t
,需要打印它。使用print()
需要将数据转换为4字节值(int
),然后使用更多代码打印。在这种情况下,write()
将稍微快一点
另一方面,代码一致性可能也有价值。从这个角度来看,进行所有print()
调用可能是有意义的
但是,在大多数情况下,您的类型将指示调用print()
函数:write只能接受三种类型的输入
TL;DR:那么你的问题的答案是print()
和write()
之间没有太大区别,除了:
write()
方法(字节或块)在任何情况下都是执行将字符发送到某个位置的实际工作的方法
write()
可以使用字节(uint8\u t
)、字节缓冲区和字符数组指针(=常规C字符串)作为参数,而print()
可以使用ArduinoString
s、int
s和long
s(在任何基中)、float
s以及从Printable
派生的任何类,除了字符
和C字符串之外。因此我们可以说write()
的级别低于print()
,因为它只接受低级类型
- 大多数情况下,您的输出类型将决定使用哪一种。要使代码运行得最快,请使用
write()
打印byte
/uint8\t
类型,但是print
无处不在会使您的代码看起来稍微好一点(主要是因为它不会引发print()
与write()
问题)
(答案很长,如果笨拙,请跳到底部的TL;DR)
其中print()
和write()
来自哪里
要找到答案,我们可以查看来源Server
是arduino/libraries/Ethernet/EthernetServer.h
中定义的EthernetServer
类的一个实例(仅适用于选定的行)
好的,所以它是一个服务器<