2017-01-13 21 views
0

でUART経由でリクエストを送信し、応答を受け取る際の問題現在、UART経由でAtmel SAML21 Xplained Proボードに接続されたセンサーデバイスにリクエスト文字列を送信するシステムを開発中です。私はArduinoボードを「センサーデバイス」としてテストしていますが、最終的には、Rotronic HC-2センサー用です。Atmel SAM L21 Xplained Pro

プロセスはこのようなものになる:

MCU sends string { 99RDD} over UART to sensor 
-> delay of up to 500ms 
-> Response string of 99 bytes sent back via UART 
-> Response transmitted to virtual com port on embedded debugger 

を私の問題は、何らかの理由で、私はどちらか送り返さ何も届かない、またはそれは私が

を変数request_msgを送り返すということですセンサーからの応答は99バイトのASCIIでなければならないことを知っています。実際のセンサーとArduinoテストボードの両方をシリアルコネクタでテストして、読み取り値が正しく戻ってくることを確認しました。

このソフトウェアはAtmel ASF v4.0を使用していますが、これはうまく動作しますが、ドキュメントはかなりばかげているので、コードでどこが間違っているのか、 。

私は私のメインのアプリケーションのために、次のコードを持っている:

#include "atmel_start.h" 
#include "atmel_start_pins.h" 
#include <string.h> 

static uint8_t example_hello_world[14] = "Hello World!\n"; 
static uint8_t example_error_msg[13] = "UART Error!\n"; 
static uint8_t request_msg[24] = "Sending Sensor Request\n"; 
static uint8_t rotronic_ascii[8] = "{ 99RDD}"; 

volatile static uint32_t data_arrived = 0; 
volatile static uint32_t reading_received = 0; 

static void tx_cb_EDBG_COM(const struct usart_async_descriptor *const io_descr) 
{ 
    /* Transfer completed */ 
    gpio_toggle_pin_level(LED0); 
} 

static void rx_cb_EDBG_COM(const struct usart_async_descriptor *const io_descr) 
{ 
    /* Receive completed */ 
    data_arrived = 1; 
} 

static void err_cb_EDBG_COM(const struct usart_async_descriptor *const io_descr) 
{ 
    /* error handle */ 
    io_write(&EDBG_COM.io, example_error_msg, 13); 
} 

static void tx_cb_COM1(const struct usart_async_descriptor *const io_descr) 
{ 
    /* Transfer completed */ 
    gpio_toggle_pin_level(LED0); 
} 

static void rx_cb_COM1(const struct usart_async_descriptor *const io_descr) 
{ 
    /* Receive completed */ 
    reading_received = 1; 
} 

static void err_cb_COM1(const struct usart_async_descriptor *const io_descr) 
{ 
    /* error handle */ 
    io_write(&COM1.io, example_error_msg, 13); 
} 

int main(void) 
{ 
    volatile uint8_t recv_char[99]; 

    atmel_start_init(); 

    // Setup the EDBG Serial Port 
    usart_async_register_callback(&EDBG_COM, USART_ASYNC_TXC_CB, tx_cb_EDBG_COM); 
    usart_async_register_callback(&EDBG_COM, USART_ASYNC_RXC_CB, rx_cb_EDBG_COM); 
    usart_async_register_callback(&EDBG_COM, USART_ASYNC_ERROR_CB, err_cb_EDBG_COM); 
    usart_async_enable(&EDBG_COM); 

    // Send a test string to ensure EDBG Serial is working 
    io_write(&EDBG_COM.io, example_hello_world, 14); 

    // Setup the Rotronic [Arduino] Serial Port 
    usart_async_register_callback(&COM1, USART_ASYNC_TXC_CB, tx_cb_COM1); 
    usart_async_register_callback(&COM1, USART_ASYNC_RXC_CB, rx_cb_COM1); 
    usart_async_register_callback(&COM1, USART_ASYNC_ERROR_CB, err_cb_COM1); 
    usart_async_enable(&COM1); 

    while (1) { 
     if (reading_received == 0) 
     { 
      // Delay for a Bit 
      delay_ms(5000); 

      // Notify the EDBG COM Port 
      io_write(&EDBG_COM.io, request_msg, 24); 

      // Send the Rotronic ASCII 
      io_write(&COM1.io, rotronic_ascii, 8); 
     } 

     // Check if Reading has been Received 
     if (reading_received == 1) 
     { 
      while (io_read(&COM1.io, &recv_char, 99) == 99) 
      { 
       // Write what's on the buffer from the receiver 
       io_write(&EDBG_COM.io, recv_char, 99); 
      } 

      // Reset the flag 
      reading_received = 0; 
     } 
    } 
} 
+0

delay_ms(5000)は**ではありません**半分待つことになっています – tofro

答えて

0

あなたはASFv3をコードしているように見える - あなたのバッファがいっぱいになったときにV4は一度ごのコールバックを受け取る任意のの着信バイトだけでなく、をトリガーします(あなたは99文字ごとに受信しました)。

つまり、io_readはおそらく(あなたのメッセージの部分的な読んだだけなので)99を返すことはほとんどありません。あなたはおそらく何も返信しません。

docsが(「...異なる読み出し機能の動作」までスクロール)と言う:ASFv4で

すべてのデータを受信用リングバッファとドライバにおけるデータ受信型コールバックがトリガされます。

明らかに、UARTはリングバッファを備えたドライバです。

io_readを繰り返し呼び出す必要があります。受け取ったバイト数を合計して99になるまで集計してください。 ASFのドキュメントにはその例があります。あなたのバージョンに合ったコードをコピーしてください。

+0

そのドキュメントのリンクはありますか?私は古い文書を見てきたと思う。また、応答のおかげで!明日テストして、この答えを正しいとマークします:) –

+0

上記の引用符にリンクしてください。 – tofro

関連する問題