fgets не может захватить вывод с устройства tty

Я пытаюсь получить значение RSSI от модема Option, установленного как ttyHS4 (управление) и ttyHS5 (данные) на плате Linux. Ожидаемый результат отображается на консоли, но fgets просто не фиксирует выходные данные консоли.

if ((f=popen("echo -e \"AT+CSQ\r\n\">dev\ttyHS4","r"))==NULL){  
perror("popen");  
exit(1);  
}  

while (fgets(buff,sizeof(buff),f){  
printf(":%s:\n",buff);  
}  

Я тестировал с помощью «echo \"TEST\"" в команде popen, и приведенный выше код смог распечатать строку «: TEST:». С выводом ttyHS4 я могу получить только несколько выводов на консоль, но fgets + fprintf не получает никаких данных для работы.

Посоветуйте, где я мог ошибиться.


person user1108249    schedule 30.12.2012    source источник
comment
И добавьте / к пути   -  person William Pursell    schedule 30.12.2012
comment
Вы имеете в виду \r\n\ для AT+CSQ? Помните, что я смог получить значение RSSI и BER, т.е. +CSQ: 16,99. Проблема только на консоли Linux, а не через fgets в программе C. Во всяком случае - я попробовал, удалил \r - на этот раз совершенно безрезультатно.   -  person user1108249    schedule 30.12.2012
comment
Да - там опечатка - ее эхо -e AT+CSQ\r\n›/dev/ttyHS4. Спасибо.   -  person user1108249    schedule 30.12.2012


Ответы (2)


Вы вызываете popen() для создания дескриптора файла, который направляет в вашу основную программу стандартный вывод этой команды:

echo -e ... >/dev/ttyHS4

Вы понимаете, что эта команда ничего не отправляет в этот файловый дескриптор, верно? popen() открывает оболочку (обычно /bin/sh), которая затем выполняет эту команду. Из-за перенаправления на /dev/ttyHS4 команда echo не отправляет свой стандартный вывод в тот же файловый дескриптор, что и ее родительская оболочка, что приводит к тому, что ничего не записывается в f - и даже если это не проблема, echo никогда не будет читать обратно модем вам ответит..

Но почему вы вообще используете popen() и echo вместо того, чтобы просто открыть /dev/ttyHS4 для чтения/записи и напрямую использовать read() и write() для результирующего файлового дескриптора?

person thkala    schedule 30.12.2012
comment
Спасибо. Ошибка новичка в Linux, поскольку я мог заставить ttyHS4 печатать обратно на консоль после повторения AT-команды, я ожидал, что fgets сможет захватить ответ от ttyHS4. Сейчас я использую write() и read() и в адской фазе синтаксического анализа строк... Спасибо за предупреждение. - person user1108249; 01.01.2013

Очень необычно иметь символ табуляции в пути. Вероятно, вы хотели сделать:

popen("echo \"AT+CSQ\">/dev/ttyHS4","r")
person William Pursell    schedule 30.12.2012
comment
Пример взят из руководства по драйверу Option Wireless — #echo –e «‹AT command›\r\n» › /dev/ttyHSx - person user1108249; 30.12.2012
comment
Мне просто интересно, почему я могу получить правильные результаты, отправленные на консоль, когда я запускаю свою программу на C с кодом, но fgets вообще ничего не фиксирует. Спасибо. - person user1108249; 30.12.2012