วิธีล้าง Arduino Serial Buffer

Withi Lang Arduino Serial Buffer



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

Arduino Serial Buffer

ดังนั้นเราทุกคนรู้ว่า Arduino สื่อสารโดยใช้โปรโตคอลการสื่อสารแบบอนุกรมที่เรียกว่า USART ใช่ Arduino มีโปรโตคอลอื่นเช่น SPI, I2C แต่ USART เป็นโปรโตคอลที่ใช้บ่อยที่สุด หากคุณมีความสนใจอ่าน Arduino ทั้งสามโปรโตคอล คลิก ที่นี่ .







บัฟเฟอร์อนุกรม Arduino รวบรวมอักขระอนุกรมที่เข้ามาและเก็บไว้จนกว่าไมโครคอนโทรลเลอร์จะสามารถประมวลผลได้ การสื่อสารแบบอนุกรมเป็นวิธีการถ่ายโอนข้อมูลจากอุปกรณ์เครื่องหนึ่งไปยังอีกเครื่องหนึ่ง Arduino ที่ใช้ฮาร์ดแวร์ USART บนบอร์ดจะประกอบแต่ละ 8 บิตเป็นไบต์ จากนั้นเก็บไบต์เหล่านี้ไว้ในบัฟเฟอร์อนุกรม สูงสุด 64 ไบต์สามารถเก็บไว้ภายในบัฟเฟอร์อนุกรม Arduino



ล้าง Arduino Serial Buffer

บัฟเฟอร์อนุกรมของ Arduino มีหน่วยความจำจำกัดในการจัดเก็บข้อมูลในกรณีที่หน่วยความจำล้นหรือมีข้อมูลจำนวนมากอยู่ที่ขาอนุกรม เราต้องล้างบัฟเฟอร์อนุกรมก่อนเพื่อเก็บข้อมูลขาเข้า มาหาวิธีที่เป็นไปได้ในการล้างบัฟเฟอร์อนุกรม Arduino



วิธีล้าง Arduino Serial Buffer

เพื่อเพิ่มพื้นที่ว่างบัฟเฟอร์อนุกรมเพื่อให้สามารถอัปเดตด้วยข้อมูลใหม่โดยทำตามสองวิธีต่อไปนี้จะเป็นประโยชน์:





    • ล้าง Serial Buffer โดยใช้ Serial.flush() Function
    • ล้าง Serial Buffer โดยใช้ Serial.begin() Function

1: ล้าง Serial Buffer โดยใช้ Serial.flush() Function

ดังนั้น วิธีแรกที่สามารถล้างบัฟเฟอร์อนุกรม Arduino ได้คือการใช้ฟังก์ชัน Serial.flush() ฟังก์ชันนี้เป็นของฟังก์ชันไลบรารีอนุกรม Arduino

Serial.flush()

ฟังก์ชัน Arduino Serial.flush () รอให้ข้อมูลถูกส่งโดยสมบูรณ์ แทนที่จะทิ้งข้อมูลที่เข้ามา จะทำให้รอได้ ดังนั้นเมื่อข้อมูลภายในบัฟเฟอร์ถูกส่งโดยสมบูรณ์แล้ว บัฟเฟอร์อนุกรมสามารถรับข้อมูลใหม่ได้



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

ไวยากรณ์

Serial.flush ( )

พารามิเตอร์

ใช้พารามิเตอร์เดียวเท่านั้น

ซีเรียล: วัตถุพอร์ตอนุกรม

คืนสินค้า

ฟังก์ชันนี้ไม่ส่งคืนสิ่งใด

ตัวอย่างโค้ด

นี่คือรหัสที่เขียนโดยไม่ใช้ฟังก์ชัน Serial.flush():

การตั้งค่าเป็นโมฆะ ( ) {
Serial.begin ( 9600 ) ;
ยาวที่ไม่ได้ลงนาม millis_FlushStart = millis ( ) ; /* เริ่มรหัสโดยบันทึกนาฬิกา Arduino ปัจจุบัน เวลา */
Serial.println ( F ( 'Linuxhint.com/Arduino' ) ) ;
Serial.println ( F ( 'Linuxhint.com/RaspberryPi' ) ) ;
Serial.println ( F ( 'Linuxhint.com/Tutorial' ) ) ;
millis_FlushStop แบบยาวที่ไม่ได้ลงนาม = millis ( ) ; /* หมุนเวียน เวลา ณ จุดนี้ */
Serial.print ( F ( 'ไม่มีฟังก์ชัน Flush ต้องใช้' ) ) ;
Serial.print ( millis_FlushStop - millis_FlushStart ) ; /* พิมพ์ เวลา ถ่ายโดยบัฟเฟอร์อนุกรมเพื่อพิมพ์ข้อมูล */
Serial.println ( F ( 'มิลลิวินาที' ) ) ;
}
วงโมฆะ ( ) {
}


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

เมื่อได้รับเวลาทั้งสองภายในตัวแปรสองตัวแล้ว ความแตกต่างจะให้เวลาที่ Arduino ใช้ในการพิมพ์สามสตริงที่กำหนดไว้ในหน่วยมิลลิวินาที


ในเทอร์มินัลเอาต์พุตจะเห็นว่าใช้เวลา 9 มิลลิวินาทีในการพิมพ์สตริงที่กำหนด


ตอนนี้ในรหัสที่ระบุด้านล่าง เราจะใช้ฟังก์ชัน Serial.flush() ซึ่งจะช่วยให้สตริงทั้งหมดผ่านและรอที่นั่นจนกว่าบัฟเฟอร์อนุกรมจะชัดเจนเพื่อรับข้อมูลถัดไป ดังนั้นจึงต้องใช้เวลาเพิ่มขึ้นเมื่อเทียบกับการพิมพ์ข้อมูลโดยไม่ใช้ Serial.flush()

