Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 1
Регистрация: 27.10.2014
Сообщений: 5

Boost и чтение/запись в ttyACM0

21.11.2014, 19:30. Показов 1383. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
У меня есть микроконтроллер, к которому мне да протокол общения и поставлена задача написать программу. управляющею им.
Он подключается по usb и определяется как /dev/ttyACM0, эмулируя com-порт.

Я написал небольшой код для записи команд и чтения ответов. По протоколу на каждую команду приходит ответ. Пока что я использовал синхронное чтение и запись.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <boost/asio.hpp>
#include <iostream>
#include <iterator>
#include <string>
#include <sstream>
#include <algorithm>
#include <thread>
 
#define DLE 0x10
#define STX 0x02
#define ETX 0x03
#define ACK 0x06
#define NAK 0x15
 
using namespace boost::asio;
 
int main (int argc,char* argv[])
{  
    io_service io;
    
    std::string name;
    std::ostringstream tmp;
    std::vector <int> data;
    std::vector <int> payload;
 
    std::vector <unsigned char> answer;
    unsigned char tmp0[] = {0x10, 0x02, 0x05, 0x28, 0x00, 0xFF, 0x00, 0xFF, 0x28, 0x10, 0x03};
    unsigned char tmp1[] = {0x10, 0x02, 0x05, 0x28, 0xFF, 0x00, 0xFF, 0x00, 0x28, 0x10, 0x03};
    
    if(argv[1])
    {
      name = (const char*) argv[1];
      name = "/dev/" + name;
    }
    else
      name = "/dev/ttyACM0";
    
    std::cout << "device name is " << name << std::endl;
    
    
    try
    {
      serial_port port(io, name);
      
      if(port.is_open())
      {
    
//  write(port, buffer(tmp0, sizeof(tmp0)));
    write(port, buffer(tmp1, sizeof(tmp1)));
    
    while(!answer.size())
    {
      read(port, buffer(&answer[0], answer.size()));
    }
    std::cout << "Размер ответа: " << answer.size() << std::endl;
      
    for(int i = 0; i < answer.size(); i++)
      std::cout << answer[i] << " ";
    std::cout << std::endl;
    
    port.close();
      }
      else
    std::cout << "Не удалось открыть" << std::endl; 
    }
    
    catch (std::exception& e)
    {
      std::cerr << "Exception here: " << e.what() << std::endl;
    }
}
Запись реализуется успешно, микроконтроллер выполняет инструкции и отвечает, но я не могу получить ответ в вектор answer. Про то, что он отвечает и отвечает корректно я узнал использовав сниффер
PureBasic
1
sudo interceptty /dev/ttyACM0
Программа остаётся в цикле while(!answer.size()), а если я использую read без цикла просто выходит.

Здесь, наверное, проблема в моём не понимании работы функции read. Более серьёзная проблема заключается в том, что после отправки одной команды ни одна команда больше не отправляется (то есть микроконтроллер не исполняет других инструкций, а interceptty не ловит никаких ответов) пока я не перезагружу его по питанию. Состояние usb порта нужно смотреть на более низком уровне, нежели boost?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.11.2014, 19:30
Ответы с готовыми решениями:

Boost и побайтное чтение/запись в файл
Всем привет! Есть такой вопрос, как очень быстро скопировать файл? Скорость нужна в пределах~600 мб/сек. Возможно ли такое? Вот код,...

Запись буфера в boost asio
Изучаю данный пример http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_server.cpp Появились...

Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление)
Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление). (В файле должно быть не менее 30 строк)....

1
0 / 0 / 1
Регистрация: 27.10.2014
Сообщений: 5
24.11.2014, 20:11  [ТС]
В этом коде множество ошибок, причём очень глупых.
Во-первых
C++
1
read(port, buffer(answer, answer.size()));
Во-вторых, я не уверен что answer.size() считает что-то адекватное и длину буфера нужно подставлять в явном виде или
Гораздо правильнее использовать read_some()
The end! Solved.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.11.2014, 20:11
Помогаю со студенческими работами здесь

TtyACM0 - виртуальный ком порт для WINE, как прописать ?
Есть машина на ней стоит Ubuntu к машине подключено оборудование, типа кассового аппарата. аппарат соединен ЮСБ кабелем с...

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -&gt; Vehicles -&gt; Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...

Запись объектов класса в файл (boost)
Доброго дня господа. Прочитал топики по этой теме, но так и не понял до конца как реализовать чтение и запись при помощи boost относительно...

Ввод с клавиатуры и запись в файл, чтение из файла и запись в массив, вывод из массива на экран
1.Ввод с клавиатуры и запись в файл, чтение из файла и запись в массив, вывод из массива на экран 2.Ввод с клавиатуры и запись в массив,...

[Файлы] Запись-чтение-запись. Почему не прокатывает?
Сначала записываю в файл &quot;а&quot; запись &quot;makulatura&quot;, потом читаю ее в строку h. Все ок. Но потом когда открываю файл &quot;a&quot; опять для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru