Si vous décidez de ne pas ajouter de matériel supplémentaire et de suivre la voie du bit banging, ce n'est pas aussi difficile que certains l'imaginent.
Tout d'abord, votre fil de communication doit passer en temps réel:
#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;
}
À partir de maintenant, votre thread ne sera pas préempté pendant 950 ms sur chaque seconde * , à moins qu'il ne retourne volontairement le contrôle (via sched_yield()
ou usleep()
) en temps opportun, ce qui ne le rendra jamais préempté. Avec un processeur à 850 MHz, votre boucle de frappe sera inactive la plupart du temps, même à des vitesses plus rapides.
Désormais, malheureusement, l'obligation de rendre le contrôle de temps en temps signifie que votre fil est en veille, quoi que vous envoie votre «partie adverse», serait définitivement perdue. Mais à cette fin, vous pouvez utiliser le contrôle de transmission. Soit allouez un peu plus de GPIO pour la ligne CTS que vous tirez vers le bas avant de céder et sauvegardez lors de la restauration du contrôle:
bcm2835_gpio_write(CTS_PIN, LOW);
usleep(10);
bcm2835_gpio_write(CTS_PIN, HIGH);
ou (à mon humble avis de préférence) utilisez le contrôle de transmission XON / XOFF - envoyez le caractère XOFF sur RS232 avant de dormir, XON après avoir repris l'opération. Les codes ASCII par défaut pour ceux-ci sont '\x13'
pour XOFF / "arrêter l'envoi" et '\x11'
pour XON / "reprendre l'envoi".
Bien sûr, votre appareil distant doit respecter ces conditions. Si ce n'est pas le cas, certaines données seront perdues.