ความแตกต่างระหว่าง Serial.write และ Serial.print คืออะไร? แล้วพวกเขาจะใช้เมื่อไหร่?
ทั้งสองถูกใช้เพื่อพิมพ์บนจอภาพอนุกรมอะไรคือความแตกต่างที่แท้จริงของพวกเขา?
ความแตกต่างระหว่าง Serial.write และ Serial.print คืออะไร? แล้วพวกเขาจะใช้เมื่อไหร่?
ทั้งสองถูกใช้เพื่อพิมพ์บนจอภาพอนุกรมอะไรคือความแตกต่างที่แท้จริงของพวกเขา?
คำตอบ:
จากเว็บไซต์ Arduino สำหรับSerial.writeและSerial.print :
Serial.write ()
เขียนข้อมูลไบนารีไปยังพอร์ตอนุกรม ข้อมูลนี้ถูกส่งเป็นไบต์หรือชุดของไบต์ เพื่อส่งอักขระที่เป็นตัวเลขของตัวเลขให้ใช้ฟังก์ชัน print () แทน
Serial.print ()
พิมพ์ข้อมูลไปยังพอร์ตอนุกรมเป็นข้อความ ASCII ที่มนุษย์สามารถอ่านได้
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");
เอาท์พุทแบบอนุกรม:
Serial.write
ส่งไบต์ไปยังพอร์ตอนุกรมในขณะที่Serial.print
ส่งอักขระ ASCII เพื่อให้ผู้คนสามารถอ่านได้อย่างง่ายดาย
อุปกรณ์บางอย่างทำงานโดยใช้ไบต์เพื่อตั้งค่าการกำหนดค่าโดยทั่วไปใช้แพ็คเก็ตของข้อมูลและคุณต้องใช้ฟังก์ชั่นการเขียนเพื่อสื่อสารกับพวกเขา ในที่สุดพวกเขาจะส่งไบต์ผ่านอินเตอร์เฟสแบบอนุกรมแล้วคุณสามารถตีความโดยไปแต่ละไบต์
ตัวอย่างทั้งหมดข้างต้นถูกต้อง แต่อาจชัดเจนกว่า .... ข้อมูลทั้งหมดที่ส่งผ่านพอร์ตอนุกรมจะถูกส่งเป็น 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 แต่ละรายการ
แม้ว่านี่จะไม่ใช่คำอธิบายที่สมบูรณ์ แต่ฉันหวังว่ามันจะช่วยให้คุณคิดในทิศทางที่ถูกต้อง ...
อีกวิธีหนึ่งในการตอบคำถามนี้คือการระบุว่า Serial.write ยอมรับอักขระเดี่ยวโดยที่ Serial.print ยอมรับสตริง อาจมีความแตกต่างบางอย่าง แต่นี่เป็นสิ่งที่สำคัญ