ความแตกต่างระหว่าง Serial.write และ Serial.print คืออะไร? แล้วพวกเขาจะใช้เมื่อไหร่?


26

ความแตกต่างระหว่าง Serial.write และ Serial.print คืออะไร? แล้วพวกเขาจะใช้เมื่อไหร่?
ทั้งสองถูกใช้เพื่อพิมพ์บนจอภาพอนุกรมอะไรคือความแตกต่างที่แท้จริงของพวกเขา?


คำอธิบายที่ยอดเยี่ยม bpinhosilva! คุณช่วยให้ฉันเข้าใจบางสิ่งที่ฉันต้องดิ้นรนอย่างชัดเจนในตอนนี้
โรรี่

คำตอบ:


19

จากเว็บไซต์ Arduino สำหรับSerial.writeและSerial.print :

Serial.write ()

เขียนข้อมูลไบนารีไปยังพอร์ตอนุกรม ข้อมูลนี้ถูกส่งเป็นไบต์หรือชุดของไบต์ เพื่อส่งอักขระที่เป็นตัวเลขของตัวเลขให้ใช้ฟังก์ชัน print () แทน

Serial.print ()

พิมพ์ข้อมูลไปยังพอร์ตอนุกรมเป็นข้อความ ASCII ที่มนุษย์สามารถอ่านได้


17

Serial.write มากขึ้นสู่พื้นโลกมันเป็นเรื่องง่ายและรวดเร็วมันถูกสร้างขึ้นเพื่อพูดคุยไบนารีหนึ่งไบต์ในแต่ละครั้ง ตัวอย่าง:

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

Serial.print ในทางกลับกันมีความหลากหลายมากขึ้นมันจะทำการแปลงให้คุณจาก ASCII เป็นไบนารีมันยังสามารถแปลงเป็น BIN / HEX / OCT / DEC แต่คุณต้องระบุอาร์กิวเมนต์ที่สองเช่นนี้

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" 

ตัวอย่างเพิ่มเติมด้วยเอาต์พุตอนุกรมแบบภาพ:

รหัส:

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

เอาท์พุทแบบอนุกรม: ป้อนคำอธิบายรูปภาพที่นี่

รหัส:

  Serial.print("HELLO");

เอาท์พุทแบบอนุกรม: ป้อนคำอธิบายรูปภาพที่นี่

Serial.println () ในทางกลับกันจะเพิ่มจุดสิ้นสุดของบรรทัด 2 ไบต์ 0x0D และ 0x0A ตามที่คุณเห็นในเฟรม

รหัส:

  Serial.println("HELLO");

เอาท์พุทแบบอนุกรม:

ป้อนคำอธิบายรูปภาพที่นี่


7

Serial.writeส่งไบต์ไปยังพอร์ตอนุกรมในขณะที่Serial.printส่งอักขระ ASCII เพื่อให้ผู้คนสามารถอ่านได้อย่างง่ายดาย

อุปกรณ์บางอย่างทำงานโดยใช้ไบต์เพื่อตั้งค่าการกำหนดค่าโดยทั่วไปใช้แพ็คเก็ตของข้อมูลและคุณต้องใช้ฟังก์ชั่นการเขียนเพื่อสื่อสารกับพวกเขา ในที่สุดพวกเขาจะส่งไบต์ผ่านอินเตอร์เฟสแบบอนุกรมแล้วคุณสามารถตีความโดยไปแต่ละไบต์


5

ตัวอย่างทั้งหมดข้างต้นถูกต้อง แต่อาจชัดเจนกว่า .... ข้อมูลทั้งหมดที่ส่งผ่านพอร์ตอนุกรมจะถูกส่งเป็น 1 และ 0 (ชัดเจน .... ฉันหวังว่า) ความแตกต่างในสองคำสั่งคือสิ่งที่การส่งจะถูกแปล / ตีความไปยัง / จาก 1 และ 0 ของเหล่านี้ ตัวอย่างที่ชัดเจนที่สุดเกี่ยวข้องกับการส่งหมายเลข

สมมติว่าคุณต้องส่งหมายเลข 217 การแทนเลขฐานสอง (1 และ 0) ของหมายเลขนี้คือ 11011001 การใช้คำสั่งSerial.write(217)จะส่ง 11011001 ข้ามเส้น การแทนเลขฐานสิบหกของหมายเลขเดียวกันคือ 0xD9 และคำสั่งSerial.write(0xD9)จะส่งสิ่งเดียวกัน ... 11011001

นี่คือที่ที่มันน่าสนใจ ... ถ้าคุณต้องใช้คำสั่งSerial.write("217")คุณจะได้สิ่งนี้: 00110010 00110001 00110111 ... อะไร?!?!?
เมื่อสตริงถูกส่งผ่านเป็นอาร์กิวเมนต์มันจะแบ่งออกเป็นอักขระแต่ละตัวแปลงเป็น ASCII แล้วส่งเป็นไบต์สำหรับอักขระแต่ละตัว คุณจะได้รับผลลัพธ์ที่แน่นอนหากคุณต้องการใช้สิ่งต่อไปนี้:

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

(00110010 00110001 00110111)

Serial.print()ตอนนี้ให้ดูที่ คำสั่งSerial.print(217)หรือSerial.print("217")ทั้งสองอย่างจะพิมพ์ในสิ่งเดียวกัน: 00110010 00110001 00110111 นี่เป็นเพราะคำสั่งพิมพ์ก่อนจะแปลงจำนวนใด ๆ เป็นการแสดงสตริงและจากนั้นใช้คำสั่งSerial.write()เพื่อส่งอักขระแต่ละตัวเป็นบิต ASCII แต่ละรายการ

แม้ว่านี่จะไม่ใช่คำอธิบายที่สมบูรณ์ แต่ฉันหวังว่ามันจะช่วยให้คุณคิดในทิศทางที่ถูกต้อง ...


3

อีกวิธีหนึ่งในการตอบคำถามนี้คือการระบุว่า Serial.write ยอมรับอักขระเดี่ยวโดยที่ Serial.print ยอมรับสตริง อาจมีความแตกต่างบางอย่าง แต่นี่เป็นสิ่งที่สำคัญ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.