LINUX.ORG.RU

Нужна помощь в bash и в работе с stty

 , ,


0

3

Решил поизучать bash, написал скрипт для работы с платкой launchpad на контроллере msp430, но появились несколько проблем: 1) при записи сообщений из /dev/ttyACM0 скрипт не отвечает, например не выводит сообщения с помощью echo

2) общение скрипта с платой осуществляется с помощью файла куда записывается сообщения от платы, а скрипт потом перебирает этот файл в поиске нужной команды, перебирает с помощью цикла for непосредственно из файла, а if ищет нужную команду, но проблема в том что не определяет ее при том что она есть, при просмотре с помощью echo переменной которой присваиваются значения из файла, показывает команду, но оператор if считает что допустим символ 1(будем считать что это команда) не равен 1, в общем бред какой то.

#!/bin/bash

if [ -e /dev/ttyACM0 ]
then

stty 9600 -F /dev/ttyACM0 raw -echo
echo -n "connect">/dev/ttyACM0 #говорит устройству что готов

cat /dev/ttyACM0 >> serial #записывает "диалог"

echo "podkluchen" #сообщение для отладки

for strin in $(cat serial) #ищет команды

do

echo $strin #пишет сообщения от платы, при этом команда "1" там есть

if [ $strin = 1 ] #поиск команды

then#какая нибудь функция

echo "komanda opredelena" #сообщение для отладки

fi

done #конец перебора файла

fi #конец поиска устройства

Содержание файла serial выглядит так:
1
1
и т.д.,т.е. каждое сообщение записываются в новой строке.

Также пробовал использовать разделители полей IFS=$'\n', так он вообще не определяет символ \ и заменяет все буквы n на пробелы в списке.



Последнее исправление: timbo (всего исправлений: 4)

Скорость порта правильная? При включении платы cat /dev/ttyACM0 что-то пишет в консоль?

Deleted
()

при записи сообщений из

Как это понимать? По-русски для начала, пожалуйста.

echo -n «connect»

Вы точно уверены, что там не надо \r или \n или вообще \r\n добавить?

cat /dev/ttyACM0

Это полная лажа, так не делают. В сериальном порту нет конца файла, есть программный по Ctrl-D, но вы его raw-ом выключили. Максимум это закончится если пропадёт устройство из системы вообще. А делают так: читают в цикле пока не найдётся некая протокольная команда «конец».

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Это полная лажа, так не делают. В сериальном порту нет конца файла, есть программный по Ctrl-D, но вы его raw-ом выключили. Максимум это закончится если пропадёт устройство из системы вообще. А делают так: читают в цикле пока не найдётся некая протокольная команда «конец».

понимаю что лажа, я думал сделать так как вы написали, т.е. прекращение записи с помощью команды «конец», но не знаю как, пробовал менять настройки stty, добавлял stop ! и тд, но «общение» не останавливалась.

Вы точно уверены, что там не надо \r или \n или вообще \r\n добавить?

пробовал, не помогло

Скорость порта правильная?

да

При включении платы cat /dev/ttyACM0 что-то пишет в консоль?

да, когда скрипт отправляет сообщение connect на устройство, устройство отвечает, это сообщение записывается в файл serial, потом скрипт перебирает его, и ищет команды

timbo
() автор топика

Точно, так можно делать?

echo -n «connect»>/dev/ttyACM0

Я бы, так сделал

echo -n "connect">>/dev/ttyACM0

1) при записи сообщений из /dev/ttyACM0 скрипт не отвечает, например не выводит сообщения с помощью echo

...
cat /dev/ttyACM0 >> serial &
echo "сейчас вывод сообщений командой echo видно?"
...

По документации команда «завершается» «\n» или «\r» или «\n\r» или «\r\n» ? Ссылку на man | документацию в студию!

Вот этот код точно не будет работать, как Вы ожидаете:

for strin in $(cat serial) #ищет команды

do

echo $strin #пишет сообщения от платы, при этом команда "1" там есть

if [ $strin = 1 ] #поиск команды

then#какая нибудь функция

echo "komanda opredelena" #сообщение для отладки

Там неверно задано сравнение.

* bash 4.4.12 на debian 9.5 отказался выполнять конструкцию

if [ $strin = 1 ] #поиск команды

