Serial.begin (9600) คืออะไร


คำตอบ:


22

Serial.begin(9600)ไม่ได้พิมพ์อะไรเลย สำหรับสิ่งที่คุณต้องการใช้Serial.print("Hello world!")ในการพิมพ์ข้อความ "Hello world!" ไปยังคอนโซลอนุกรม ค่อนข้างจะเริ่มต้นการเชื่อมต่อแบบอนุกรมที่ 9600 บิตต่อวินาที

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

9600 บิตต่อวินาทีเป็นค่าเริ่มต้นสำหรับ Arduino และเหมาะอย่างยิ่งสำหรับผู้ใช้ส่วนใหญ่ แต่คุณสามารถเปลี่ยนเป็นความเร็วอื่นได้: Serial.begin(57600)ตั้งค่า Arduino ให้ส่งที่ 57600 บิตต่อวินาที คุณต้องตั้งค่าซอฟต์แวร์ใด ๆ ที่คุณใช้บนคอมพิวเตอร์ของคุณ (เช่นมอนิเตอร์อนุกรมของ Arduino IDE) ให้มีความเร็วเท่ากันเพื่อดูข้อมูลที่ส่ง


2
Baud และ BPS เป็นสองสิ่งที่ต่างกัน ... ไม่สามารถหาลิงค์ที่ฉันต้องการได้ในตอนนี้
เพนกวินที่ไม่ระบุชื่อ

ถ้าฉันใส่ "Serial.begin (0);" หรือ "Serial.begin (4000);" ฉันหมายถึงฉันต้องการทราบความแตกต่างระหว่างตัวเลขคืออะไร?
shajib0o

3
Serial.begin ใช้เพื่อตั้งค่าความเร็วในการสื่อสารเป็นบิตต่อวินาที หนึ่งไบต์เท่ากับ 8 บิต แต่การเชื่อมต่อแบบอนุกรมจะส่งบิตเริ่มต้นและหยุดเพื่อระบุจุดเริ่มต้นและจุดสิ้นสุดไปยังไบต์เฉพาะไปยังระบบที่รับ ดังนั้นจำเป็นต้องใช้ 10 บิตในการส่งอักขระหนึ่งตัว การใช้Serial.begin(0)บอก Arduino ว่าควรสื่อสารกับอนุกรมที่ 0 บิตต่อวินาที อย่างที่คุณคาดหวังนั่นหมายความว่า Arduino จะไม่ส่งข้อมูลใด ๆ เลย Serial.begin(4000)จะทำให้ Arduino ส่งข้อมูลที่ 4,000 บิตต่อวินาที นี่ไม่ใช่มาตรฐาน แต่อย่างอื่นดี
heypete

2
กล่าวโดยย่อ: การเปลี่ยนหมายเลขจะเป็นการเปลี่ยนความเร็ว ทำให้จำนวนที่เล็กลง (เช่นSerial.begin(300)) ทำให้ Arduino ส่งข้อมูลได้ช้ากว่า การเพิ่มมันให้พูดถึง 57600 จะส่งข้อมูลได้เร็วขึ้น ทั้งระบบส่งและระบบรับจำเป็นต้องยอมรับความเร็วที่ใช้: โปรแกรมอนุกรมของคอมพิวเตอร์ของคุณเช่นหน้าต่าง Arduino Serial Monitor จะช่วยให้คุณตั้งค่าความเร็วที่คอมพิวเตอร์ของคุณจะรับข้อมูล แต่คุณสามารถเลือกได้จากสิ่งทั่วไป ความเร็ว: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 และ 11520 บิต / วินาที คุณไม่สามารถป้อนความเร็วอื่น ๆ ได้เช่น 4000 ปกติ 9600 ดี
heypete

Baud and BPS are two different things... can't find the link I was looking for now.- ต่อไปนี้เป็นคำอธิบายเดียว: ภาคผนวก C: "baud" กับ "bps"
Nick Gammon

