2013-05-28 4 views
0

Вот кусок моего кода. Я сразу объясню проблему.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 я ничего не могу найти. Спасибо, привет!

ответ

1

Когда вы имеете дело с последовательными портами, должен правильно настроить их перед началом чтения. Моя догадка cutecom устанавливает некоторый жизненный последовательный параметр, делая порт пригодным для использования. Другими словами, код, который вы опубликовали, не является проблемой. Отсутствует код.

Хороший способ проверить это с помощью stty. Это просто пример: используйте man stty, чтобы иметь (достаточно длинный) список параметров.

stty -F /dev/ttyS0 raw 9600 -parity 
+0

спасибо. Это работает. Я также хотел бы спросить, как сделать это, если я должен добавить это в сценарий загрузки rc, чтобы он выполнил это после каждой загрузки? – Marek

+0

@Marek Да, например. вы можете использовать '/ etc/rc.local'. Лучшим подходом было бы вызвать вызов 'stty' в начале вашей программы, например, через' g_spawn_command_line_sync() '.Лучшим решением было бы прямое обращение к API-интерфейсам termios для получения той же конфигурации, но это потребовало бы гораздо большей работы. – fetasail

1

Это подпись g_io_channel_read_chars согласно documentation:

GIOStatus   g_io_channel_read_chars    (GIOChannel *channel, 
                 gchar *buf, 
                 gsize count, 
                 gsize *bytes_read, 
                 GError **error); 

Вы передаете &msg в качестве аргумента buf, таким образом, вы передаете значение типа gchar** где функция ожидает gchar*. Вместо этого вы должны пройти msg. Вы также должны сначала выделить память, поскольку это ответственность вызывающего, а не функция.

+0

Thank you Adrian. Я добавил 'malloc' и изменил' & msg' для 'msg', и это решило проблему с« Ошибка сегментации ». Но у меня все еще есть проблема с коммуникацией, мне нужно открыть устройство с помощью терминала 'cutecom', и только тогда моя программа C сможет получать сообщения с устройства. Я забыл сказать, что я добавляю модуль в ядро, поэтому я уверен, что устройство существует в системе, это примечание добавлено терминалом 'cutecom'. – Marek

Смежные вопросы