Я использую плату 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 данные = пусто
Кто-нибудь может мне помочь?
Спасибо!
Тельмо
А что возвращает write?
Привет @Матье! Функция записи возвращает число, равное длине отправляемых вами битов: write(fd, "start", 5) возвращает 5 и write(fd, "stop",4) возвращает 4.
Привет @pmacfarlane, я изменил то, что вы упомянули, но результат все тот же.
@Телмо. Я говорил о функции write() чуть выше функции read(), возвращающей -1 в коде A7. Опять же, каково значение errno после вызова read()?
@Mathieu, значение errno равно 11, а описание ошибки: ресурс временно недоступен. Спасибо!
Итак, ваша ошибка 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 или дождаться готовности данных.
read
не удалось, так как он вернулся-1
. Что такоеerrno
(или что даетperror()
?)