встроенный прибор вопрос - как вырваться на свободу из неисправного открытия последовательного порта? - PullRequest
3 голосов
/ 21 мая 2010

В 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

любые предложения будут с благодарностью

спасибо!

Ответы [ 3 ]

2 голосов
/ 21 мая 2010

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

1 голос
/ 22 мая 2010

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

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

0 голосов
/ 21 мая 2010

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

Глупый вопросНомер один: Вы убедились, что никто другой уже не открыл этот конкретный COM-порт?

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

...