0

みんな。

PIC18F452 マイクロコントローラーを使用しています。UART でデータを受信し、追加の同期ワードを付けてフレーム化し、送信します。同期ワードを順番に送信する際に問題が発生します。私が欲しいのは、データと一緒に EA 09 C3 と言う言葉を送ることです。これで、次のコードが MikroC で記述されました。

int j=0;
SPBRG = 129;
TXSTA = 0b00100110;
RCSTA = 0b10010000;
while(1)
{
   if(j == 0)
   {
     TXREG = 0xEA;
   }
   else if(j == 1)
   {
     TXREG = 0x09;
   }
   else if(j == 2)
   {
     TXREG = 0xC3;
   }
   else
   {
    TXREG = RCREG;
   }
   while(!TRMT); // wait for whole data frame to be ready for transmission
  if(j == 100)
     j = 0; // reset j after 100 bytes
  else
     j++;
   }

ここで何が起こるかというと、同期ワードが送信されますが、順序が狂っており、バイトの重複も発生することがあります。私が望むのは、j は 1 バイトが送信された後にのみインクリメントする必要があるということです。ここでは、j は送信とは無関係にインクリメントすると思います。

期待して感謝します。

よろしく、ハッサン

4

1 に答える 1

0

uart 送信の隠れたルールは次のとおりです。

_ _送信する各バイトの間に少し遅延を入れます_ _

これはボーレートに依存しない秘密であることに注意してください;)。

たとえば、50 マイクロ秒です。

送信者と受信者は非同期で動作しているため、受信中にバイトごとに同期するのに多大な労力を費やし、それらを詰め込み続けます...それらは単に失速します。バイトをドロップすることもあれば、受信レジスタをクリアせずにドロップしてバイトを複製することもあります。

したがって、速度が重要な場合は、最初に 1 バイトあたり 50 ミリ秒以上の送信遅延を与えてから、それが機能する場合は、たとえば 10 マイクロ秒まで下げます。再び失速し始めるまでそれを狭め続け、できればフェイルセーフのために遅延をその制限の 2 倍に設定します。

急いでいないか、スピードに飢えているわけではありません。それ以外の場合は、usart ではない別の通信チャネルを使用してください。

于 2013-04-19T22:05:41.527 に答える