Переполнение стека при открытии последовательного соединения с использованием boost :: asio

Я пытаюсь подключиться к устройству на COM3, и код работает, пока я не позвоню open("COM3"), что вызывает переполнение стека. Вот соответствующий код:

asio::io_service io;
asio::basic_serial_port<asio::serial_port_service> scope(io);

//Open the connection and configure it
cout << "OPENING\n";
system::error_code error;
scope.open(PORT, error);

После открытия соединения я настраиваю его со скоростью передачи и т. Д.

Он висит в win_iocp_serial_port_service.ipp, внутри SetCommState (handle, &DCB).

У меня также есть некоторый код labview для подключения, отправки команды и отключения, что работает. Если я запускаю код labview с момента запуска моего компьютера, то моя программа на C ++ работает (подключается без зависаний), но если я еще не запустил код labview, это вызывает переполнение стека. Это заставляет меня думать, что я не запускаю какой-либо драйвер или не настраиваю что-то постоянное, но я не уверен, что это будет.
Если кто-то сталкивался с этой проблемой или имел какое-либо понимание, я ценю помощь!

Информация о дальнейших испытаниях: подключение от клиентов последовательного подключения не из labview, по-видимому, также позволяет подключаться к boost. Если я сначала подключаюсь через гипертерминал, это работает, и если я подключаюсь через командную строку (согласно этому руководству https://learn.sparkfun.com/tutorials/terminal-basics/command-line-windows-mac-linux) затем я смогу впоследствии подключиться через boost, что может оказаться работоспособным решением, даже если оно немое. К сожалению, я не смог успешно отправить данные с помощью System.IO.Ports.SerialPort, поэтому временное решение подключается с использованием System.IO.Ports.SerialPort, отключается, а затем подключается с помощью boost asio теперь, когда оно работает. Это работает достаточно хорошо, но код теперь работает только на Windows.

2

Решение

Поскольку вы можете использовать свой серийный инструмент от LabVIEW, ваша гипотеза о том, что вы «не запускать какой-либо драйвер или устанавливать что-то постоянное» наверное правильно.

Вы можете увидеть, как LabVIEW и VISA настраивают порт и отправляют команды, используя инструмент, предоставленный NI, который называется I / O Trace [1]. Когда у вас есть рабочие настройки и команды, вы можете сопоставить их с вашими вызовами boost::asio и определите, не переконфигурируете ли вы порт.

В журналах трассировки ввода / вывода вы увидите, как VISA устанавливает бод, управление потоком и другие характеристики перед открытием сеанса. Драйвер, однако, разделяет не намного больше, поэтому, если ваша программа использует те же настройки и последовательность, но все еще зависает, то изучите, как вы программируете asio интерфейс [2].

Рекомендации

[1] Выполнение хорошего захвата трассировки ввода / вывода NI для отладки / устранения неполадок

http://digital.ni.com/public.nsf/allkb/282C5D41E2BA04F2862574BA007803B9

[2] Последовательные порты и C ++

http://www.webalice.it/fede.tft/serial_port/serial_port.html

1

Другие решения


По вопросам рекламы [email protected]