Se decidi di saltare l'aggiunta di hardware aggiuntivo e segui la strada del bit-bang, questo non è così difficile come immaginalo.
Prima di tutto, il tuo thread di comunicazione deve andare in tempo reale:
#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;
}
D'ora in poi, il tuo thread non verrà anticipato per 950ms ogni secondo * , a meno che non restituisca il controllo volontariamente (attraverso sched_yield()
o usleep()
) in modo tempestivo, il che non lo renderà mai prevenuto. Con la CPU a 850 MHz il tuo loop di bit banging resterà inattivo per la maggior parte del tempo anche a velocità più elevate.
Ora, purtroppo, l'obbligo di ripristinare il controllo di volta in volta significa che mentre il tuo thread è inattivo, qualunque cosa invii la tua "parte avversaria", sarebbe perso per sempre. Ma a tale scopo potresti usare il controllo della trasmissione. O alloca un altro po 'di GPIO per la linea CTS che abbassi prima di cedere e esegui il backup al ripristino del controllo:
bcm2835_gpio_write(CTS_PIN, LOW);
usleep(10);
bcm2835_gpio_write(CTS_PIN, HIGH);
oppure (preferibilmente IMHO) utilizzare il controllo di trasmissione XON / XOFF - inviare il carattere XOFF su RS232 prima di dormire, XON dopo aver ripreso l'operazione. I codici ASCII predefiniti per questi sono '\x13'
per XOFF / "stop invio" e '\x11'
per XON / "riprendi invio".
Ovviamente il tuo dispositivo remoto deve obbedire a questi. In caso contrario, alcuni dati andranno persi.