then#какая нибудь функция

echo «komanda opredelena» #сообщение для отладки

fi

Версия bash? Содержимое файла serial?

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

версия глючная, т.к. скрипт работал пару раз, а конкретнее функция перебора, а если иногда и ругался, при том что еще пару изменений назад все работало,то достаточно создать новый файл скрипта, и вновь начинает работать, я серьезно.

echo «сейчас вывод сообщений командой echo видно?»

видно, уже делал, но потом почему то отказался от этого, кстати если поставить знак | работает также, и все что находится после него, отображает или выполняет как надо

Вот этот код точно не будет работать, как Вы ожидаете:

если вы говорите про кавычки, то я сам удивляюсь почему не ругается, причем один раз когда эта функция работала, она как раз таки была без кавычек

Версия bash? Содержимое файла serial?

GNU bash, версия 4.4.19(1)-release (x86_64-pc-linux-gnu) в файле serial нет ничего интересного, т.к. сейчас плата выдает только одну «команду»

PS попробовал вот это) какое то время не ругалось на синтаксис, а потом начало)

while [ $(cat /dev/ttyACM0) = stop ]
do
cat /dev/ttyACM0 >> serial
done

timbo
() автор топика

Эмм... Ряд вопросов. По ходу дело не в bash.

У меня нет Launchpad на msp430, т.к. согласно мнения TI, это всё-таки не совсем микроконтроллер, это скорее микроконвертер, т.е. что-то типа АЦП с возможностью первичной обработки.

Но у меня (совершенно точно) есть Launchpad'ы для cc1310, cc1350, cc1352 от тех же TI и CodeComposer Studio 8.1.0 (под генточкой ходит, работает и сейчас). И я довольно хорошо знаю что такое TI-RTOS.

По ходу, тут не в bash дело. По ходу, Вы пытаетесь данные читать с микро-USB шнурка, т.е., через внутрисхемный эмулятор? Так это работать не будет. Давайте попробуем по шагам.

1. Для начала. По поводу скорости в 9600. В корне неверно. Пример моего кода.

1.1 В main_tirtos.c (да, я в курсе что pthreads в TI-RTOS это надстройка над механизмом Task самой TI-RTOS, но пусть так будет, хотя, лучше бы через Task):

extern void *main_thread(void *arg0);

/* Тут какой-то код. */
int main(void) {

/* Тут опять какой-то код. */

retc = pthread_create(&thread, &attrs, main_thread, NULL);
    if (retc != 0) {
        while (1);
    }

    BIOS_start();
    return 0;
}

1.2 Выше мы создали поток, в котором будем плевать данные в UART, но с офигенно высокой скоростью.

В uart_pkt_tst.c будет тогда реализация этого потока:

#include <ti/drivers/UART.h>

void *main_thread(void *arg0) {  
    UART_Handle uart;
    UART_Params uart_params;

    UART_init();
    UART_Params_init(&uart_params);
    uart_params.writeDataMode = UART_DATA_BINARY;
    /* Работаем на 230400, так можно, но лучше оставить
     * 115200, это более стандарт чем 230400. 
     */
    uart_params.baudRate = 230400;
    uart = UART_open(Board_UART0, &uart_params);
    while (1) {
        sleep(delay);
        /* Шлём наш с понтом дела тестовый пакет. */
        UART_write(uart, tst_pkt, sizeof(tst_pkt));
        /* Радостно моргаем светодиодом. */
        GPIO_toggle(Board_GPIO_LED0);
    }
}

Выше порезано дохрена кода (delay надо определить, tst_pkt, GPIO проинициализировать), но основная суть, надеюсь, понятна. Не стоит отказывать себе в высокоскоростном соединении даже с платой такого контроллера. Единственное что — ставьте 115200, а не 230400. Не все платы конверторов USB<->UART и не все USB-порты нормально реагируют на именно 230400, да и не стандарт это. В общем, считайте, что работать на такой скорости может, но не факт.

Компилируем свой код, зашиваем его либо через UniFlash, либо прямо из среды (что ещё проще) в launchpad через USB-шнурок. Он у Вас не зря в комплекте идёт. Шьём мы, кстати, через микро-USB на launchpad, т.е. через встроенный внутрисхемный отладчик. Я не уверен, но не XDS 1100 ли там? Если будете дебажить, то в среде CCS Вы этим отладчиком-эмулятором пользоваться и будете.

