Se você decidir pular a adição de hardware extra e apenas seguir a rota dos bits, isso não é tão difícil quanto alguns imaginam.
Primeiro, seu segmento de comunicação deve ir em tempo real:
#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;
}
A partir de agora, seu encadeamento não será impedido por 950ms a cada segundo * , a menos que retorne o controle voluntariamente (por meio de sched_yield()
ou usleep()
) oportunamente, o que nunca o tornará impedido. Com CPU de 850 MHz, seu loop de vibração de bits fica ocioso a maior parte do tempo, mesmo em velocidades mais rápidas.
Agora, infelizmente, o requisito de retornar o controle de tempos em tempos significa que, enquanto seu thread estiver inativo, o que quer que sua "parte contrária" envie, estaria perdido para sempre. Mas, para esse propósito, você pode usar o controle de transmissão. Aloque um pouco mais da linha GPIO para CTS que você puxa para baixo antes de render e faz backup após restaurar o controle:
bcm2835_gpio_write(CTS_PIN, LOW);
usleep(10);
bcm2835_gpio_write(CTS_PIN, HIGH);
ou (IMHO de preferência) use o controle de transmissão XON / XOFF - envie o caractere XOFF pelo RS232 antes de dormir, XON depois de retomar a operação. Os códigos ASCII padrão para estes são '\x13'
para XOFF / "parar de enviar" e '\x11'
para XON / "continuar enviando".
Obviamente, seu dispositivo remoto deve obedecer a eles. Caso contrário, alguns dados serão perdidos.