Sự khác biệt giữa Serial.write và serial.print là gì? Và khi nào chúng được sử dụng?


26

Sự khác biệt giữa Serial.write và serial.print là gì? Và khi nào chúng được sử dụng?
Cả hai đã được sử dụng để in trên màn hình nối tiếp, sự khác biệt thực sự của chúng là gì?


Giải thích tuyệt vời bpinhosilva! Bạn đã giúp tôi hiểu một cái gì đó mà tôi đang đấu tranh rất rõ ràng bây giờ.
Rory

Câu trả lời:


19

Từ trang Arduino cho Serial.writeserial.print :

Nối tiếp.

Ghi dữ liệu nhị phân vào cổng nối tiếp. Dữ liệu này được gửi dưới dạng byte hoặc chuỗi byte; để gửi các ký tự đại diện cho các chữ số của một số, hãy sử dụng hàm print ().

Nối tiếp.print ()

In dữ liệu sang cổng nối tiếp dưới dạng văn bản ASCII có thể đọc được.


17

Serial.write là hơn xuống trái đất, nó đơn giản và nhanh chóng, nó được thực hiện để nói chuyện nhị phân, một byte mỗi lần. thí dụ:

Serial.write(0x45);   // will write 0100 0101 to the cable

Mặt khác, serial.print linh hoạt hơn, nó sẽ thực hiện chuyển đổi cho bạn từ ASCII sang nhị phân, nó cũng có thể chuyển đổi sang BIN / HEX / OCT / DEC nhưng bạn cần chỉ định một đối số thứ hai như vậy

Serial.print(76, BIN) gives "0100 1100"
Serial.print(76, OCT) gives "114"
Serial.print("L", DEC) gives "76"
Serial.print(76, HEX) gives "4C" 

thêm ví dụ với đầu ra nối tiếp trực quan:

Mã số:

  Serial.write(0x48);   // H
  Serial.write(0x45);   // E
  Serial.write(0x4C);   // L
  Serial.write(0x4C);   // L
  Serial.write(0x4F);   // O

ĐẦU RA SERIAL: nhập mô tả hình ảnh ở đây

Mã số:

  Serial.print("HELLO");

ĐẦU RA SERIAL: nhập mô tả hình ảnh ở đây

Mặt khác, serial.println () sẽ thêm cuối dòng 2 byte 0x0D và 0x0A như bạn có thể thấy trong khung

Mã số:

  Serial.println("HELLO");

ĐẦU RA SERIAL:

nhập mô tả hình ảnh ở đây


7

Serial.writegửi byte đến cổng nối tiếp trong khi Serial.printgửi các ký tự ASCII để mọi người có thể đọc dễ dàng.

Một số thiết bị hoạt động bằng cách sử dụng byte để đặt cấu hình, thường sử dụng các gói dữ liệu và bạn cần sử dụng chức năng ghi để giao tiếp với chúng. Cuối cùng, họ sẽ gửi byte qua giao diện nối tiếp và sau đó bạn có thể diễn giải bằng cách đi từng byte.


5

Tất cả các ví dụ trên đều đúng, nhưng có thể rõ ràng hơn .... Tất cả dữ liệu được gửi qua cổng nối tiếp được gửi dưới dạng 1 và 0. (hiển nhiên .... tôi hy vọng) ... Sự khác biệt trong hai lệnh là cách bất cứ thứ gì được gửi thực sự được dịch / diễn giải thành / từ những 1 và 0 này. Ví dụ rõ ràng nhất liên quan đến việc truyền số.

Giả sử bạn cần gửi số 217. Đại diện nhị phân (1 và 0) của số này là 11011001. Sử dụng lệnh theo Serial.write(217)nghĩa đen sẽ chỉ gửi 11011001 qua dòng. Biểu diễn Hex của cùng một số là 0xD9 và lệnh Serial.write(0xD9)sẽ gửi cùng một thứ ... 11011001.

Đây là nơi nó trở nên thú vị ... Nếu bạn sử dụng lệnh, Serial.write("217")thay vào đó bạn sẽ nhận được điều này: 00110010 00110001 00110111 ... CÁI GÌ?!?!?
Khi một chuỗi được truyền dưới dạng đối số, nó được chia thành các ký tự riêng lẻ, được chuyển đổi thành ASCII và sau đó được gửi dưới dạng byte cho mỗi ký tự. Bạn sẽ nhận được cùng một đầu ra chính xác nếu bạn sử dụng như sau:

Serial.write(50);
Serial.write(51);
Serial.write(55);

(00110010 00110001 00110111)

Bây giờ hãy nhìn vào Serial.print(). Các lệnh Serial.print(217)hoặc Serial.print("217")cả hai sẽ in cùng một thứ: 00110010 00110001 00110111. Điều này là do lệnh in trước tiên chuyển đổi bất kỳ số nào thành biểu diễn chuỗi và sau đó sử dụng lệnh Serial.write()để gửi từng ký tự dưới dạng các bit ASCII riêng lẻ.

Mặc dù đây không phải là một mô tả HOÀN TOÀN, tôi hy vọng nó sẽ giúp bạn suy nghĩ đúng hướng ...


3

Tuy nhiên, một cách khác để trả lời điều này là nêu ra Serial.write chấp nhận các ký tự đơn trong đó Serial.print chấp nhận các chuỗi. Có thể có một số khác biệt nhưng đây là cái chính.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.