21

รูปภาพมีค่า 1,000 คำดังนั้นพวกเขาจึงพูดว่า (1024 คำถ้าคุณทำงานกับคอมพิวเตอร์) ดังนั้นฉันจะโพสต์รูปภาพ ...

ฉันตั้งค่า Uno ของฉันเพื่อส่ง "Fab" ที่ 9600 baud และบันทึกผลลัพธ์ในเครื่องวิเคราะห์ตรรกะ

Comms แบบอนุกรม - 3 ตัวอักษร

ชิ้นส่วนที่แรเงาด้วยสีแดงคือช่วงเวลา "ไม่ได้ใช้งาน" ระหว่างไบต์

จากกราฟิคด้านบนที่บรรทัดข้อมูล Tx (ส่ง) ปกติสูง (1) จนกระทั่งมันลดลงต่ำเพื่อระบุจุดเริ่มต้นของอักขระ (ไบต์) นี้เป็นบิตเริ่ม จากนั้นบิตข้อมูล 8 บิต (ระบุโดยจุดสีขาว) จะปรากฏขึ้นที่อัตราการรับส่งข้อมูล (ตัวอย่าง 9600 ตัวอย่างต่อวินาที) หลังจากนั้นเส้นจะถูกนำขึ้นสูงอีกครั้ง นี่คือบิตหยุด (ส่วนสีแดง) จากนั้นเราจะเห็นจุดเริ่มต้นสำหรับตัวละครถัดไปเป็นต้น ส่วน "หยุด" อาจมีความยาวไม่ จำกัด อย่างไรก็ตามต้องมีความยาวอย่างน้อยหนึ่งบิต


รายละเอียดเพิ่มเติมสำหรับอักขระตัวแรก (ตัวอักษร "F" หรือ 0x46 หรือ 0b01000110) สามารถดูได้ที่นี่:

Comms แบบอนุกรม - ไบต์เดียว

  • เอ - ไม่มีข้อมูล (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 บิต

  • อาจมีทางเลือกเป็นบิตพาริตีที่ส่งหลังจากบิตข้อมูล

    • หากคุณระบุพาริตี "คี่" บิตพาริตีจะถูกตั้งค่าในลักษณะที่จำนวนรวมของ 1 บิตจะคี่
    • หากคุณระบุพาริตี "คู่" บิตพาริตีจะถูกตั้งค่าในลักษณะที่จำนวนรวมของ 1 บิตจะเท่ากัน
    • หากคุณระบุว่าไม่มีพาริตีบิตพาริตี้จะถูกข้าม

    วิธีนี้จะช่วยให้ผู้รับตรวจพบว่าข้อมูลมาถูกต้องหรือไม่

  • พาริตี้บิตจะถูกส่งก่อนบิตหยุด

  • ในกรณีของบิตข้อมูล 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 ()
  {
  }

1

; TLDR; มันเริ่มต้นพอร์ตการสื่อสารแบบอนุกรมและตั้งค่าอัตราการส่งข้อมูล อุปกรณ์ที่คุณกำลังสื่อสารด้วย (หรือ Arduino IDE Serial Monitor) จะต้องตั้งค่าเป็นอัตรารับส่งข้อมูลที่ตรงกัน เมื่อคุณเริ่มต้นพอร์ตคุณสามารถเริ่มส่งหรือรับตัวอักษร การอ้างอิงอนุกรม Arduino


ที่จะไม่ลดหรือดูหมิ่นความคุ้มครองที่ยอดเยี่ยมของ @ Nick-Gammon ของหัวข้อนี้
linhartr22

-3

มันระบุโปรแกรมที่จะทำงานภายในระบบคอมพิวเตอร์ตัวเลขระบุความเร็ว Serial.print ระบุข้อความที่จะแสดง


3
สิ่งนี้เพิ่มอะไรมากกว่าคำตอบที่ยอมรับในปัจจุบัน
Ignacio Vazquez-Abrams

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