Вот кусок моего кода. Я сразу объясню проблему.GIOChannel иногда иногда читает не
GIOStatus ret;
GError *err = NULL;
gchar *msg;
gsize *len;
ret = g_io_channel_read_chars (koncentrator, &msg, 13, &len, err);
printf ("Read %u bytes: %hx\n", len, msg);
Мое устройство отправляет цепочки по 13 байт по последовательному порту. К сожалению, только первые два байта читаются правильно. Может быть, это потому, что только первые два байта могут быть интерпретированы как ASCII символов, это было бы странно, потому что я установить кодировку, как NULL с функцией g_io_channel_set_encoding(koncentrator, NULL, NULL);
Если я пытаюсь получить доступ к байт после первых двух я получаю Segmentation fault
, который также странно, потому что переменная ret
после прочтения содержит 13
, что означает, что она прочитала 13 байт.
Я попытался использовать g_io_channel_read_line
и g_io_channel_read_to_end
. С этими двумя программа stucks в бесконечном цикле (даже когда я проверяю условие G_IO_STATUS_EOF
).
Последняя проблема, возможно, самая неприятная в том, что она не работает в первый раз, мне нужно открыть последовательный порт с терминалом, например cutecom
. В противном случае я могу отправить данные, но не обнаружил никакого обратного вызова. Я уверен в этом, потому что устройство имеет диоды для указания состояний RX
и TX
.
Я понятия не имею, что не так, я буду очень полезен для того, чтобы дать мне несколько советов или ссылок на подходящий пример. Я чувствую, что в google я ничего не могу найти. Спасибо, привет!
спасибо. Это работает. Я также хотел бы спросить, как сделать это, если я должен добавить это в сценарий загрузки rc, чтобы он выполнил это после каждой загрузки? – Marek
@Marek Да, например. вы можете использовать '/ etc/rc.local'. Лучшим подходом было бы вызвать вызов 'stty' в начале вашей программы, например, через' g_spawn_command_line_sync() '.Лучшим решением было бы прямое обращение к API-интерфейсам termios для получения той же конфигурации, но это потребовало бы гораздо большей работы. – fetasail