ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 мая
221998 Топик полностью
Ксения (15.11.2010 18:50 - 19:05, просмотров: 213) ответил Chum_A на Выдал ТЗ на работу. Ключевые слова FTDI, VCP, WinXP, C#. В ТЗ написано, что при обрыве (т.е. работало, потом кабель оторавали) USB кабеля юзеру надо выдавать соответствующее предупреждение. Смотрю на результаты и вижу, что требование выполняется
Я примерно такую задачу уже решала, только не на базе FTDI, а вообще В моменты, когда USB-устройство втыкается или вынимается из порта, Windows генерит системное сообщение WM_DEVICECHANGE. На это сообщение и должна реагировать программа на компе. К сожалению, из параметров этого сообщения никак не возможно узнать, что произошло - воткнули и выдернули. Практика только показывает, что выдергивание порождает только одно такое сообщение, тогда как втыкание вызывает сразу два (первое в момент втыкания, а второе, когда система это устройство иденфицировано и готово к работе). У меня связь с USB-устройством была по виртуальному COM-порту ("CDC-устройство"). Поэтому в момент прихода WM_DEVICECHANGE моя программа посылает виртуальному CОМ-порту (через который она связано с USB-устройством) команду ClearCommBreak. Есть такая команда, которая очень редко пользуются - она отменяет sleep-режим, предварительно установленный командой SetCommBreak. А поскольку спящего режима мы не задавали, то на этом фоне подача команды ClearCommBreak ни на что не влияет и, главное, ничему не мешает. А последнее важно, т.к. WM_DEVICECHANGE может быть сгенерировано какой-нибудь вставленной флешкой в то время как у вас идет интенсивная передача с вашим внешним устройством. ClearCommBreak очень удачная команда, т.к. передается не в потоке байт (там бы она могла помешать), а как интерфейсная команда. А дальше следует озаботиться, чтобы ClearCommBreak правильно обрабатывалась USB-устройством - выдавало признак подтверждения. Если в устройстве стоит микросхема FTDI, то там это уже обеспечено, а при самодельной поддержке USB (когда канал USB находится на борту МК и вы сами его программируете) эту реакцию надо обязательно поддержать (в демо-проектах про это обычно забывают). Дальше идея уже понятна. Если команда ClearCommBreak возвращает false, то ваше устройстро вырвано, а если приходит true, то вставлено. И тогда если вырвано, то останавливаете передачу.