C CORTEX-M4: как получить доступ к данным uint8_t, отправленным UART (vcom) как int32_t - PullRequest
2 голосов
/ 24 апреля 2019

Я пытаюсь проверить связь между моим LPC4370 cortex-m4 micro (платой LPC Link2 eval) и моим компьютером, используя пример VCOM, поставляемый с LPCOpen. Я просто хочу отправить данные из matlab, скопировать их в массив int32_t и отправить обратно на хост.

Вот что я попробовал. От Matlab:

fwrite(serial_object,raw_data,'int32');

Для части C я суммирую только соответствующий код:

#define RAW_SIZE      1024
unsigned char uint8_t;
typedef int int32_t;

// My Buffer
__DATA(RAM) int32_t buffer_rt_s[RAW_SIZE] = {0};

// VCOM-UART rx buffer
static uint8_t g_rxBuff[4*RAW_SIZE];

int i;

int main()
{
  vcom_bread((uint8_t*)&g_rxBuff[0], 4*RAW_SIZE);

    for(i=0; i < RAW_SIZE; i=i+1)
    {
     buffer_rt_s[i]=(int32_t*)(&g_rxBuff[0]+i*4);
    }
    vcom_write((uint8_t*)&buffer_rt_s[0], 4*RAW_SIZE);
}

Что я пытаюсь сделать здесь

for(i=0; i < RAW_SIZE; i=i+1)
{
buffer_rt_s[i]=(int32_t*)(&g_rxBuff[0]+i*4);
}

- доступ к приемному буферу, продвигающемуся на 4 байта на каждой итерации. Поэтому я прошу адрес

(&g_rxBuff[0]+i*4)

А затем для содержимого в этом месте, указав, что я хочу 32-битное число (то есть 4 байта):

(int32_t*)

Результаты с участка Matlab. Мне кажется, что я читаю адреса принимающего буфера вместо содержимого. Обратите внимание, что я уже использовал функции vcom с matlab, и я точно знаю, что они работают.

Любая помощь будет принята с благодарностью. Andrea

Ответы [ 2 ]

0 голосов
/ 28 апреля 2019

Итак, я публикую здесь решение, которое сработало для меня, после подсказок @Lundin.Вот мое объединение: это обеспечивает выравнивание данных по 4 байта.

#define RAW_SIZE      64

/* my nt32 buff */
__DATA(RAM) int32_t buffer_rt_s[RAW_SIZE] = {0};

union Buffer {
    uint8_t g_rxBuff[4*RAW_SIZE];
    int32_t g_rxBuff32[RAW_SIZE];
};

А вот мое использование LPCOpen USB Driver

/* Union init */
Buffer b;

/* read on byte at a time*/
vcom_bread(&(b.g_rxBuff[0]), 4*RAW_SIZE);

/* do something with the data */

buffer_rt_s[i]=b.g_rxBuff32[i];

/* write - note that this cast is legal */
vcom_write((uint8_t*)&buffer_rt_s[0], 4*RAW_SIZE);

Я надеюсь, что это может помочь другим в использовании такого рода драйверов:)

0 голосов
/ 24 апреля 2019

Здесь много разных проблем.

  • Любой протокол данных, отправленный через UART или другой обмен данными, будет называться «сетевым бесконечностью».Это порядок байтов MS / LS, используемый протоколом связи.По традиции это почти всегда порядковый номер.

    Ваш ПК почти наверняка имеет порядковый номер.Cortex M4 поддерживает как большие, так и маленькие значения, но обычно по умолчанию имеет значение порядка байтов.Это в случае с LPC4370.

    Вам нужно разобраться, как именно байты хранятся в памяти и в протоколе, прежде чем делать что-либо еще.

  • g_rxBuff не обязательно распределяется по четному адресу, а полученный протокол не обязательно распределяет целые числа по четным адресам.Это означает, что доступ к его содержимому через int32_t может привести к смещенному доступу.

  • Доступ к массиву uint8_t через доступ по указателю int32_t всегда является серьезной ошибкой нарушения псевдонимов.(Вы можете сделать наоборот, как особый случай.) См. Что такое строгое правило псевдонимов?

Чтобы избежать двух последних проблем, вы можете выделить памятьпо конкретным адресам, а затем распечатайте всю память с помощью memcpy.Или, в качестве альтернативы, используйте union трюки:

typedef union
{
  uint8_t u8 [4];
  int32_t i32;
} i32_t;
...