2017-01-13 21 views
0

В настоящее время я разрабатываю систему, которая включает отправку строки запроса на сенсорное устройство, подключенное через UART к плате Atmel SAML21 Xplained Pro. Я тестирую плату Arduino как «сенсорное устройство», но в конечном итоге это будет для датчика Rotronic HC-2.Проблемы с кодом для отправки запроса и получения ответа по UART на 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

I что ответ от датчика должен быть 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) is ** not ** Предполагается ждать полсекунды – tofro

ответ

0

Вы, кажется, кодирующая ASFv3 - v4 будет инициировать получение обратного вызова для любых входящих байт, а не только один раз, когда ваш буфер полон (и вы получили каждые 99 символов).

Это означает, что io_read, скорее всего, никогда не вернет 99 (потому что это было лишь частичное прочтение вашего сообщения), и вы, скорее всего, никогда ничего не вернете.

Обратите внимание на docs говорят (Прокрутите вниз до «различного поведения функции чтения ...»):

В ASFv4 тип обратного вызова прием данных в драйвере с кольцевым буфером запускается для каждого полученных данных.

UART, по-видимому, является драйвером с кольцевым буфером.

Вам необходимо повторно позвонить io_read и суммировать количество полученных байтов, пока не получите 99. Только после этого. Для этого есть примеры ASF. Убедитесь, что вы скопировали код, который соответствует вашей версии.

+0

У вас есть ссылка на этот документ? Я думаю, что смотрел старые документы. Также спасибо за ответ! Завтра проверит завтра и отметит этот ответ как правильно :) –

+0

Ссылка на цитату, указанную выше. – tofro