STM32MP1 не может прочитать сообщение M4

Я использую плату STM32MP157-DK2 и создаю программу для связи с процессором. Для этого я создал ВИРТУАЛЬНЫЙ UART (канал ttyRPMSG0), и я могу отправлять сообщения с A7 на M4 и выполнять такие действия, как переключение светодиодов.

Сторона А7:

static void LED_ON (GtkWidget *widget, gpointer data)
{
    fd = open("/dev/ttyRPMSG0", O_RDWR |  O_NOCTTY | O_NONBLOCK);
    if (fd < 0) {
        printf("CA7 : Error opening "/dev/ttyRPMSG0"\n");
    }

    write(fd, "start", 5);
    close(fd);
}

Сторона М4:

  while (1)
  {
    OPENAMP_check_for_message();

    if (VirtUart0RxMsg) {
      VirtUart0RxMsg = RESET;

      if (!strncmp((char *)VirtUart0ChannelBuffRx,"start",5))
      {
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_RESET);
          sprintf ((char*)SendMsgVirt0, "LED green ON\n");
      }
      else if (!strncmp((char *)VirtUart0ChannelBuffRx,"stop",4))
      {
          HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_SET);
          sprintf ((char*)SendMsgVirt0, "LED green OFF\n");
      }
      else if (!strncmp((char *)VirtUart0ChannelBuffRx,"xValue",6))
      {
          sprintf ((char*)SendMsgVirt0, "X value is: %d\n", x);
      }

      VIRT_UART_Transmit(&huart0, SendMsgVirt0, SendMsgVirt0Size);
      memset(SendMsgVirt0, '\0', sizeof(SendMsgVirt0));
    }
  }

Но когда я отправляю сообщение с M4 на A7, я не могу прочитать его на стороне Linux.

Сторона А7:

static gboolean update_M4_variable (gpointer user_data)
{
    char data [32];
    char msg[128];

    fd = open("/dev/ttyRPMSG0", O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY);
    if (fd < 0) {
       g_print("CA7 : Error opening "/dev/ttyRPMSG0"\n");
    }

    write(fd, "xValue", 6);
    int size = read(fd, &data, 32);

    if (size < 0)
    {
        sprintf (msg, "Cannot read the message: %s\n", data);
    }
    else
    {
        sprintf (msg, "The message has been received: %s\n", data);
    }

    gtk_label_set_text(GTK_LABEL(text_status), msg);
    close (fd);
    return TRUE;
}

С помощью этого кода я вижу в терминале сообщение, отправленное с M4, но всегда получаю следующее:

Размер = -1 данные = пусто

Кто-нибудь может мне помочь?

Спасибо!

Тельмо

read не удалось, так как он вернулся -1. Что такое errno (или что дает perror()?)
Mathieu 21.11.2022 12:05

А что возвращает write?

Mathieu 21.11.2022 12:08

pmacfarlane 21.11.2022 13:15

Привет @Матье! Функция записи возвращает число, равное длине отправляемых вами битов: write(fd, "start", 5) возвращает 5 и write(fd, "stop",4) возвращает 4.

Telmo 21.11.2022 13:41

Привет @pmacfarlane, я изменил то, что вы упомянули, но результат все тот же.

Telmo 21.11.2022 13:44

@Телмо. Я говорил о функции write() чуть выше функции read(), возвращающей -1 в коде A7. Опять же, каково значение errno после вызова read()?

Mathieu 21.11.2022 14:06

Mathieu 21.11.2022 14:07

@Mathieu, значение errno равно 11, а описание ошибки: ресурс временно недоступен. Спасибо!

Telmo 21.11.2022 14:39
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
8
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, ваша ошибка 11: EAGAIN

От человека читать

EAGAIN The file descriptor fd refers to a file other than a socket and has been marked nonblocking (O_NONBLOCK), and the read would block. See open(2) for further details on the O_NONBLOCK flag.

Я считаю, что вы получаете сообщение об ошибке, потому что данные не готовы для чтения.

Вы можете попробовать удалить O_NONBLOCK | O_NDELAY из вызова open или дождаться готовности данных.

Другие вопросы по теме