2017-01-13 77 views
0

我目前正在開發一個系統,該系統包括向通過UART連接到Atmel SAML21 Xplained Pro電路板的傳感器設備發送請求字符串。我正在測試Arduino板作爲「傳感器設備」,但最終它將用於Rotronic HC-2傳感器。在Atmel上發送請求並通過UART接收響應的代碼問題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

相關問題