2017-02-24 10 views
0

UARTシリアルポートに接続されたストリームで、9600bpsでハーフデュープレックスRS-485プロトコルを使用しています。データ:8ビット、エンベデッドデバイスとのパリティなし。UARTストリームへの読み込み - チャンクされたデータ

私が接続しているシステムでは、バイナリコマンドを2バイトと10バイトの間で20ms間隔で送信することが分かります。

私は以下のフラグでストリームにアクセス:

uart0_filestream = open(COM_UART_DEV, O_RDWR | O_NOCTTY | O_NDELAY); 

しかし、10バイト長のコマンドは自分のアプリケーションでチェックサムエラーの原因となっ半分にチャンクされることが頻繁に起こります。私は20ミリ秒ごとにポーリングする必要があり、私がこれで見つけた唯一の解決策は、私が欲しくない世論調査の間の睡眠時間を短縮することです。

ストリームバッファの内容を読み取る前に送信が完了していることを確認するためのフラグまたはスマートメソッドがありますか?

+0

ハードウェアハンドシェイクの問題? –

+0

@πάνταῥεῖおそらく実際には、私は他のデバイスがあらゆる種類のフロー制御を期待しているとは思わないでしょう。 – Machinegon

+1

最悪のシナリオ(明らかに発生している)は、デバイスが20msごとにメッセージを送信し、プログラムがその送信の途中で20msごとにポーリング/読み取り(** 10ms **または** 50 xmit間隔の%**)。送信者と同期するメカニズムはありません。ポーリング間隔を長くすることは望ましくありません。あなたは投票率を上げる必要があります。 BTWは、読み込みシステムごとに完全なバイナリメッセージパケットを取得することを期待しています。ノンブロッキングモードを使用していますが、VMINとVTIME機能を利用できないという欠点があります。 – sawdust

答えて

0

わかりました。私のニーズに合った解決策を見つけました。 @ストリームが示唆しているように、ストリームの内容を読むときにすべてのデータがそこにあり、私のポーリング間隔を増やしたくないということを私が確かに知ることができないので、私はポーリングレートを増やしました:

unsigned char *pStartBuffer = pRxBuffer; 

    if(uart0_filestream != -1) 
    { 
     int rx_length = 0, rx = 0, elapsed = 0; 
     bool bCommand = false; 
     while(rx_length <= 10)//&& elapsed <= 10) 
     { 
      rx = read(uart0_filestream, (void*)pRxBuffer, length); 
      if(rx > 0) 
      { 
       rx_length += rx; 
       pRxBuffer += rx; 
       if(checksum(pStartBuffer, rx_length) == true) 
       { 
        bCommand = true; 
        break; 
       } 
      } 
      nanosleep(&sleep_rx, NULL); 
      //elapsed+=2; 
     } 

私は最初にpoll rateを8msに増やしました。私が受け取ることができる最も長いコマンドは10バイト長であることを知っているので、チェックサムが有効になるか、または読み込まれた内容が10バイト長であり、投票の間に余分な2msをスリープするまで読み取ります。これは今のところうまくいく。

関連する問題