การตั้งค่าเป็นโมฆะ ( ) {
Serial.begin ( 9600 ) ;
ยาวที่ไม่ได้ลงนาม millis_FlushStart = millis ( ) ; /* เริ่มรหัสโดยบันทึกนาฬิกา Arduino ปัจจุบัน เวลา */
Serial.println ( F ( 'Linuxhint.com/Arduino' ) ) ;
Serial.println ( F ( 'Linuxhint.com/RaspberryPi' ) ) ;
Serial.println ( F ( 'Linuxhint.com/Tutorial' ) ) ;
Serial.flush ( ) ; /* รอ สำหรับ ข้อมูลที่จะส่งหลังจากหน่วยความจำฟลัชนั้น */
millis_FlushStop แบบยาวที่ไม่ได้ลงนาม = millis ( ) ; /* หมุนเวียน เวลา ณ จุดนี้ */
Serial.print ( F ( 'ด้วยฟังก์ชันฟลัช' ) ) ;
Serial.print ( millis_FlushStop - millis_FlushStart ) ; /* พิมพ์ เวลา ถ่ายโดยบัฟเฟอร์อนุกรมเพื่อพิมพ์ข้อมูล */
Serial.println ( F ( 'มิลลิวินาที' ) ) ;
}
วงโมฆะ ( ) {
}


รหัสนี้คล้ายกับที่เราอธิบายไว้ก่อนหน้านี้ ความแตกต่างที่นี่คือฟังก์ชัน Serial.flush() ซึ่งช่วยให้โปรแกรมรอเวลาเพิ่มเติมจนกว่าหน่วยความจำบัฟเฟอร์อนุกรมจะชัดเจนเพื่อรับข้อมูลถัดไป


ในผลลัพธ์ เราจะเห็นได้อย่างชัดเจนว่าคราวนี้จะใช้เวลา 76ms ในการพิมพ์สามสาย เมื่อเทียบกับสตริงก่อนหน้าซึ่งใช้เวลาเพียง 9ms เท่านั้น

2: ล้าง Serial Buffer โดยใช้ Serial.begin() Function

จนถึงตอนนี้ เราได้อธิบายฟังก์ชัน Serial.flush() เพื่อล้างบัฟเฟอร์อนุกรม แต่ฟังก์ชันนี้ต้องรอให้ส่งข้อมูลทั้งหมด ตอนนี้คำถามต่างๆ อยู่ในใจแล้ว หากเราต้องการล้างข้อมูลขาเข้าภายในบัฟเฟอร์อนุกรม คำตอบของคำถามนั้นง่ายมาก เราสามารถทำได้โดยใช้ a ในขณะที่ วนซ้ำด้วยฟังก์ชันไลบรารีอนุกรม

ไวยากรณ์

ในขณะที่ ( Serial.available ( ) )
Serial.read ( ) ;
Serial.end ( ) ;
Serial.begin ( 9600 ) ;

รหัส

วาลสตริง;
การตั้งค่าเป็นโมฆะ ( ) {
}
วงโมฆะ ( ) {
ถ้า ( Serial.available ( ) ) { /* ตรวจสอบ สำหรับ ข้อมูลอนุกรม */
วาล = '' ;
ในขณะที่ ( Serial.available ( ) ) { /* อ่าน ข้อมูลอนุกรม ถ้า มีอยู่ */
char Serial_Data = Serial.read ( ) ;
วาล =val+Serial_Data; /* เก็บข้อมูลไว้ในสตริงใหม่ */
}
Serial.println ( วาล ) ; /* พิมพ์ อ่าน ข้อมูล */
Serial.end ( ) ; /* สิ้นสุดการสื่อสารแบบอนุกรม */
Serial.begin ( 9600 ) ; /* แจ่มใส บัฟเฟอร์อนุกรม */
}
}


Arduino ใช้ฟังก์ชัน Serial.begin() เพื่อเริ่มต้นการสื่อสารแบบอนุกรมโดยกำหนดอัตราบอด เมื่อฟังก์ชันนี้เริ่มต้น ข้อมูลที่จัดเก็บไว้ก่อนหน้านี้ในหน่วยความจำ Arduino จะมีความชัดเจน ที่นี่เราจะตรวจสอบข้อมูลอนุกรมโดยใช้ฟังก์ชัน Serial.available() เมื่ออ่านข้อมูลแล้วจะเก็บไว้ในสตริงใหม่และสุดท้ายโดยใช้ Serial.begin (9600) เราจะล้างบัฟเฟอร์อนุกรม Arduino

บันทึก: เราจำเป็นต้องล้างข้อมูลบัฟเฟอร์ซีเรียล เนื่องจากจะทำให้แน่ใจว่าข้อมูลถูกส่งไปยังอุปกรณ์แล้ว และไม่ต้องรอหรือระงับการส่ง

บทสรุป

เพื่อล้างบัฟเฟอร์อนุกรม Arduino เพื่อให้สามารถเก็บข้อมูลใหม่ภายในหน่วยความจำบัฟเฟอร์ Serial.flush() และ Serial start ได้ สามารถใช้เพื่อล้างบัฟเฟอร์อนุกรม Arduino ได้ แต่เราต้องรอเมื่อข้อมูลทั้งหมดถูกส่งเพื่อหลีกเลี่ยงปัญหานี้ เราสามารถใช้ while loop กับฟังก์ชัน Serial.begin() ซึ่งสามารถล้างข้อมูลขาเข้าจากบัฟเฟอร์อนุกรมได้