余分なハードウェアの追加をスキップして、ビットバンギングのルートに進むことにした場合、これは想像するほど難しくありません。
最初に、通信スレッドはリアルタイムに移行する必要があります。
#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;
}
これからは、スレッドがタイムリーに(、またはを介して)喜んで制御を返さない限り、スレッドは毎秒*から950ミリ秒間先取りされません。850MHz CPUを使用すると、ビットバンギングループは、最速であってもほとんどの時間アイドル状態になります。sched_yield()
usleep()
残念ながら、時々、制御を返すという要件は、「相手」が送信したものが何であれ、スレッドがスリープしている間、永久に失われることを意味します。しかし、そのためにトランスミッションコントロールを使用できます。降伏する前にプルダウンし、制御を復元するときにバックアップするCTS回線にさらにGPIOを割り当てます。
bcm2835_gpio_write(CTS_PIN, LOW);
usleep(10);
bcm2835_gpio_write(CTS_PIN, HIGH);
または(できれば)XON / XOFF伝送制御を使用する-スリープする前にRS232でXOFF文字を送信し、操作を再開した後にXONを送信します。これらのデフォルトのASCIIコードは'\x13'
、XOFF /「送信停止」および'\x11'
XON /「送信再開」用です。
もちろん、リモートデバイスはこれらに従う必要があります。そうでない場合、一部のデータが失われます。