2010-05-21 1 views
3

В рамках проекта WindowsCE, C++, я пытаюсь работать с устройствами, подключенными через «настоящие» последовательные порты и/или последовательные порты USB («виртуальные» последовательные порты); моя проблема - когда я пытаюсь открыть порт, если что-то пойдет не так, функция никогда не вернется, и система переходит в какое-то нечувствительное состояние и должна быть в конечном итоге перезагружена. Мне нужно открыть порты из основного потока. Вопрос в том, как я могу сделать это контролируемым образом? это открытие фрагмент кода:встроенный разработчик. вопрос - как освободиться от неисправного открытия последовательного порта?

std::ostringstream device_name; 
    device_name << "\\\\.\\COM" << port; 
    m_port = ::CreateFile(device_name.str().c_str(), 
          GENERIC_READ | GENERIC_WRITE, 
          0, // exclusive access 
          NULL, // no security 
          OPEN_EXISTING, 
          FILE_FLAG_OVERLAPPED, // overlapped I/O 
          NULL); // null template 

любые предложения будут высоко оценили

спасибо!

ответ

1

Почему бы не выполнить открытие в другом потоке? В этом потоке нет причин делать что-либо еще - просто откройте порт, и вы можете использовать дескриптор для открытого порта в любом другом потоке вашего процесса.

Тем не менее, я не уверен, что так плохо, что ваш звонок CreateFile(), кажется, повесил - интересно, если это произойдет даже в другом потоке, будут ли все еще стабильны в вашем приложении.

+0

Я обязательно попробую открыть порт в другом потоке - в ближайшем будущем - от того, что я здесь получаю, никто не был потрясен этой идеей, так что это могло бы просто сработать –

0

Отказ от ответственности: Я никогда не делал WinCE, и у меня было бы оговорки о выполнении встроенной системы с использованием операционной системы от компании, которая сделала «Голубой экран смерти» дословным.

Глупый вопрос номер один: вы подтвердили, что никто еще не открыл этот конкретный COM-порт?

Вы запрашиваете эксклюзивный доступ. Если у кого-то еще есть это, я бы ожидал системы, чтобы повесить вашу задачу, пока другой парень не выпустит порт.

+1

Нет, это производит ERROR_ACCESS_DENIED. –

+0

ну, иногда у вас нет роскоши, чтобы выбрать ОС i second Hans - если он открывается кем-то другим - он дает ошибку, но функция возвращается; –

+0

что я пытаюсь увидеть, могу ли я освободиться от вызова функции CreateFile, если он слишком длинный, но, находясь в том же потоке, я не знаю, как это сделать. И если, скажем, я передаю эту переменную m_port в специальный «открывающий» поток, который я мог бы завершить, если он слишком длинный - это было бы хорошо, но - если он успешно открыт из этого специального потока, который затем выйдет, то же самое для меня в основном потоке - я имею в виду, дескриптор порта - будет ли он работать в полной мере, как если бы я открыл его из основного потока? Мне не очень нравится с потоком ... –

2

Вы не можете защитить себя от мучительных драйверов устройств USB. Магазин вокруг для лучшего.

+0

в моем случае - это также сломанные кабели/разъемы, неустойчивые устройства на другом конце кабеля и т. П .; Я бы с удовольствием справился с этим с помощью кода –

+1

Действительно ли ваш фрагмент кода точным? Или вы висете на вызов ReadFile? Используйте SetCommTimeouts(). –

+0

нет, это CreateFile, который дает мне печаль; У меня есть SetCommTimeouts позже по дороге –

Смежные вопросы