LINUX.ORG.RU

COM-порт Как остановить запись?


0

0

Есть устройство на COM порту.
Принимает команды заканчивающиеся \n и выдается ответ например OK\n
Если кмонада неверная, то девайс отправляет C01\n
Делаю
f=open("/dev/ttyS0","флаги");
цикл{
scanf("%s",buf);
write(f,buf,len);
read(f,buf,90);//90 - это с запасом
}
close(f);

Код несколько условный.
Параллельно запускаю в консоле cat /dev/ttyS0

До первой отправки команды в консоле тишина. После отправки первой команды в консоле появляется примерно следующее
OK
C01
C01
и т д до тех пор, пока не срубишь

Если отправить ещё одну команду, то в консоле проскочит OK\n и снова начинаются C01
Вывод: линуха продолжает отсылать прибору хер знает что, в то время, как у меня висит scanf
Более того. После close(f) мусор не пропадает. Он пропадает только когда прога выгружается.

Вопрос только один: Что делать?


anonymous

Дополнение

очень странная вещь. Мусор не пропадает, если просто выгрузить программу. ОДнако если срубить cat и затем запустить заново мусора не будет(при выгруженной программе). если же программа до сих пор висит(даже с закрытым close(f)), то при повторном запуске cat мусор продолжается. При выключении устройства мусор прекращается. ТО есть этот мусор реально исходит от устройства. А это значит, что линуха что-то туда постоянно посылает. Как это остановить?

anonymous
()

>Принимает команды заканчивающиеся \n и выдается ответ например OK\n

Точно ли устройство принимает \n? Потому что, скажем, модемы имеют обыкновение использовать dos-овское окончание строки (\r\n).

anonymous
()

>f=open("/dev/ttyS0","флаги")

С какими флагами вы открываете порт? Подозреваю, что мусор пишет ваша программа, сделайте strace на нее.

mky ★★★★★
()

Поясняю

Прибор игнорирует символ \r. Так что ему глубоко плевать \r\n или \n отсылается. Флаги O_RDWR | O_NOCTTY | O_NDELAY fcntl(fd, F_SETFL, 0);

anonymous
()
Ответ на: комментарий от mky

Сделал strace Ничего лишнего моя программа не пишет. Ещё симптомы. Сделал 2 проги, одна на чтение, другач на запись. Запускаю на чтение, прога зависает(буфер пуст). Запускаю на запись и записываю в порт команду STT? (причём с контрольной суммой) Прога на чтение сначала выдает вразумительный ответ, затем выдает ошибку "несовпадение контрольной суммы" а затем начинает бесконечно долго выдавать "неверная команда" (то есть с контрольной суммой всё в порядке, почему то). Повторный ввод команды в программе на запись никак не отражается на выводе программы чтения. Если программу на чтение срубить, а затем снова запустить, она продолжит спамить. Если же срубить обе программы и затем запустить программу на чтение, то она зависнет в ожидании. Вывод. После того, как я записываю в порт какой либо символ, линуха(не моя программа) продолжает писать в этот порт что-то своё до тех пор, пока все файловые дискрипторы, которые открывали этот порт, не будут закрыты. Помогите. Я не знаю что делать. Бред какой-то.

anonymous
()
Ответ на: комментарий от anonymous

Ещё хуже. Только что выяснил.
Для того, чтобы девайс отвечал, нужно ему в самом начале отослать команду ADR 06, где 06 - это его адрес (устройства могут быть подключены последовательно на один порт и по адресу можно управлять конкретным устройством). В ответ устройство отправляет OK\n
Так вот если записать в порт команду ADR 05\n , то устройство ничего отвечать не будет (оно же не 5-е). В идеале оно должно отправить эту команду дальше до тех пор, пока эта команда не дойдет до устройства с адресом 05. Но так как устройство одно, то оно молчит. После этого можно писать в порт всё что угодно. Устройство проглатывает это и молчит.
Если же написать туда ADR 06, то оно ответить OK и начнет спамить.

Вывод. Проблема в том, что после того, как приходит ответ от устройства, со стороны линухи начинается отправка этому устройству всякого бреда.
Может надо как-то буфер очищать?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.