Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Arduino以太网屏蔽,什么';‘write()’、‘print()’和‘printIn()’之间的区别是什么?_Arduino_Ethernet - Fatal编程技术网

使用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()
    :Arduino
    String
    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()
thunking
print()
函数(例如
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()
    可以使用Arduino
    String
    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
类的一个实例(仅适用于选定的行)

好的,所以它是一个
服务器<