ฉันรู้ว่านี่คือการเริ่มต้นบางสิ่ง:
Serial.begin(9600);
แต่ฉันต้องการรู้ว่ามันหมายถึงอะไรจริง ๆ ?
ฉันรู้ว่านี่คือการเริ่มต้นบางสิ่ง:
Serial.begin(9600);
แต่ฉันต้องการรู้ว่ามันหมายถึงอะไรจริง ๆ ?
คำตอบ:
Serial.begin(9600)
ไม่ได้พิมพ์อะไรเลย สำหรับสิ่งที่คุณต้องการใช้Serial.print("Hello world!")
ในการพิมพ์ข้อความ "Hello world!" ไปยังคอนโซลอนุกรม ค่อนข้างจะเริ่มต้นการเชื่อมต่อแบบอนุกรมที่ 9600 บิตต่อวินาที
ทั้งสองด้านของการเชื่อมต่อแบบอนุกรม (เช่น Arduino และคอมพิวเตอร์ของคุณ) จะต้องตั้งค่าให้ใช้การเชื่อมต่อแบบอนุกรมความเร็วเดียวกันเพื่อให้ได้ข้อมูลที่เข้าใจได้ หากมีความไม่ตรงกันระหว่างสิ่งที่ทั้งสองระบบคิดว่าความเร็วนั้นเป็นข้อมูลที่จะอ่านไม่ออก
9600 บิตต่อวินาทีเป็นค่าเริ่มต้นสำหรับ Arduino และเหมาะอย่างยิ่งสำหรับผู้ใช้ส่วนใหญ่ แต่คุณสามารถเปลี่ยนเป็นความเร็วอื่นได้: Serial.begin(57600)
ตั้งค่า Arduino ให้ส่งที่ 57600 บิตต่อวินาที คุณต้องตั้งค่าซอฟต์แวร์ใด ๆ ที่คุณใช้บนคอมพิวเตอร์ของคุณ (เช่นมอนิเตอร์อนุกรมของ Arduino IDE) ให้มีความเร็วเท่ากันเพื่อดูข้อมูลที่ส่ง
Serial.begin(0)
บอก Arduino ว่าควรสื่อสารกับอนุกรมที่ 0 บิตต่อวินาที อย่างที่คุณคาดหวังนั่นหมายความว่า Arduino จะไม่ส่งข้อมูลใด ๆ เลย Serial.begin(4000)
จะทำให้ Arduino ส่งข้อมูลที่ 4,000 บิตต่อวินาที นี่ไม่ใช่มาตรฐาน แต่อย่างอื่นดี
Serial.begin(300)
) ทำให้ Arduino ส่งข้อมูลได้ช้ากว่า การเพิ่มมันให้พูดถึง 57600 จะส่งข้อมูลได้เร็วขึ้น ทั้งระบบส่งและระบบรับจำเป็นต้องยอมรับความเร็วที่ใช้: โปรแกรมอนุกรมของคอมพิวเตอร์ของคุณเช่นหน้าต่าง Arduino Serial Monitor จะช่วยให้คุณตั้งค่าความเร็วที่คอมพิวเตอร์ของคุณจะรับข้อมูล แต่คุณสามารถเลือกได้จากสิ่งทั่วไป ความเร็ว: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 และ 11520 บิต / วินาที คุณไม่สามารถป้อนความเร็วอื่น ๆ ได้เช่น 4000 ปกติ 9600 ดี
Baud and BPS are two different things... can't find the link I was looking for now.
- ต่อไปนี้เป็นคำอธิบายเดียว: ภาคผนวก C: "baud" กับ "bps"
รูปภาพมีค่า 1,000 คำดังนั้นพวกเขาจึงพูดว่า (1024 คำถ้าคุณทำงานกับคอมพิวเตอร์) ดังนั้นฉันจะโพสต์รูปภาพ ...
ฉันตั้งค่า Uno ของฉันเพื่อส่ง "Fab" ที่ 9600 baud และบันทึกผลลัพธ์ในเครื่องวิเคราะห์ตรรกะ
ชิ้นส่วนที่แรเงาด้วยสีแดงคือช่วงเวลา "ไม่ได้ใช้งาน" ระหว่างไบต์
จากกราฟิคด้านบนที่บรรทัดข้อมูล Tx (ส่ง) ปกติสูง (1) จนกระทั่งมันลดลงต่ำเพื่อระบุจุดเริ่มต้นของอักขระ (ไบต์) นี้เป็นบิตเริ่ม จากนั้นบิตข้อมูล 8 บิต (ระบุโดยจุดสีขาว) จะปรากฏขึ้นที่อัตราการรับส่งข้อมูล (ตัวอย่าง 9600 ตัวอย่างต่อวินาที) หลังจากนั้นเส้นจะถูกนำขึ้นสูงอีกครั้ง นี่คือบิตหยุด (ส่วนสีแดง) จากนั้นเราจะเห็นจุดเริ่มต้นสำหรับตัวละครถัดไปเป็นต้น ส่วน "หยุด" อาจมีความยาวไม่ จำกัด อย่างไรก็ตามต้องมีความยาวอย่างน้อยหนึ่งบิต
รายละเอียดเพิ่มเติมสำหรับอักขระตัวแรก (ตัวอักษร "F" หรือ 0x46 หรือ 0b01000110) สามารถดูได้ที่นี่:
เอ - ไม่มีข้อมูล (Tx สูง)
B - "บิตเริ่มต้น" เส้นถูกนำต่ำเพื่อแจ้งให้ผู้รับทราบว่าอักขระ (ไบต์) กำลังจะเริ่มส่ง ตัวรับสัญญาณจะรอหนึ่งและครึ่งนาฬิกาก่อนที่จะสุ่มตัวอย่างสาย
C - อักขระตัวแรกมาถึง (ตัวอักษร "F" หรือ 0x46 หรือ 0b01000110) ไม่มีบิตนาฬิกาเช่นข้อมูลขาเข้าจะถูกเก็บตัวอย่างที่อัตรา baud (การส่งข้อมูล) ตรงกันข้ามกับการสื่อสาร SPI ข้อมูลจะมาถึงบิตที่มีนัยสำคัญน้อยที่สุดก่อน (ในกรณีที่คุณไม่ได้ส่ง 8 บิตต่อไบต์) ดังนั้นเราเห็น 01100010 (มากกว่า 01000110)
D - บิตหยุด นี่สูงเสมอเพื่อให้แน่ใจว่าเราสามารถแยกแยะระหว่างจุดสิ้นสุดของไบต์นี้และจุดเริ่มต้นของจุดต่อไป เนื่องจากบิตเริ่มต้นเป็นศูนย์และบิตหยุดเป็นบิตจึงมีการเปลี่ยนแปลงที่ชัดเจนจากหนึ่งไบต์ไปยังถัดไป
E - จุดเริ่มต้นสำหรับตัวละครต่อไป
คุณสามารถดูได้จากการวิเคราะห์ตัววิเคราะห์ลอจิกนั่นT1 - T2
คือ 0.1041667 ms และในขณะที่มันเกิดขึ้นที่ 1/9600:
1 / 9600 = 0.00010416666 seconds
ดังนั้นอัตราการ 9600 ช่วยให้คุณมีจำนวนบิตต่อวินาทีและผกผันเป็นช่วงเวลาระหว่างบิต
Comms แบบอนุกรมไม่ได้มีการโอเวอร์คล็อกแบบตัวเอง (ต่างจาก SPI หรือ I2C และอื่น ๆ ) ดังนั้นทั้งผู้ส่งและผู้รับจะต้องยอมรับอัตรานาฬิกา
อัตรานาฬิกาไม่แน่นอนบน Arduino เนื่องจากฮาร์ดแวร์จะต้องแบ่งนาฬิการะบบลงเพื่อรับนาฬิกาอนุกรมและการแบ่งไม่แน่นอนเสมอไป มีข้อผิดพลาดเกือบทุกครั้งจำนวนเงินจะได้รับในแผ่นข้อมูล (ตัวเลขที่ยกมาสำหรับนาฬิการะบบ 16 MHz เช่นบน Uno):
คุณสามารถเปลี่ยนแปลงจำนวนบิตข้อมูลได้โดยไม่ต้องส่ง 8 บิตจริง ๆ แล้วคุณสามารถส่ง 5 ถึง 9 บิต
อาจมีทางเลือกเป็นบิตพาริตีที่ส่งหลังจากบิตข้อมูล
วิธีนี้จะช่วยให้ผู้รับตรวจพบว่าข้อมูลมาถูกต้องหรือไม่
พาริตี้บิตจะถูกส่งก่อนบิตหยุด
ในกรณีของบิตข้อมูล 9 (ตามที่ใช้ในโปรโตคอล SeaTalk) บิตพาริตี้จะถูกนำมาใช้ใหม่เป็นบิตข้อมูลที่ 9 ดังนั้นคุณไม่สามารถมีทั้งบิตข้อมูล 9 บิตและพาริตี้บิตได้
คุณยังสามารถมีสองบิตหยุด นี่เป็นเพียงการยืดเวลาระหว่างไบต์ ใน "สมัยก่อน" นี่คือเพื่อให้อุปกรณ์ไฟฟ้าช้าสามารถประมวลผลไบต์ก่อนหน้า (เช่นเพื่อพิมพ์)
หากคุณเริ่มฟังข้อมูลซีเรียลตรงกลางสตรีมอาจเป็นไปได้ว่าบิต 0 ที่อยู่ตรงกลางของสตรีมจะถูกตีความว่าเป็นบิตเริ่มต้นแล้วตัวรับจะตีความทุกอย่างหลังจากนั้นอย่างไม่ถูกต้อง
วิธีเดียวที่แท้จริงในการกู้คืนจากสิ่งนี้คือการมีช่องว่างขนาดใหญ่พอเป็นครั้งคราว (เช่นยาว 10 บิต) ซึ่งไม่สามารถเกิดขึ้นได้
บิตที่แสดงที่นี่ (ระดับตรรกะ) ไม่ได้กลับด้าน นั่นคือ 1 บิตสูงและ 0 บิตต่ำ หากคุณมีอุปกรณ์ RS232 ที่อาจจะส่งบางอย่างเช่น -12 V สำหรับ 1 บิตและ +12 V สำหรับ 0 บิต นี่คือฤbecauseษีเนื่องจากหนึ่งมีค่าน้อยกว่าศูนย์
หากคุณมีอุปกรณ์ดังกล่าวคุณต้องทำการแปลงแรงดันไฟฟ้าและการผกผันตรรกะ ชิปเช่นMAX232จะทำเพื่อคุณ พวกเขายังสามารถจัดหา -12 V ที่จำเป็นในการขับเคลื่อนอุปกรณ์ดังกล่าวด้วยการสร้างภายในด้วยความช่วยเหลือของตัวเก็บประจุที่ผู้ใช้จัดหาไม่กี่
ตั้งแต่ที่มีบิตเริ่มต้นหนึ่งบิตข้อมูล 8 บิตและหนึ่งบิตหยุดเรามีทั้งหมด 10 บิตเป็นกฎอย่างรวดเร็วของนิ้วหัวแม่มือคุณสามารถคำนวณจำนวนไบต์ที่คุณสามารถส่งในวินาทีโดยแบ่งอัตราบิต 10 .
เช่น. ที่ 9600 BPS คุณสามารถส่ง 960 ไบต์ต่อวินาที
รหัสที่จะทำซ้ำ:
void setup()
{
Serial.begin(9600);
Serial.print("Fab");
}
void loop ()
{
}
; TLDR; มันเริ่มต้นพอร์ตการสื่อสารแบบอนุกรมและตั้งค่าอัตราการส่งข้อมูล อุปกรณ์ที่คุณกำลังสื่อสารด้วย (หรือ Arduino IDE Serial Monitor) จะต้องตั้งค่าเป็นอัตรารับส่งข้อมูลที่ตรงกัน เมื่อคุณเริ่มต้นพอร์ตคุณสามารถเริ่มส่งหรือรับตัวอักษร การอ้างอิงอนุกรม Arduino
มันระบุโปรแกรมที่จะทำงานภายในระบบคอมพิวเตอร์ตัวเลขระบุความเร็ว Serial.print ระบุข้อความที่จะแสดง