2. Берём конвертер USB<->UART типа cp2102. Типа такого https://www.chipdip.ru/product/cp2102 Во-первых, в ядре Вашего хоста должна быть включена поддержка именно этого конвертера (по умолчанию она включена почти везде). Во-вторых, смотрите на разблюдовку своего launchpad. У Вас есть два пина UART (P1.1 и P1.2), туда с CP1202 заводим TX и RX. Погуглите что и куда. И, далее, заводим на 20-й пин землю с CP1202 иначе работать не будет.

После этого можете пробовать открывать на хосте порт и пытаться читать посылаемые платкой в UART данные. Микро-USB не отключаем, т.к. нам откуда-то надо брать питалово для launchpad, да и отладчик можно в параллель подрубить, что очень приятно.

Вывод ls /dev/tty* должен Вам дать /dev/ttyUSB0 (это и есть Ваш UART! Читаем данные именно отсюда!) и /dev/ttyACM{0|1}, это управление встроенным эмулятором/питалово платы.

Сейчас же Вы, по ходу, питаетесь использовать для чтения внутрисхемный эмулятор, что не работает как правило.

3. Несколько замечаний. Сразу, чтоб два раза не вставать. Ну, во-первых, используйте CCS для работы. Всегда. Пусть это не самая быстрая и безглючная среда основе Eclipse, но там нормальная поддержка всех вкусностей TI-RTOS, SYSBIOS и плат. От производителя. Так что, если кто-то Вам предложит типа, давай мы возьмём kate/vim/geany/notepad++/чего угодно и забабахаем проект, сразу спрашивайте любит ли он секс и знает ли дорогу. И желайте счастливого пути. Потратите дохрена времени, а толка будет ноль.

Во-вторых. Предположим, Вы поставили CCS. Теперь открывайте Resource Explorer и ставьте TI-RTOS для MSP430, SYS-BIOS и XDCtools Вам предложит поставить. Ставьте. Причина проста. TI-RTOS и SYS-BIOS это слишком мощные штуки чтобы пытаться за приемлемое время захерачить их самопальный аналог. Т.е., да, это именно RTOS. Причём, если потом переносить проект по линейке выше, на более мощные устройства, то будет намного проще чем перенести какое-то самописное говнище. Хоть чипы и разные, возможности разные, но абстракции RTOS (те же потоки) одинаковые и высока вероятность что при переносе всё заведётся сразу, либо с минимальными корректировками исходников. Если уже есть ОС реального времени, то глупо было бы не использовать её возможности и глупо не использовать среду разработки, которая позволяет пользоваться этими возможностями.

В третьих. Из опыта могу заметить что SDK у TI вполне вменяемые, писать с применением API легко и просто. Это не какой-то самопал. Нет, питона с перлом там нет, С++ ограниченно, на С оно в самый раз. Посмотрите документацию, которая прилетит Вам с SDK в хомяк. Там всё очень хорошо расписано. Велосипедить лишнее смысла нет.

Удачи!

Moisha_Liberman ★★
()
Ответ на: комментарий от timbo

когда скрипт отправляет сообщение connect на устройство, устройство отвечает, это сообщение записывается в файл serial

Вы смотрели бинарные коды в этом файле serial? Если там концы строк \r\n, то не удивительно, что bash ничего не может сравнить, так как по умолчанию IFS=" \t\n", и \r остаётся у строк команд.

потом скрипт перебирает его, и ищет команды

Вы спутали отладку и правильный метод работы. Нет никакого потом. Как вы узнали момент, когда это потом наступает? Надо сразу читать и анализровать строки:

IFS=$' \t\r\n'
while read string; do
  case "$string" in
     cmd1) действие1;;
     cmd2) действие2;;
     quit) break;;
  esac
done < /dev/ttyACM0

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)

Попробуй сначала повзаимодействовать через minicom или cutecom для того, чтобы убедиться в корректной работе прошивки и порта. У меня есть подозрение, что ты не те параметры используешь. Например, устройство может быть совсем не ttyACM0, да и скорость может быть другой, или ещё что. Можешь ещё при подключении платы к компьютеру посмотреть через dmesg, что за устройство создаётся.

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