Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Виртуальный COM порт поверх USB

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

MrGalaxy



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
День добрый!
 
Имеется прибор с интерфейсом USB на основе FT232R.
Последний драйвер CDM 2.08.30 WHQL Certified установлен.
В принципе, прибор виден и даже через раз управляется (случайным образом).
Управляю через подпрограммы, входящие в FTD2XX.dll.
Подозреваю, что или какие-то параметры порта недонастроены, или я передаю в порт какой-то мусор.
 
В то же время, во Всемирной Помойке пишут, что если появился виртуальный COM-порт, то можно обращаться к нему напрямую и с ним работать.
Порт появляется, когда втыкаешь кабель. Но стандартная процедура открытия COM-порта по его номеру  

Код:
hPort1 := CreateFile(PChar('COM12'), Generic_Read + Generic_Write, 0, nil, Open_Existing, 0, 0);
не работает.
 
Как мне открыть виртуальный COM порт по его номеру, а не по серийному номеру устройства, по индексу и т.д., чтобы не связываться с этими долбанными FT_ процедурами. Винда-то видит COM-порт, значит к нему можно получить доступ.
 
Если кто уже мучался с такими граблями, подскажите, плз.

Всего записей: 1868 | Зарегистр. 11-01-2007 | Отправлено: 16:20 25-10-2013
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrGalaxy
А что GetLastError() при этом возвращает?

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 12:45 26-10-2013
MrGalaxy



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
  hPort1 := CreateFile(PChar('COM12'),
          Generic_Read + Generic_Write, 0, nil, Open_Existing, 0, 0);
 
  showmessage(inttostr(GetLastError));
  showmessage(inttostr(hPort1));

выдаёт  
2
4294967295
 
Добавлено:
Разобрался с открытием порта.
Как оказалось, при номере порта больше 9 надо писать так:
'//./COM12'
http://ru.wikibooks.org/wiki/COM-порт_в_Windows_(программирование)
Abs62
спасибо за участие.

Всего записей: 1868 | Зарегистр. 11-01-2007 | Отправлено: 10:29 28-10-2013 | Исправлено: MrGalaxy, 10:47 28-10-2013
MrGalaxy



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вечер добрый!
Неймётся мне.
 
 
Допустим, к ЭВМ подключены 2 или 3 одинаковых прибора, поэтому дабы не запутаться в них, что куда подключено, требуется определить в автоматическом режиме номера COM портов и их соответствие подключенным приборам.
 
Опознавательный признак - ну, скажем, серийный номер прибора, который можно считать не открывая порт, через всё ту же FTD2xx.dll.
 
Эта задача вообще решаема?

Всего записей: 1868 | Зарегистр. 11-01-2007 | Отправлено: 20:46 28-10-2013
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrGalaxy
А через COM опознавательный признак считать нельзя?
Стандартная схема - постучаться во все имеющиеся на машине COM-порты. Откуда нужный ответ придёт, тот и задействовать.


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 21:19 28-10-2013
MrGalaxy



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62

Цитата:
А через COM опознавательный признак считать нельзя?

У меня перед этим была похожая задача. Там два идентичных прибора были соединены с ЭВМ по RS232, причём набор команд был КОПовский. В т.ч. и команда '*IDN?' была. Поэтому там можно было так поступать: открываешь себе порты и считываешь информацию о приборе.  
А в этом приборе, которым я сейчас занимаюсь, очень скудный набор команд, там нет команды идентификации.
 
Я рассуждаю так: Если при подключении прибора образуется виртуальный COM и отображается в Диспетчере устройств (Windows-7), то номер этого порта можно  выдернуть какими-нибудь функциями API. Только какими? Я в этом деле не силён.

Всего записей: 1868 | Зарегистр. 11-01-2007 | Отправлено: 08:41 29-10-2013
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MrGalaxy

Цитата:
Я рассуждаю так: Если при подключении прибора образуется виртуальный COM и отображается в Диспетчере устройств (Windows-7), то номер этого порта можно  выдернуть какими-нибудь функциями API. Только какими? Я в этом деле не силён.

Можно глянуть сюда, к примеру. Вроде там именно с такой задачей и разбирались.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 12:40 29-10-2013
MrGalaxy



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62

Цитата:
MrGalaxy

Цитата:
Я рассуждаю так: Если при подключении прибора образуется виртуальный COM и отображается в Диспетчере устройств (Windows-7), то номер этого порта можно  выдернуть какими-нибудь функциями API. Только какими? Я в этом деле не силён.

Можно глянуть сюда, к примеру. Вроде там именно с такой задачей и разбирались.

Спасибо за ссылку, там народ решил зайти через реестр. Сохранил страницу на будущее.
А я поступил так (не удалось-таки обойтись без FT-процедур):

Код:
...
const    
    FT_OPEN_BY_SERIAL_NUMBER = 1;
    FT_LIST_BY_INDEX = $40000000;
 
implementation
 
function FT_Close(ftHandle:Dword):integer;stdcall;External 'FTD2XX.DLL';
function FT_GetComPortNumber(ftHandle:Dword; lpComPortNumber: pointer)
                              :integer;stdcall;External 'FTD2XX.DLL';
function FT_CreateDeviceInfoList(lpdwNumDevs:pointer):integer;stdcall;
                                                 External 'FTD2XX.DLL';
function FT_ListDevices(pvArg1:Dword; pvArg2:Pointer; dwFlags:Dword):
                                integer; stdcall; External 'FTD2XX.DLL';
function FT_Open(Index:Integer; ftHandle:Pointer):integer; stdcall;
                                                 External 'FTD2XX.DLL';
 
var I: integer;
    N: integer;
     FT_HANDLE: tHandle;
     buff: array[0..127]of char;
    NumberOfConnectedDevices: cardinal;
 
{$R *.dfm}

 

Код:
// Number of connected devices
 FT_CreateDeviceInfoList(@NumberOfConnectedDevices));
// Get serial number
for I := 0 to NumberOfConnectedDevices-1 do
  begin
    FT_ListDevices(I,@buff,FT_LIST_BY_INDEX + FT_OPEN_BY_SERIAL_NUMBER);
    RichEdit1.Lines.Add(buff);
   end;
// Get COM port number
 for I := 0 to NumberOfConnectedDevices-1 do
   begin
    FT_Open(I,@FT_HANDLE);
    FT_GetComPortNumber(FT_HANDLE, @N);
    RichEdit2.Lines.Add(IntToStr(N));
    FT_Close(FT_HANDLE);
   end;
 Application.ProcessMessages;

Всего записей: 1868 | Зарегистр. 11-01-2007 | Отправлено: 19:56 29-10-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Виртуальный COM порт поверх USB


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru