当前位置:首页Arduino > 正文

Arduino中Serial.print()与Serial.write()函数的区别,以及串口通信中十六进制与字符串的收发格式问题和转换过程详解

作者:野牛程序员:2023-08-28 16:53:52Arduino阅读 3174

Serial.print()Serial.write()是Arduino中用于串口通信的两个不同函数,它们在功能和使用方式上有所不同。

  1. Serial.print()函数:

    • Serial.print()函数用于将数据以字符串的形式发送到串口。这可以是整数、浮点数、字符、字符串等。

    • 数据会被转换成字符形式,然后逐字符发送到串口。默认情况下,发送的是ASCII字符,可以使用不同的参数来控制输出的格式,如十六进制、二进制等。

    • 适用于传输可读的文本和数据,方便人类阅读。

  2. Serial.write()函数:

    • Serial.write()函数用于以二进制形式直接发送数据到串口。

    • 数据不会被转换成字符,而是按照字节原样发送。

    • 适用于传输二进制数据,如字节流、原始数据等,不适合人类阅读。

在串口通信中,数据的收发格式以及十六进制与字符串的转换涉及到以下几个方面:

  • 收发格式: 需要确定数据在串口中的格式,是以字符串还是二进制形式进行传输。如果使用字符串,可以使用Serial.print()来发送;如果使用二进制,可以使用Serial.write()来发送。

  • 十六进制与字符串转换:

    • 发送: 如果要发送十六进制数据,可以使用Serial.write()来直接发送原始字节。如果要发送十六进制字符串,需要将其转换为二进制数据。例如,字符'A'的ASCII码是65,可以使用Serial.write(65)发送;如果要发送十六进制字符串"0xAB",需要将其转换为对应的二进制字节,然后使用Serial.write()发送。

    • 接收: 接收十六进制数据时,需要使用Serial.read()来读取字节,并解释其含义。如果接收到的是ASCII字符形式的十六进制数,需要将其转换为实际的数值。可以使用strtol()函数来进行转换。如果接收的是原始字节,可以直接处理这些字节。

综上所述,在串口通信中需要根据实际需求选择Serial.print()Serial.write()来发送数据,并根据收发的格式和数据类型进行适当的转换和处理。


以下是一个示例代码,演示了在Arduino中如何发送和接收十六进制数据:

发送十六进制数据:

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

void loop() {
  byte hexValue = 0xAB; // 要发送的十六进制值

  Serial.print("Sending hex value: 0x");
  Serial.println(hexValue, HEX); // 以十六进制形式发送

  delay(1000);
}

在这个示例中,hexValue 是要发送的十六进制值。使用Serial.print()Serial.println()函数以十六进制形式发送数据。

接收十六进制数据并转换:

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

void loop() {
  if (Serial.available() > 0) {
    char receivedData[3]; // 存储接收的数据
    Serial.readBytes(receivedData, 2); // 读取两个字节

    receivedData[2] = '\\0'; // 添加字符串结束符

    // 将十六进制字符串转换为整数
    int intValue = strtol(receivedData, NULL, 16);

    Serial.print("Received hex value: ");
    Serial.println(intValue);
  }
}

在这个示例中,使用Serial.readBytes()函数读取两个字节,这两个字节代表一个十六进制数。然后,将这两个字节转换为十六进制字符串,并使用strtol()函数将字符串转换为整数。最后,使用Serial.print()Serial.println()函数输出接收到的整数值。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击