Что не так с этой попыткой отправить сигнал останова?

У меня довольно сильная головная боль по поводу этой, казалось бы, простой задачи: отправить сигнал об остановке на мое устройство, например, wxTerm (или любое подобное приложение терминала).

Этот сигнал должен быть длиной 125 мс, согласно моим тестам и спецификации устройств.

Это должно привести к конкретному ответу, но я получаю более длинный ответ, чем ожидалось, и переданная дата неверна.

например.:

что он должен ответить 08 00 81 00 00 01 07 00

что он отвечает 08 01 0A 0C 10 40 40 07 00 7F

Что меня действительно поражает, так это то, что после того, как я использовал wxTerm для просмотра моих доступных com-портов (без подключения или отправки чего-либо), мой код начинает работать! Я могу отправлять столько перерывов, сколько захочу, с этого момента я получаю правильный ответ. Я должен перезагрузить компьютер, чтобы попробовать его снова.

Какого черта здесь происходит ?!

Вот мой код для сброса через сигнал обрыва:

 minicom_client(boost::asio::io_service& io_service, unsigned int baud, const string& device)
: active_(true),
io_service_(io_service),
serialPort(io_service, device)
{
if (!serialPort.is_open())
{
cerr << "Failed to open serial port\n";
return;
}
boost::asio::serial_port_base::flow_control FLOW( boost::asio::serial_port_base::flow_control::hardware );
boost::asio::serial_port_base::baud_rate baud_option(baud);
serialPort.set_option(FLOW);
serialPort.set_option(baud_option);
read_start();
std::cout << SetCommBreak(serialPort.native_handle()) << std::endl;
std::cout << GetLastError() << std::endl;
boost::posix_time::ptime mst1 = boost::posix_time::microsec_clock::local_time();
boost::this_thread::sleep(boost::posix_time::millisec(125));
boost::posix_time::ptime mst2 = boost::posix_time::microsec_clock::local_time();
std::cout << ClearCommBreak(serialPort.native_handle()) << std::endl;
std::cout << GetLastError() << std::endl;
boost::posix_time::time_duration msdiff = mst2 - mst1;
std::cout << msdiff.total_milliseconds() << std::endl;
}

Редактировать:

Нужно было только взглянуть на выбор com-box com-портов wxTerm — не нужно было устанавливать активное соединение для того, чтобы мой код работал.

Я предполагаю, что отсутствует какая-то инициализация, которая выполняется, когда wxTerm создает список для выпадающего списка последовательного порта.

0

Решение

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

Однако я этого не забыл, до сих пор это было не нужно. Когда мои устройства уже находились в состоянии после сброса, они отправляли свои данные в соответствии с моим запросом — так что все было хорошо, и мне оставалось только указать baud_rate,

Так как нет активного управления потоком я часто думаю, что это часто используемая ошибка. Однако это действительно необходимо только для настройки character_size, Затем на сигнал прерывания приходит ожидаемый ответ.

Это минимальная настройка:

minicom_client(boost::asio::io_service& io_service, unsigned int baud, const string& device)
: active_(true),
io_service_(io_service),
serialPort(io_service, device)
{
if (!serialPort.is_open())
{
cerr << "Failed to open serial port\n";
return;
}
boost::asio::serial_port_base::character_size CSIZE( 8 );
boost::asio::serial_port_base::baud_rate baud_option(baud);
serialPort.set_option( CSIZE );
serialPort.set_option(baud_option);
read_start();
std::cout << SetCommBreak(serialPort.native_handle()) << std::endl;
std::cout << GetLastError() << std::endl;
boost::posix_time::ptime mst1 = boost::posix_time::microsec_clock::local_time();
boost::this_thread::sleep(boost::posix_time::millisec(125));
boost::posix_time::ptime mst2 = boost::posix_time::microsec_clock::local_time();
std::cout << ClearCommBreak(serialPort.native_handle()) << std::endl;
std::cout << GetLastError() << std::endl;
boost::posix_time::time_duration msdiff = mst2 - mst1;
std::cout << msdiff.total_milliseconds() << std::endl;
}

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

Файл примера, найденный здесь Boost Asio serial_port — нужна помощь с io помог в пути.

0

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

Других решений пока нет …

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