ฉันมีร่างง่าย ๆ ที่พิมพ์ "Hello World" ไปยังซีเรียล แต่ฉันได้รับซึ่งพูดพล่อยๆแทน
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello World");
delay(1000);
}
ทำไมมันไม่พิมพ์ "Hello World" เหมือนรหัสบอกว่า?
ฉันมีร่างง่าย ๆ ที่พิมพ์ "Hello World" ไปยังซีเรียล แต่ฉันได้รับซึ่งพูดพล่อยๆแทน
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello World");
delay(1000);
}
ทำไมมันไม่พิมพ์ "Hello World" เหมือนรหัสบอกว่า?
คำตอบ:
บอร์ดและเทอร์มินัลอาจไม่ได้ใช้อัตรารับส่งข้อมูลเดียวกัน ตรวจสอบมุมด้านล่างขวาของ Arduino Serial Terminal และตรวจสอบให้แน่ใจว่าได้ตั้งค่าเป็น 9600
การสื่อสารแบบอนุกรมสามารถทำงานได้โดยการส่งกระแสข้อมูลทั้งหมดทีละบิต นี่คือตรงกันข้ามกับพอร์ตขนานมาตรฐานที่ส่งทีละหนึ่งไบต์ อุปกรณ์ทั้งสองจำเป็นต้องรู้ความเร็วในการส่งข้อมูล นอกจากนี้อุปกรณ์ทั้งสองจะต้องทำงานด้วยความเร็วเดียวกัน สิ่งนี้เรียกว่าอัตราการรับส่งข้อมูล
Baud จริงๆแล้วหมายถึงพัลส์ต่อวินาที ในบริบทของการสื่อสารแบบอนุกรมหมายความว่ามีการส่งบิตจำนวนเท่าใดต่อวินาที หนึ่งในค่าที่พบบ่อยที่สุดคือ 9600 แต่ก็มีค่าทั่วไปอื่น ๆ ซึ่งเป็นปัจจัยหรือทวีคูณของ 9600 แม้ว่าจะไม่สำคัญก็ตามตราบใดที่อุปกรณ์ทั้งสองทำงานที่ความเร็วเดียวกัน
หากฉันส่งข้อความถึงคุณเร็วกว่าที่คุณได้รับคุณจะสูญเสียข้อมูล หากฉันกำลังส่งข้อความถึงคุณช้ากว่าที่คุณได้รับคุณจะสับสนกับสิ่งที่ฉันส่งให้คุณ
หากคุณดูเอกสารประกอบbegin()
คุณจะเห็นว่าสามารถใช้พารามิเตอร์สองตัว:
Serial.begin(speed)
Serial.begin(speed, config)
หวังว่าคุณจะเข้าใจความเร็วตอนนี้มันเป็นบิตต่อวินาทีที่ Arduino จะสื่อสาร
พารามิเตอร์ที่สองconfig
ให้คุณกำหนดค่าบางอย่างเกี่ยวกับการส่งข้อมูลแบบอนุกรม บิตเหล่านี้คือ Data, Parityและ Stop คุณจะได้เห็นในหน้าจะได้ค่าชอบ5N1
, 6N1
และSERIAL_8N1 (the default)
หมายเลขแรกแสดงจำนวนบิตข้อมูล ตัวละครตัวที่สองจะบอกคุณว่าบิตแบบพาริตี้มีอะไรบ้าง E
สำหรับความเท่าเทียมกันแม้สำหรับความเท่าเทียมกันO
แปลกหรือN
ไม่มีความเท่าเทียมกัน ตัวเลขที่สามบอกจำนวนบิตหยุด
ดังนั้นด้วย 8N1 เรามี 10 บิตที่ถูกส่งสำหรับแต่ละ 8 บิตของข้อมูล "ของคุณ" 1 บิตเริ่มต้น 8 บิตข้อมูลและ 1 บิตหยุด
อย่างไรก็ตามทั้งสองฝ่ายจำเป็นต้องเห็นด้วยกับข้อมูลนี้รวมถึงความเร็ว Arduino Serial Terminal ไม่ได้ให้คุณเลือกในการเปลี่ยนการตั้งค่าเหล่านี้ แต่อย่างอื่นคุณต้องแน่ใจว่าการตั้งค่าเหล่านี้เหมือนกัน
ข้อมูลเพิ่มเติมเกี่ยวกับวิกิ: การสื่อสารแบบซีเรียลแบบอะซิงโครนัส
คำตอบของ Sachleen (ด้านบน) พูดว่า:
The board and terminal are probably not using the same baud rate.
Check the bottom right corner of the Arduino Serial Terminal
and make sure it is set to 9600.
หากหมายเลขนี้คือ 9600 และคุณยังได้รับข้อมูลที่อ่านไม่ออกให้ตรวจสอบผลลัพธ์ที่คุณได้รับเมื่ออัปโหลดรหัส มันควรอ่านสิ่งที่ชอบ:
Sketch uses 2754 bytes (8%) of program storage space. Maximum is 30720 bytes.
Global variables use 195 bytes (9%) of dynamic memory, leaving 1853 bytes for local variables. Maximum is 2048 bytes.
C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM5 -b57600 -D -Uflash:w:C:\Users\Owner\AppData\Local\Temp\arduino_build_457862/LockCode.ino.hex:i
avrdude: Version 6.3, compiled on Jan 17 2017 at 12:00:53
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"
Using Port : COM5
Using Programmer : arduino
Overriding Baud Rate : 57600
บรรทัดล่างสุดนี้ (จากสิ่งที่ฉันโพสต์) บอกว่า baudrate เริ่มต้นของอุปกรณ์ของคุณคืออะไร สำหรับฉันฉันเปลี่ยนSerial.begin(9600);
-> Serial.begin(57600);
และตรวจสอบว่ามุมขวาล่างของ Arduino Serial Terminal อ่าน 57600
หลังจากที่ฉันเรียกใช้สิ่งนี้และใช้งานได้ฉันสามารถเปลี่ยนกลับเป็น 9600 และรับข้อมูลที่ไม่ได้อ่าน Arduino ดูเหมือนจะพิถีพิถัน ...
ฉันใช้เวลาครึ่งชั่วโมงพยายามแก้ปัญหานั้นและ Arduino Pro Mini ของฉันนั่นคือ3.3Vและฉันได้เลือก 5V ใน Arduino IDE (บนพีซี) การพิมพ์แบบอนุกรมจะไม่ทำงานเช่นนั้นแม้จะกำหนดอัตรารับส่งข้อมูลแบบเดียวกัน
เลือกบอร์ดที่ถูกต้องใน Arduino IDE
เพื่อให้ชัดเจนต้องเลือกโปรเซสเซอร์ (แรงดันไฟฟ้า / ความเร็วนาฬิกา) ภายใต้แท็บเครื่องมือ