Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:2
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » ARM
Программирование устройства на виртуальном COM-порту
vicont
Добавлено 15.02.2011 10:58
0
Сообщение: 1
vicont
0

Пункты: 146
Регистрация: 04.08.2010
Пол: Мужчина
День добрый.

Подключил плату-реле (http://www.kernelchip.ru/Ke-USB24R.php) к SK-AT91SAM9260. В устройство ttyACM0 пишу команды (к примеру $KE и завершаю кодами 13 и 10). Первая команда выполняется (получаю ответ #OK), а на последующие команды реле отвечает только #ERR не выполняя при этом команд.

Программа на Си++
// подключение
this->fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NONBLOCK);

// Установка параметров порта
tcgetattr(this->fd, &portoptions);
portoptions.c_cflag |= B9600; // 9600 скорость, хотя ему вроде всё равно
// Без контроля чётности, 8 бит, 1 стоповый
portoptions.c_cflag &= ~PARENB;
portoptions.c_cflag &= ~CSTOPB;
portoptions.c_cflag &= ~CSIZE;
portoptions.c_cflag |= CS8;

// выключить аппаратное управление потоком
portoptions.c_cflag &= ~CRTSCTS;
// Отключаем мэп CR в NL
portoptions.c_iflag &= ~ICRNL;
portoptions.c_oflag &= ~OCRNL;

tcsetattr(this->fd, TCSAFLUSH, &portoptions);

....
// передача команды
char command[6] = "$KE";
command[3] = 13;
command[4] = 10;
command[5] = 0;

printf("command: %s\n", command);

count_byte = write(this->fd, command,5);

printf("I write %d byte\n", count_byte);

....
// Чтение ответов
count_byte = read(this->fd, buffer, 1023);

write успешно отправляет указанное количество байт. read читает ответы от платы.
Только плата обрабатывает только первую команду.

И главное. Тот же код отлично работает на обычном компе (x86 + Linux), но на плате (ARM9 + Linux) нет.

Что может быть?
Где искать причину?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 15.02.2011 13:01 Сообщение: 2
sasamy
4.70

Пункты: 77241
Регистрация: 14.08.2009
Цитата

И главное. Тот же код отлично работает на обычном компе (x86 + Linux), но на плате (ARM9 + Linux) нет.


А какие версии ядер на компьютере и на плате ?
Спуститься к концу Подняться к началу
Персональная информация
Valentinus
Добавлено 15.02.2011 14:24 Сообщение: 3
Valentinus
4

Пункты: 2138
Регистрация: 23.01.2010
Пол: Мужчина
а вы подаете пачку команд, потом читаете ответы?
попробуйте парами "команда-ответ".
может реле отработать команду не успевает, получая уже следующую?
попробуйте посылать к конце команды только 13, только 10, поменять местами, ничего не посылать.
программу запускаете из консоли или в rs.S или из inittab?
Спуститься к концу Подняться к началу
Персональная информация
vicont
Добавлено 15.02.2011 18:02 Сообщение: 4
vicont
0

Пункты: 146
Регистрация: 04.08.2010
Пол: Мужчина
Проблема похоже решилась. Методом написания того же другим человеком.
Разницы в:
1) вместо одного открытия файла делаем два (отдельно на чтение и запись)
2) сразу после записи закрываем "файл" устройства. Без этого точно не работало
3) сразу после чтения ответа закрываем и второй "файл"
4) read и write заменили на fputs_unlocked и fgets_unlocked
5) убрали секундную задержку между записью команды и чтением ответа. Без этого тоже не работало.
Возможно что-то из этих пунктов на работу и не повлияло. Завтра попробую проверить.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 16.02.2011 01:08 Сообщение: 5
sasamy
4.70

Пункты: 77241
Регистрация: 14.08.2009
Тут бы не мешало спросить - вы читали чтонибуть по теме работы с последовательным портом в linux ? то что вы описали в 1-5 это какой-то лютый изврат. Вам во первых нужно установить raw режим, во вторых использовать что-нибуть из серии poll/select при ожидания ответа. Я думал у вас драйвер не работает а вы там садомазо занимаетесь :)
http://cisco.opennet.ru/docs/RUS/serial_guide/
Спуститься к концу Подняться к началу
Персональная информация
vicont
Добавлено 16.02.2011 07:17 Сообщение: 6
vicont
0

Пункты: 146
Регистрация: 04.08.2010
Пол: Мужчина
sasamy, эту статью я тоже читал (правда через строчку).
Вообще у меня это первый опыт с платами на ARM, с "периферией" (у меня тут кроме реле еще RFID есть, клавиатура (пока обычная USB), в планах что-нибудь вроде PIN Pad-а вместо клавиатуры, GPS еще в SIM508). Да и под Линукс я особо тоже не программил. Так что извращений еще много предстоит.
У меня пока цель "написать лишь бы работало" и показать прототип заказчику. "Как лучше" буду потом делать по мере развития мозгов.
Спуститься к концу Подняться к началу
Персональная информация
vicont
Добавлено 16.02.2011 07:19 Сообщение: 7
vicont
0

Пункты: 146
Регистрация: 04.08.2010
Пол: Мужчина
Кстати, может кто-нибудь расскажет или ссылочку даст: чем отличается программирование виртуального COM-порта и настоящего?
Спуститься к концу Подняться к началу
Персональная информация
vicont
Добавлено 16.02.2011 07:46 Сообщение: 8
vicont
0

Пункты: 146
Регистрация: 04.08.2010
Пол: Мужчина
В общем, путем исключения выяснил, что пункты с 1) по 4) не имели ни какого значения, а к ошибки приводила секундная задержка между записью команды и чтением результата.
count_byte = write(this->fd, command,13);
//sleep(1);
count_byte = read(this->fd, buffer, 1023);
За две недели все самые идиотские предположения проверил. Но на sleep ни разу даже не подумал :(
Спуститься к концу Подняться к началу
Персональная информация
Valentinus
Добавлено 16.02.2011 09:28 Сообщение: 9
Valentinus
4

Пункты: 2138
Регистрация: 23.01.2010
Пол: Мужчина
а буфер для чтения был какого размера?
Спуститься к концу Подняться к началу
Персональная информация
vicont
Добавлено 16.02.2011 10:55 Сообщение: 10
vicont
0

Пункты: 146
Регистрация: 04.08.2010
Пол: Мужчина
Valentinus, если вы про мой буфер в count_byte = read(this->fd, buffer, 1023); то таким и был (1024 байта).
Если речь о каком-то другом, то где смотреть?
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » ARM