การสื่อสารแบบอนุกรมพร้อมการประมวลผล

การสื่อสารแบบอนุกรมพร้อมการประมวลผล

การสื่อสารแบบอนุกรมพร้อมการประมวลผล

คลาสอนุกรม

การดำเนินการเพื่อใช้การสื่อสารแบบอนุกรมค่ะ การประมวลผล ถูกกำหนดไว้ในชั้นเรียน Serial. การดำเนินการครั้งแรกเพื่อใช้งานในโปรแกรม (ร่าง) จะต้องรวมเข้ากับโค้ดด้วย import processing.serial.*;.

สารบัญ

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

    พารามิเตอร์อีกห้าตัวที่สามารถส่งผ่านไปยังตัวสร้างได้คือ 1 ความเร็ว 2 ชื่อของพอร์ตอนุกรม 3 ความเท่าเทียมกัน ที่ใช้ในโปรโตคอล ④ บิตข้อมูล และ ⑤ บิตหยุด พารามิเตอร์ที่ส่งผ่านบ่อยที่สุด นอกเหนือจากออบเจ็กต์พาเรนต์ที่ต้องการแล้ว คือชื่อพอร์ตและความเร็ว

    La ความเร็วการสื่อสารแบบอนุกรม เป็นจำนวนเต็ม (int) ว่า ค่าเริ่มต้นเป็นค่า 9600 หากพารามิเตอร์นี้ไม่ถูกส่งผ่านไปยังตัวสร้าง

    พอร์ตอนุกรมที่มีอยู่ วิธีการรายการ

    El ชื่อพอร์ต มีรูปแบบที่ระบบกำหนดไว้ดังนี้ เช่น ลีนุกซ์ดิสทริบิวชัน มันจะเป็นอะไรแบบนั้น /dev/ttyS4 / dev / ttyACM3 o /dev/ttyUSB1 (ขึ้นอยู่กับประเภทพอร์ต) ในขณะที่บน Windows จะเป็นดังนี้ COM12. เว้นแต่ว่าพอร์ตจะเชื่อมโยงทางกายภาพกับอุปกรณ์ โดยปกติโปรแกรมจะไม่ทราบว่าจะใช้พอร์ตใด วิธีทั่วไปในการเลือกพอร์ตคือการรับรายการพอร์ตที่มีอยู่ แสดงให้ผู้ใช้เห็น และอนุญาตให้พวกเขาเลือกพอร์ตที่ต้องการใช้ วิธีการ Serial.list() ส่งกลับเวกเตอร์ของสตริงข้อความ (String) พร้อมด้วยชื่อของพอร์ตที่มีอยู่ในระบบ

    พอร์ตที่ใช้เป็นค่าเริ่มต้นโดยไลบรารี Serial เป็นคนแรกที่ส่งคืนโดยวิธีการ list (แน่นอน COM1 บน Windows หรือ /dev/ttyS0 en GNU / Linux). ยกเว้นในบริบทที่จำกัดมากซึ่งฮาร์ดแวร์ที่กำลังทำงานด้วยเป็นที่รู้จักอย่างเคร่งครัด (เช่น ระบบในโหมดคีออสก์) โดยปกติจะไม่ละเว้นและพอร์ตปลายทางจะถูกระบุอย่างชัดแจ้ง

    กำลังประมวลผลพอร์ตรายการอนุกรม Linux อนุกรม ttyACM ttyS ttyUSB

    ภาพหน้าจอด้านบนแสดงผลลัพธ์ของระบบ GNU / Linux ซึ่งมีพอร์ตอนุกรมสี่พอร์ต RS-232 (ttyS0 a ttyS3) และอะแดปเตอร์ห้าตัวสองประเภท (ttyACM0 a ttyACM1 y ttyUSB0 a ttyUSB2).

    สิทธิ์อนุญาตอุปกรณ์อนุกรม Linux ttyACM ttyS ttyUSB

    ในการเข้าถึงพอร์ตอนุกรม ผู้ใช้จะต้องอยู่ในกลุ่มที่ระบบกำหนดไว้ตามปกติ TTY o Dialout. ในภาพหน้าจอด้านบนคุณจะเห็นว่ามีรายการพอร์ตอนุกรมด้วย ls /dev/tty[ASU]* -la pertenecen อัล grupo Dialout ซึ่งมีสิทธิ์การเข้าถึงแบบอ่านและเขียน

    พารามิเตอร์โปรโตคอลแบบอนุกรม

    La ความเท่าเทียมกัน ของการสื่อสารแบบอนุกรม ถูกแสดงใน การประมวลผล เป็นตัวละคร (char) ซึ่งสามารถรับค่าได้: ① N (ไม่มี) เพื่อไม่ให้ตรวจพบ ความเท่าเทียมกัน, ② E (แม้) เพื่อแสดงว่า ความเท่าเทียมกันบิต คือคู่, 3 O (คี่) เพื่อแสดงว่า ความเท่าเทียมกันบิต เป็นเลขคี่ ④ M (เครื่องหมาย) เพื่อทำให้ ความเท่าเทียมกันบิต และ ⑤ S (ช่องว่าง) เพื่อสร้างสิ่งหนึ่งเสมอ ความเท่าเทียมกันบิต. ค่าเริ่มต้น หากไม่ส่งผ่านไปยังตัวสร้างเป็นพารามิเตอร์ จะเป็นดังนี้ N (ปราศจาก ความเท่าเทียมกัน).

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

    สุดท้าย พารามิเตอร์ที่เป็นไปได้ตัวที่ห้าระบุระยะเวลาของเครื่องหมายสุดท้าย ซึ่งแสดงเป็น หยุดบิต (หยุดบิต) ซึ่งระบุเป็นตัวเลขที่แสดงอยู่ใน จุดลอยตัว (float) ซึ่งสามารถรับค่าได้ 1.0 (ค่าเริ่มต้นหากพารามิเตอร์ไม่ถูกส่งผ่านไปยังตัวสร้าง) 1.5หรือ 2.0.

    ตัวสร้างคลาส Serial

    รายการต่อไปนี้แสดงชุดค่าผสมต่างๆ ของพารามิเตอร์ที่สามารถส่งผ่านไปยังตัวสร้างคลาสได้ Serial:

    • Serial(padre)
    • Serial(padre,puerto)
    • Serial(padre,velocidad)
    • Serial(padre,puerto,velocidad)
    • Serial(padre,puerto,velocidad,paridad,bits_datos,bits_parada)
    สิ้นสุดการสื่อสารแบบอนุกรม วิธีการหยุด.

    เพื่อปล่อยพอร์ตอนุกรม ซึ่งกำหนดไว้เมื่อสร้างอินสแตนซ์ Serialและแอปพลิเคชันระบบอื่นสามารถใช้งานได้ การสื่อสารจะสิ้นสุดลงด้วยวิธีดังกล่าว stopซึ่งไม่ได้รับพารามิเตอร์

    ส่งข้อมูลผ่านพอร์ตอนุกรม write.method

    ในการส่งข้อมูลชั้นเรียน Serial de การประมวลผล รวมวิธีการ write โดยที่ 1 สตริงข้อความสามารถส่งได้ (String), ไบต์ 2 หรือ 3 ไบต์เวกเตอร์ (byte[]). เป็นเรื่องที่น่าสนใจที่จะจำไว้ว่า byte en การประมวลผล (ตอน ชวา) แทนจำนวนเต็มระหว่าง -128 ถึง 127 และตามค่าเริ่มต้น สตริงจะใช้การเข้ารหัส ยูทีเอฟ-16.

    อ่านข้อมูลจากพอร์ตอนุกรม

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

    จำนวนข้อมูลที่มีอยู่ในบัฟเฟอร์ วิธีการที่มีอยู่

    เพื่อทราบว่าข้อมูลมาถึงแล้วหรือไม่ กันชน ซีรีส์วิธีการ available ส่งคืนจำนวนไบต์ที่เก็บไว้ในนี้ กันชน. ไม่ว่าในกรณีใด การดำเนินการอ่านสามารถส่งคืนค่าพิเศษ (เช่น -1 o null) เมื่อพยายามโหลดข้อมูลจาก กันชน ซีรีส์เมื่อว่างเปล่า

    โหลดทีละไบต์ วิธีการอ่าน

    วิธีการหลักของชั้นเรียน Serial ที่ทำหน้าที่อ่านข้อมูลที่ได้รับจากพอร์ตอนุกรมนั้นเป็นข้อมูลประเภท " read» ซึ่งแตกต่างกันโดยหลักๆ ตามประเภทของข้อมูลที่ส่งข้อมูลที่ได้รับ

    read ใช้ในการส่งไบต์ที่ได้รับจากพอร์ตอนุกรมเป็นค่าระหว่าง 0 ถึง 255 เป็นชนิดข้อมูล byte de การประมวลผล แสดงถึงช่วงระหว่าง -128 ถึง 127 และไม่ใช่ระหว่าง 0 ถึง 255 จำเป็นต้องใช้ int เพื่อแสดงถึงช่วงที่ส่งกลับโดย read. หากลองอ่านดูด้วย read และ y กันชน สตริงว่างเปล่า ส่งกลับค่า -1

    อ่านอักขระจากพอร์ตอนุกรม วิธีการ readChar

    วิธีการ readChar คล้ายกับ read แต่จะส่งกลับค่าในรูปแบบ char แทนที่จะเป็น int. เช่นเดียวกับภายใน char en การประมวลผล (ตอน ชวา) จะถูกจัดเก็บไว้ 2 ไบต์ ซึ่งเป็นค่าที่เลือกให้ส่งคืนเมื่ออ่านด้วย readChar หนึ่ง กันชน ซีรีย์ว่างคือ 0xFFFF o -1.

    โหลดสตริงข้อความ วิธีการ readString และ readStringUntil

    วิธีการ readString ส่งคืนวัตถุ String เกิดขึ้นจากข้อมูลทั้งหมดที่มีอยู่ใน กันชน ซีรีส์ในขณะที่ให้คำปรึกษา

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

    หากเป็นเรื่องเกี่ยวกับการอ่าน กันชน ซีรีย์ด้วย readString เมื่อว่างเปล่าค่าที่ส่งคืนจะเป็น null.

    วิธีการ readStringUntil เพิ่ม readString ความสามารถในการส่งคืนข้อมูลที่โหลดลงใน กันชน ซีรีส์แยกด้วยอักขระพิเศษ (รหัส) ที่ถูกส่งเป็นพารามิเตอร์ วิธีการอ่านข้อมูลที่ได้รับนี้ช่วยให้เราสามารถแยกแยะทั้งตัวคั่นและตัวยุติที่ช่วยตีความข้อมูลที่ได้รับ

    วิธีการ readStringUntil นำกลับมา null เมื่ออยู่ใน กันชน series ไม่พบรหัสที่ระบุในอาร์กิวเมนต์ที่ส่งผ่านไป (หนึ่งไบต์)

    ในรหัสต่อไปนี้สำหรับ แพลตฟอร์มฮาร์ดแวร์ ส่งข้อความสามข้อความผ่านพอร์ตอนุกรม สองรายการแรกสิ้นสุดในแท็บ ดังนั้นรายการเหล่านั้นจะปรากฏในคอนโซล การประมวลผลในขณะที่อันที่สามแม้จะถูกส่งผ่านพอร์ตอนุกรม แต่ก็ไม่สามารถอ่านได้ readStringUntil(9) เนื่องจากไม่ได้ลงท้ายด้วยแท็บ (พร้อมโค้ด ASCII 9)

    กำลังประมวลผล Serial.readStringUntil อ่านสตริงอนุกรม

    อ่านบล็อคข้อมูล วิธีการ readBytes และ readBytesUntil

    วิธีการที่เห็นข้างต้นใช้ในการอ่านข้อมูลด้วยรูปแบบเฉพาะ เพื่ออ่านบล็อคข้อมูลดิบ หรือด้วยรูปแบบที่ไม่ได้ระบุไว้ใน การประมวลผล มีการใช้วิธีการต่างๆ readBytes y readBytesUntil

    วิธีการ readBytes ลองอ่านข้อมูลที่มีอยู่ใน กันชน ชุด. หากไม่มีการส่งพารามิเตอร์ไปยังเมธอด readBytes ข้อมูลที่มีอยู่ทั้งหมดจะถูกอ่านและส่งกลับในรูปแบบเวกเตอร์ (byte[]). หากส่งจำนวนเต็มเป็นพารามิเตอร์ ระบบจะอ่านจำนวนไบต์สูงสุดที่ระบุด้วยตัวเลขนี้และส่งคืนเป็นเวกเตอร์ด้วย

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

    วิธีการ readBytesUntil ทำงานในลักษณะเดียวกัน แต่รวมพารามิเตอร์แรกที่แสดงถึงค่าของไบต์ที่หากพบใน กันชนจะแสดงการสิ้นสุดของการอ่าน ในวิธีนี้ พารามิเตอร์ที่กำหนดจำนวนไบต์สูงสุดที่จะอ่านไม่สมเหตุสมผล เนื่องจากจำนวนจะถูกกำหนดโดยโค้ดพิเศษ

    เพื่อทดสอบการทำงานของวิธีการ readBytes สมมติว่ารหัสต่อไปนี้สำหรับ แพลตฟอร์มฮาร์ดแวร์ ซึ่งส่งข้อความผ่านพอร์ตอนุกรม

    ตัวอย่างโปรแกรมต่อไปนี้สำหรับ การประมวลผล อ่านข้อความจากพอร์ตอนุกรมในบล็อกขนาด 32 ไบต์ (TOTAL_BYTES). เพื่อตรวจสอบว่าใช้งานได้ ระบบจะแสดงผ่านคอนโซลเป็นอักขระ โดยบังคับประเภทไบต์ที่ได้รับ char.

    ในภาพหน้าจอต่อไปนี้ คุณสามารถดูวิธีการแสดงภาพเหล่านั้นในคอนโซล การประมวลผล ข้อมูลที่ถูกโหลดเป็นบล็อกขนาด (สูงสุด) 32 ไบต์ (TOTAL_BYTES) ทุกเวลา. แต่มีปัญหาที่คุยกันไปแล้วคือ แพลตฟอร์มฮาร์ดแวร์ ได้ส่งโองการของ ลอร์กา Federico García ของตัวอย่างที่เข้ารหัสเป็นข้อความในรูปแบบ UTF-8ซึ่งไม่ใช่อันที่ใช้ การประมวลผล (ชวา) คุณชอบอะไร ยูทีเอฟ-16 ดังนั้นผู้ที่ไม่ตรงกับยศ ASCII พิมพ์ได้ถูกตีความไม่ถูกต้อง

    กำลังประมวลผล Serial.readBytes UTF-16

    เพื่อแก้ปัญหานี้ คุณสามารถโหลดชุดอักขระได้ (ชุดอักขระ) และกำหนดวัตถุใหม่ String บังคับให้แสดงด้วยการเข้ารหัส UTF-8 ดังแสดงในโค้ดตัวอย่างต่อไปนี้

    กำลังประมวลผล Serial.readBytes UTF-8

    อ่านข้อมูลล่าสุดที่ได้รับ วิธีการสุดท้ายและครั้งสุดท้ายChar

    ในขณะที่วิธีการอ่านที่เหลือ (ประเภท " read») พวกเขาโหลดข้อมูลของ กันชน ซีรีส์ในลำดับเดียวกันกับที่มาถึง (FIFO) ด้วยสองวิธีนี้ ไบต์สุดท้ายที่มาถึง กันชน ชุด. วิธีการ last ส่งกลับค่าของไบต์สุดท้ายเป็น a int y lastChar ส่งคืนค่าเป็น a char.

    การจัดการบัฟเฟอร์แบบอนุกรม

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

    อ่านพอร์ตอนุกรมเมื่อได้รับข้อมูล เหตุการณ์ซีเรียล

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

    ปรับขนาดบัฟเฟอร์อนุกรม วิธีการบัฟเฟอร์

    หากคุณทราบจำนวนไบต์ที่ประกอบเป็นบล็อกข้อมูลที่เป็นประโยชน์ คุณสามารถปรับรูปแบบการอ่านข้อมูลนี้ให้เหมาะสมยิ่งขึ้นได้ กันชน ซีรีส์ผ่าน serialEvent. วิธีการ buffer ช่วยให้คุณสามารถกำหนดจำนวนไบต์ที่จะเก็บไว้ใน กันชน ก่อนเปิดตัวกิจกรรมซีเรียล วิธีการคาดว่าพารามิเตอร์จะเป็นจำนวนเต็มที่แสดงถึงจำนวนไบต์

    เติมบัฟเฟอร์จนกว่าจะได้รับค่า วิธีการbufferUntil

    แทนที่จะตั้งค่าการเรียกเมธอด serialEvent สำหรับปริมาณข้อมูลใน กันชนด้วยวิธีการ bufferUntil คุณสามารถกำหนดค่าให้จัดเก็บข้อมูลได้จนกว่าค่าพิเศษจะมาถึง จากนั้นจึงเพิ่มเหตุการณ์ Serial พารามิเตอร์ที่ส่งไปยังวิธีนี้คือ a int ซึ่งแสดงถึงมูลค่าที่เกิดจากการโทรไปยัง serialEvent.

    ลบข้อมูลที่เก็บไว้ในบัฟเฟอร์ วิธีการที่ชัดเจน

    ด้วยวิธีการ clear คุณสามารถลบข้อมูลที่มีอยู่ในปัจจุบันได้ กันชน. สามารถใช้วิธีนี้ได้ เช่น เพื่อเริ่มเซสชันการรับข้อมูลใหม่โดยไม่สนใจข้อมูลที่เหลืออยู่จากเซสชันก่อนหน้า

    แอปพลิเคชันการประมวลผลทั่วไปสำหรับการอ่านข้อมูลผ่านพอร์ตอนุกรม

    ท้ายที่สุด จะสะดวกในการสรุปการทำงานของวัตถุอีกครั้ง Serial de การประมวลผล ที่ใช้กันทั่วไปมากขึ้น โดยดูตัวอย่างทั่วไปของการรับข้อมูลผ่านพอร์ตอนุกรมเพื่อวาดกราฟด้วย ในกรณีนี้คือพื้นที่ซ้อนกัน

    นำเข้าไลบรารีอนุกรม

    กำหนดโปรโตคอลข้อมูล (ตัวคั่น)

    กำหนดวัตถุของคลาสอนุกรม

    สร้างอินสแตนซ์ของวัตถุคลาส Serial โดยการตั้งค่าพอร์ตอนุกรมที่ใช้

    กำหนดค่าบัฟเฟอร์พอร์ตอนุกรม

    ใช้ตัวจัดการสำหรับเหตุการณ์อนุกรม

    อ่านบัฟเฟอร์อนุกรม

    กำหนดเงื่อนไขข้อมูลที่ได้รับ

    สิ้นสุดการสื่อสารแบบอนุกรม

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

    กราฟิกพร้อมการประมวลผลด้วยข้อมูลที่ได้รับผ่านพอร์ตอนุกรม

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

    แสดงความคิดเห็น

    คุณอาจจะพลาด