Serial.begin (): ทำไมไม่ใช้ 28800 เสมอ?


34

ในโค้ดตัวอย่างจำนวนมากที่บุคคลทั่วไปเพิ่มบรรทัดSerial.begin(9600)ในบล็อกการตั้งค่า

เมื่อฉันค้นหาสิ่งที่Serial.begin()มีอยู่ในเอกสารอย่างเป็นทางการก็บอกว่ามันควบคุมบิตต่อวินาทีการถ่ายโอนข้อมูล

ดังนั้นคำถามที่ชัดเจนคือทำไมไม่ใช้ 28800 อัตราการถ่ายโอนสูงสุด ทำไมคนถึงเลือก 9600 ข้อ จำกัด ที่นี่คืออะไร


3
FYI aarduino ที่สูงที่สุดที่เสียบเข้ากับ USB รองรับจริง ๆ แล้วคือ 115200 และ 57600 มักจะเป็น baud ทั่วไปที่สองที่คุณเห็น
BrettAM

คำตอบ:


48

ทำไมผู้คนถึงตัดสิน?

ผู้คนตั้งถิ่นฐานเพราะมันเร็วเกินพอ การใช้งานที่พบบ่อยที่สุดคือการพิมพ์บางสิ่งบนเทอร์มินัลสำหรับการดีบั๊ก 9600 baud คือ 960 ตัวอักษรต่อวินาทีหรือ 12 x 80 ตัวอักษรต่อวินาที คุณอ่านเร็วแค่ไหน? :)

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

ข้อ จำกัด คืออะไร ...

ขีด จำกัด ของอนุกรมสูง โดยตรงคุณสามารถใช้ baud 115200 ในโปรแกรมของคุณและมันจะทำงาน เทอร์มินัล Arduino จะอนุญาตได้สูงสุด 115200 แต่โปรแกรมอื่น ๆ เช่น RealTerm จะช่วยให้คุณทำงานได้สูงขึ้น

ฮาร์ดแวร์อนุกรมจะทำงานถึง 1 M baud หากคุณอ่านรอบ ๆ คุณจะเห็นคนใช้งานได้นานถึง 1 M โดยควบคุม UART โดยตรง คุณอาจได้รับประโยชน์จากอัตราการรับส่งข้อมูลที่สูงสำหรับการใช้งานเช่นการส่งสัญญาณผ่านชิปบลูทู ธ หากคุณกำลังใช้ส่วนต่อประสานฮาร์ดแวร์อนุกรมเพื่อแลกเปลี่ยนจากชิปหนึ่งไปอีกชิปหนึ่งด้วยระยะทางสั้น ๆ ดังนั้นความเร็วในการรับส่งข้อมูล 1 M จึงเป็นไปได้อย่างสมบูรณ์ นึกถึงอุปกรณ์ SPI และ I2C ทั้งหมดที่ทำงานได้ดีที่อัตราสัญญาณนาฬิกา 1 MHz

ในระยะทางไกลกว่านี้คุณจะเริ่มมีปัญหาเรื่องเสียงรบกวนเมื่อใช้การส่งสัญญาณระดับตรรกะ (ธรรมดา 0 ถึง 5V) หากต้องการใช้ระยะทางที่กว้างขึ้นคุณจะต้องเพิ่มตัวรับส่งสัญญาณเพื่อให้การส่งสัญญาณที่แข็งแกร่งโดยทั่วไป RS-232 และ RS-485 น้อยกว่าปกติ ด้วย RS-232 คุณสามารถเรียกใช้เมกะบิตที่ระยะ 10 ฟุต

ความเร็วสัญญาณนาฬิกาของไมโครโปรเซสเซอร์จะเป็นขีด จำกัด ที่แท้จริง ด้วยฮาร์ดแวร์ UART โปรเซสเซอร์จะต้องโหลดหนึ่งไบต์ไปยัง UART ทุก ๆ 10 บิต (สำหรับ N81) ดังนั้นเมื่อคุณได้รับถึง 1 M baud มันจะเป็นความท้าทายสำหรับหน่วยประมวลผล 16 MHz เพื่อให้ UART ให้ข้อมูล ไบต์ใหม่จะถูกส่งทุกติ๊กนาฬิกา 160 ซึ่งเป็นรหัสบรรทัดน้อยมาก สำหรับข้อมูลสั้น ๆ คุณอาจบรรลุอัตรานั้น ข้อความคือหน่วยประมวลผลจะหมดความเร็วก่อนที่ UART จะถูก จำกัด

หมายเหตุทั้งหมดนี้ใช้กับHardwareSerialซอฟต์แวร์อนุกรมแตกต่างกันมาก


โปรดทราบว่า 2M สามารถจัดเก็บได้ด้วยอนุกรม hw แต่การใช้งานของ Arduino นั้นช้าเกินไปและส่งขยะจำนวนมาก ดู atmega328p ds เพื่อค้นหาบิตมายากลเพื่อเพิ่มความเร็วของคุณเป็นสองเท่า เพิ่มว่า 9800 baud เป็นมาตรฐานที่เก่าแก่มากและเซ็นเซอร์จำนวนมากใช้ค่านั้นเป็นมาตรฐานแม้ว่าจะสามารถกำหนดค่าได้มากกว่าเช่น xbee, gps และอื่น ๆ นอกจากนี้พอร์ตอนุกรมผ่าน usb ใช้ auto-baudrate เจรจาแม่มดอาจแทนที่ baudate ที่เลือก แต่ฉันคิดว่าไม่ได้ถูกใช้โดย arduino (แต่อาจเป็น leonardo)
Lesto

