Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Voronwe
0 / 0 / 1
Регистрация: 27.10.2014
Сообщений: 5
1

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

21.11.2014, 19:30. Просмотров 781. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2014, 19:30
Ответы с готовыми решениями:

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

Запись буфера в boost asio
Изучаю данный пример...

Boost начало работы: Undefined reference to `boost::system::generic_category() '
Добрый день Собственно говоря возникла необходимость использовать boost в...

Boost Log - undefined reference to `boost::system::system_category()'
Пытаюсь скомпилировать код из примеров Boost Log:#include...

Использование boost и boost.build с несколькими компиляторами
Здравствуйте! Собрал библиотеку boost и boost.build для двух компиляторов:...

1
Voronwe
0 / 0 / 1
Регистрация: 27.10.2014
Сообщений: 5
24.11.2014, 20:11  [ТС] 2
В этом коде множество ошибок, причём очень глупых.
Во-первых
C++
1
read(port, buffer(answer, answer.size()));
Во-вторых, я не уверен что answer.size() считает что-то адекватное и длину буфера нужно подставлять в явном виде или
Гораздо правильнее использовать read_some()
The end! Solved.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2014, 20:11

Метапрограммирование в boost::proto (boost::spirit)
В библиотеке boost:: proto есть такой код ...

Qt и boost boost::system::generic_category()
Добрый день Не подскажите как настроить Qt на работу с boost? У меня в...

boost::geometry::model::box и boost::geometry::area
Здравствуйте! Пытаюсь измерить площадь box'a :D, но не знаю как правильно это...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru