หากคุณตัดสินใจที่จะข้ามการเพิ่มฮาร์ดแวร์พิเศษและเพียงไปเส้นทางบิตการต่อสู้นี่ไม่ใช่เรื่องยากเหมือนภาพ
ก่อนอื่นเธรดการสื่อสารของคุณต้องไปตามเวลาจริง:
#include<sched.h>
struct sched_param param;
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, ¶m ) == -1 )
{
perror("sched_setscheduler");
return -1;
}
จากนี้ไปเธรดของคุณจะไม่ถูกล้างออกล่วงหน้าเป็นเวลา 950ms จากทุกวินาที*ยกเว้นว่ามันจะกลับมาควบคุมอย่างเต็มใจ (ผ่านsched_yield()
หรือusleep()
) ในเวลาที่เหมาะสมซึ่งจะไม่ทำให้มันถูก pre-empted มาก่อน ด้วย CPU 850MHz การวนซ้ำของบิตการแข่งขันจะไม่ได้ใช้งานเป็นส่วนใหญ่แม้จะใช้ความเร็วสูงสุดก็ตาม
ตอนนี้น่าเสียดายที่ความต้องการที่จะกลับมาควบคุมเป็นครั้งคราวหมายความว่าในขณะที่เธรดของคุณกำลังหลับอะไรก็ตามที่ "ฝ่ายตรงข้ามส่ง" ของคุณจะหายไปตลอดกาล แต่สำหรับจุดประสงค์นั้นคุณสามารถใช้การควบคุมการส่งสัญญาณได้ จัดสรร GPIO สำหรับ CTS บรรทัดที่คุณดึงลงก่อนที่จะให้ผลตอบแทนและสำรองตามการควบคุมการกู้คืน:
bcm2835_gpio_write(CTS_PIN, LOW);
usleep(10);
bcm2835_gpio_write(CTS_PIN, HIGH);
หรือ (ควรใช้ IMHO มากกว่า) ใช้การควบคุมการส่ง XON / XOFF - ส่งอักขระ XOFF ไปที่ RS232 ก่อนนอน XON หลังจากคุณดำเนินการต่อ รหัส ASCII เริ่มต้นสำหรับสิ่งเหล่านี้'\x13'
สำหรับ XOFF / "หยุดส่ง" และ'\x11'
สำหรับ XON / "ส่งต่อ"
แน่นอนอุปกรณ์ระยะไกลของคุณจะต้องเชื่อฟังสิ่งเหล่านี้ หากไม่เป็นเช่นนั้นข้อมูลบางส่วนจะสูญหาย