1
9600 8N1 เป็นค่าเริ่มต้นที่แท้จริง อุปกรณ์จำนวนมากที่มีอินเตอร์เฟสแบบอนุกรมนั้นมาพร้อมกับการตั้งค่านี้และจำเป็นต้องกำหนดค่าหากจำเป็นต้องใช้ความเร็วอื่น (หรือฐานข้อมูล, พาริตีบิต, บิตหยุด)
ปีเตอร์มอร์เทนเซ่น

"มันเร็วกว่าพอ" - คำตอบที่ดี แต่ฉันไม่เห็นด้วยกับประเด็นนี้ การใช้งานเอาต์พุตการดีบักส่วนใหญ่กำลังบล็อกดังนั้นจึงเป็นที่ต้องการอย่างมากในการทำให้ผลลัพธ์การดีบักเร็วที่สุดเท่าที่จะทำได้เพื่อป้องกันการเปลี่ยนแปลงที่มากเกินไปในเวลาประมวลผลโค้ด
Rev1.0

หากคุณทำการถ่ายโอนข้อมูลจำนวนมากคุณจะใช้ SPI ใช่ไหม?
tuskiomi

6

นอกจากคำตอบที่น่าสนใจทั้งหมดแล้วการพูดถึงว่าการตั้งค่าความเร็วอนุกรมเป็นXXXบิต / วินาทีนั้นไม่จำเป็นต้องหมายความถึงบิตXXX / วินาทีบนฮาร์ดแวร์

นาฬิกา - แม้ใช้ควอตซ์ - มีความไม่สมบูรณ์และอาจลอยได้ นอกจากนี้เนื่องจากนาฬิกาอนุกรมมักจะสร้างขึ้นผ่านตัวนับ pre-divisor และ (จำนวนเต็ม) ของ power-of-two ค่าทั้งหมดจึงไม่สามารถรับได้อย่างถูกต้องเนื่องจากความถี่สัญญาณนาฬิกาพื้นฐาน ด้วยความช่วยเหลือของบิตเริ่มต้น / หยุดการสื่อสารแบบซีเรียลแบบอะซิงโครนัสอาจทนต่อการเลื่อนนาฬิกา แต่นี่มีข้อ จำกัด

ตัวอย่างเช่นหาก ATmega328PA ของคุณทำงานที่ 1MHz คุณสามารถบรรลุ 9600b / s ที่ 0.2% ของข้อผิดพลาด แต่ที่ 14400b / s ข้อผิดพลาดคือ -3.5% (การสื่อสารที่ 13900b / s) และที่ 28800b / s ข้อผิดพลาดคือ + 8.5% (การสื่อสารที่ 31200b / s) ทั้งหมดตัวเลขเหล่านั้นมาจากATmega48PA-88PA-168PA-328PA แผ่นข้อมูล, P200

นี่ไม่ใช่ปัญหาเมื่ออุปกรณ์ที่เหมือนกันสองเครื่องสื่อสารกัน (เนื่องจากมีการสื่อสารที่ความเร็วเท่ากัน ) มันอาจจะมีปัญหาเมื่อการติดต่อสื่อสารระหว่างอุปกรณ์ที่แตกต่างกัน

การเพิ่มความถี่พื้นฐานไม่จำเป็นต้องปรับปรุงความแม่นยำอย่างมีนัยสำคัญ ตัวอย่างเช่นการเรียกใช้ ATmega328PA เดียวกันกับที่ 2MHz ไม่ได้ให้ผลลัพธ์ที่ดีกว่าเนื่องจากข้อผิดพลาดในการปัดเศษ แต่การใช้งาน 1.8432MHz นั้นให้ bps ที่แม่นยำมากจาก 2400b / s สูงสุด 57.6kHz


3

ฉันคิดว่ามันเป็นประเพณีที่ใช้อัตราการถ่ายโอนที่ไม่ช้าที่สุด (300) แต่ก็ไม่ใช่อันที่อาจทำให้เกิดปัญหาในการตั้งค่าบางอย่าง (28800 หรือ 115200) พอร์ตอนุกรม PC (ส่วนใหญ่มักจะเป็นอะแดปเตอร์ FTDI232 USB) สามารถรับมือกับอัตราที่สูงกว่า แต่ฮาร์ดแวร์ DIY ของคุณอาจไม่ ดังนั้น 9600 bps ได้สร้างตัวเองเป็นอัตราการถ่ายโอนมาตรฐานบางอย่างสำหรับตัวอย่างรหัส


2

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

tl; dr: มันเป็นประวัติศาสตร์ไม่ใช่เทคโนโลยี


0

ฉันคิดว่าเหตุผลหลักที่คนใช้ 9600 ส่วนใหญ่คืออัตราการรับส่งข้อมูลเริ่มต้นใน Arduino IDE ยิ่งไปกว่านั้นอัตราการส่งข้อมูลที่เร็วขึ้นอาจไม่น่าเชื่อถือหากสัญญาณอนุกรมต้องเดินทางไกล - แม้ว่าฉันจะไม่ทราบว่าทำไมการเลือกนี้จึงเป็นความเร็วที่เหมาะสมที่สุด


-2

เวลาปฏิกิริยาของมนุษย์

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

9600 baud เป็นการประนีประนอมระหว่าง "ง่ายต่อการฆ่ากระบวนการที่ต้องหนี" และ "ช้าอย่างน่ารำคาญ"


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