Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: USB <-> COM  (Прочитано 33406 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 02-07-2008 11:31 » 

пока решил сюда тему создать.

Вопрос такой: кто пользовался микроконтроллером FT232BM
( это эмулятор ком порта, который работает через USB )

пока так удочку закинул - чтобы найти, кому потом глупые вопросы позадавать )

И имеется ли альтернативное решение, не только этот МК ?
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 02-07-2008 11:43 » 

Тебе внутренности нужны? Или практическое применение? Если второе, то у меня просто кабель есть - с одной стороны USB (host) с другой RS-232. Инсталлишь дрова и у тебя появляется в системе COMxx можешь сам задать какой. Особенно актуально для ноутов без RS-232го. Какой у него чип внутри стоит я ессно не знаю. Но очень маленький. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 02-07-2008 12:04 » 

вот вот, и у нас такой кабель, только дровина, с ним идущая, ставит в систему кроме самого девайса ещё виртуальный ком, который нахрен не нужен. Пытаюсь найти, как напрямую работать из программы с драйвером.

Кстати, Джон, скажи, где брал кабель и драйвер - может мы тоже перекинемся на него ? )

(а нужно для чего - у нас куча приборов на коме сидит, исторически сложилось, а сейчас появляются мамские платы, у которых кома нет, зато усб - как винограда)
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 02-07-2008 12:38 » 

Хммм не совсем понял. У меня тоже ставится виртуальный СОМ-порт. А какая беда от этого? Работай с ним через CreateFile и всё. Где брал... Даааа... Это было лет шесть назад. Мы делали одну прогу для Зименса, а они ребята ушлые у них есть слоты на которых 64 СОМ порта стоит. А мне где такой взять? Я тогда на грабли был наступил с использованием констант COM1-COM9 больше они не определены. А они как раз и установили, что с COM10, COM11, COM11 ... проблемы возникают. Вот для теста и пришлось брать такой, ибо его ты можешь например COM78 обозвать.

А что ты надеешься выжать из дров напрямую? Протокол клиентов всё-равно на RS-232 работает. В лучшем случае ты повторишь вироуальных СОМ-порт. Или ты хочешь свои приборы на юсб переделать?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 02-07-2008 14:59 » 

пользовал FT232BM(или подобную, 8 бит, паралельный). мы его в нашу железяку пихали. свою простоту и дешевизну он окупает)
дрова и прочее на ftdi.com в свободном доступе.
напрямую к драйверу не получится, только через ихнюю библиотеку. рекомендую через второй режим: называется D2xx, вроде.
в целом - все очень просто, даже говорить не о чем)

PS а так, как кто то правильно по ее поводу высказался: "это Visual Basiс от микроэлектроники")))))
PPS из особенностей, при коротких посылок, имеет latency до 2мс.


Код:
typedef struct ftdi_fuct
{
HMODULE             m_hmodule;
FT_HANDLE           m_ftHandle;
PtrToWrite          ft_Write;
PtrToRead           ft_Read;
PtrToOpen           ft_Open;
PtrToOpenEx         ft_OpenEx;
PtrToListDevices    ft_ListDevices;
PtrToClose          ft_Close;
PtrToResetDevice    ft_ResetDevice;
PtrToPurge          ft_Purge;
PtrToSetTimeouts    ft_SetTimeouts;
PtrToGetQueueStatus ft_GetQueueStatus;
        PtrToSetUSBParameters ft_SetUSBParameters;
        PtrToSetLatencyTimer  ft_SetLatencyTimer;
        PtrToGetUSBParameters ft_GetLatencyTimer;
}   STRUCT_DLL_FTDI;

STRUCT_DLL_FTDI dll_ftdi;

int LoadDLL()
{
    dll_ftdi.m_hmodule = LoadLibrary("Ftd2xx.dll");
    if(dll_ftdi.m_hmodule == NULL)
    {
printf("Error: Can't Load Ftd2xx.dll");
return -1;
    }

    dll_ftdi.ft_Write = (PtrToWrite)GetProcAddress(dll_ftdi.m_hmodule, "FT_Write");
    if (dll_ftdi.ft_Write == NULL)
    {
printf("Error: Can't Find FT_Write");
return 1;
    }

    dll_ftdi.ft_Read = (PtrToRead)GetProcAddress(dll_ftdi.m_hmodule, "FT_Read");
    if (dll_ftdi.ft_Read == NULL)
    {
printf("Error: Can't Find FT_Read");
return 2;
    }

    dll_ftdi.ft_Open = (PtrToOpen)GetProcAddress(dll_ftdi.m_hmodule, "FT_Open");
    if (dll_ftdi.ft_Open == NULL)
    {
printf("Error: Can't Find FT_Open");
return 3;
    }

    dll_ftdi.ft_OpenEx = (PtrToOpenEx)GetProcAddress(dll_ftdi.m_hmodule, "FT_OpenEx");
    if (dll_ftdi.ft_OpenEx == NULL)
    {
printf("Error: Can't Find FT_OpenEx");
return 4;
    }

    dll_ftdi.ft_ListDevices = (PtrToListDevices)GetProcAddress(dll_ftdi.m_hmodule, "FT_ListDevices");
    if(dll_ftdi.ft_ListDevices == NULL)
    {
printf("Error: Can't Find FT_ListDevices");
return 5;
    }

    dll_ftdi.ft_Close = (PtrToClose)GetProcAddress(dll_ftdi.m_hmodule, "FT_Close");
    if (dll_ftdi.ft_Close == NULL)
    {
printf("Error: Can't Find FT_Close");
return 6;
    }

    dll_ftdi.ft_ResetDevice = (PtrToResetDevice)GetProcAddress(dll_ftdi.m_hmodule, "FT_ResetDevice");
    if (dll_ftdi.ft_ResetDevice == NULL)
    {
printf("Error: Can't Find FT_ResetDevice");
return 7;
    }

    dll_ftdi.ft_Purge = (PtrToPurge)GetProcAddress(dll_ftdi.m_hmodule, "FT_Purge");
    if (dll_ftdi.ft_Purge == NULL)
    {
printf("Error: Can't Find FT_Purge");
return 8;
    }

    dll_ftdi.ft_SetTimeouts = (PtrToSetTimeouts)GetProcAddress(dll_ftdi.m_hmodule, "FT_SetTimeouts");
    if (dll_ftdi.ft_SetTimeouts == NULL)
    {
printf("Error: Can't Find FT_SetTimeouts");
return 9;
    }

    dll_ftdi.ft_GetQueueStatus = (PtrToGetQueueStatus)GetProcAddress(dll_ftdi.m_hmodule, "FT_GetQueueStatus");
    if (dll_ftdi.ft_GetQueueStatus == NULL)
    {
printf("Error: Can't Find FT_GetQueueStatus");
return 10;
    }
    dll_ftdi.ft_SetUSBParameters = (PtrToSetUSBParameters)GetProcAddress(dll_ftdi.m_hmodule, "FT_SetUSBParameters");
    if (dll_ftdi.ft_SetUSBParameters == NULL)
    {
printf("Error: Can't Find FT_SetUSBParameters");
return 11;
    }

   
    dll_ftdi.ft_SetLatencyTimer = (PtrToSetLatencyTimer)GetProcAddress(dll_ftdi.m_hmodule, "FT_SetLatencyTimer");
    if (dll_ftdi.ft_SetLatencyTimer == NULL)
    {
printf("Error: Can't Find FT_SetLatencyTimer");
return 12;
    }
   
    dll_ftdi.ft_GetLatencyTimer = (PtrToGetUSBParameters)GetProcAddress(dll_ftdi.m_hmodule, "FT_GetLatencyTimer");
    if (dll_ftdi.ft_GetLatencyTimer == NULL)
    {
printf("Error: Can't Find FT_SetLatencyTimer");
return 13;
    }
    return 0;
}
.......
инициализация:

        pInfo_Message = pInfo;
        FT_STATUS status = dll_ftdi.ft_Open((PVOID)0, &dll_ftdi.m_ftHandle);
        if (status == FT_OK)
        {
            status = dll_ftdi.ft_SetTimeouts(dll_ftdi.m_ftHandle,1000,1000);
            if (status == FT_OK)
            {
                status = dll_ftdi.ft_Purge(dll_ftdi.m_ftHandle,FT_PURGE_RX|FT_PURGE_TX);
                status = dll_ftdi.ft_SetLatencyTimer(dll_ftdi.m_ftHandle,2);
                if (status != FT_OK)
                {
                    dll_ftdi.ft_Close(dll_ftdi.m_ftHandle);
                    pInfo_Message(MSG_TEXT,0,0,"Error write - interface incorrect");
                    return -1;
                }
                /*status = dll_ftdi.ft_SetLatencyTimer(dll_ftdi.m_ftHandle,1);
                if (status != FT_OK)
                    pInfo_Message(MSG_TEXT,0,0,"1-ms incorrect/n");

                status = dll_ftdi.ft_SetLatencyTimer(dll_ftdi.m_ftHandle,0);
                if (status != FT_OK)
                    pInfo_Message(MSG_TEXT,0,0,"0-ms incorrect/n");
                */
                status = dll_ftdi.ft_SetUSBParameters(dll_ftdi.m_ftHandle,128/*in*/,0/*out-не поддержан*/);
                if (status != FT_OK)
                {
                    dll_ftdi.ft_Close(dll_ftdi.m_ftHandle);
                    pInfo_Message(MSG_TEXT,0,0,"Error write - interface incorrect");
                    return -1;
                }
                status = dll_ftdi.ft_GetLatencyTimer(dll_ftdi.m_ftHandle, &ttt);
                sprintf(text,"ft_GetLatencyTimer %d ms\n",int(ttt));
           }
       }

PPPS и максимальный размер буфера... за раз больше 128 лучше не слать) не работает.

ЗЗЗЗЫ или это FTDI 245  была? не помню уже...
« Последнее редактирование: 02-07-2008 15:07 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 02-07-2008 18:30 » 

кстати, разобрался я с этим уже Улыбаюсь Скачал у них дистрибу для "прямой работы с драйвером" , устанавливается через диспетчер устройств. Виртуального кома не появляется, работаю через длл. Больше 128 посылается на ура Улыбаюсь

Работу с компортом заменил в программе так:

написал класс A для работы с USB-конвертором , класс B для кома уже был. Класс Z содержит в себе мемберы обоих классов плюс переменную-текущий тип порта. И всю работу с комом (с классаи B) по всей программе завёл на класс Z , в котором в зависимости от текущего режима работаем либо с комом, либо с USB. Всё идеально Улыбаюсь Красиво получилось
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 04-07-2008 10:38 » 

Ochkarik, а не подскажешь, как снифер сделать для этого драйвера - тупо подглядывать, что было считано FT_READ и записано FT_WRITE ?

(оно, конечно, могу прямо в своей программе это сделать, но так будет не совсем удобно, хочется снифер сделать)
Записан

Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 04-07-2008 11:10 » 

вобще был снифер готовый, USB HDD или USB HHD назывался. демку поставил - очень понравилось.
хотя FTDI своего внутреннего протокола не раскрывают.
так что снифер FR_READ/WRITE только через хуки ихней библиотеки...
PS либо драйвер фильтр садить на ихний драйвер.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 04-07-2008 11:33 » 

1) коли готорвый - поищу

2) так что снифер FR_READ/WRITE только через хуки ихней библиотеки...
 - как это делается ? Опыта не имею


а при чём тут протокол, кстати, мне просто данные нужны, которые гоняются )
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 04-07-2008 12:06 » 

готовый снифер не могу найти (
А у них на сайте в разделе утилит тоже нету ничего похожего
Записан

Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 04-07-2008 12:41 » 

2. тоже ни разу не пробовал)  SetWindowsHookEx. MSDN. пример использования там же.
а раз данные...тогда да... ток так.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 07-07-2008 13:19 » new

ага... вот, дошли руки, и очередной облом: у всех типов хуков коллбэк вида

LRESULT CALLBACK ...(
    int nCode,
    WPARAM wParam,
    LPARAM lParam
);

как же захучить функцию не такого типа ? Или где там будет инфа о содержимом параметров ?
Записан

Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 07-07-2008 14:33 » 

я подозревал это Скромно так...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 07-07-2008 14:40 » 

но ведь как-то же должно это делаться
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 08-07-2008 04:29 » 

может кто знает, как поставить хук на определённую процедуру , расположенную в длл ? Или как это вообще делается
Записан

Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 17-01-2009 21:52 » 

USB Monitor Device Monitoring Studio
Publisher: HHD Software
http://www.hhdsoftware.com/
от 400рэ до 1900рэ (и демки на две недели помоему)
http://www.hhdsoftware.com/Products/home/usb-monitor-pro.html
показывает прям содержимое USB пакетов... правда с непривычки заблудиться можно)

еще у них так же сниферы для COM порта хорошие и т.д.
« Последнее редактирование: 17-01-2009 21:56 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 18-01-2009 17:59 » 

может кто знает, как поставить хук на определённую процедуру , расположенную в длл ? Или как это вообще делается
Вот что я знаю по вопросу универсального перехвата функций (далее - теория, т.к. до практики руки не дошли):
Существует определенный порядок поиска dll: сначала она ищется в каталоге, откуда запущена прога, а потом - в системных каталогах. На это основан следующий метод: в каталог проги кладется dll с именем, аналогичным перехватываемой (вариант метода: dll кладется на место перехватываемой, а оригинальная перемещается куда-то, например - в подкаталог. По такому принципу работает OpenConf для 1С 7.7). Далее в ней реализовываются все функции, которые есть в оригинальной dll, для всех функций пишешь вывоз аналогичной из оригинальной dll, а для нужных (к перехвату) - кроме того добавляешь свой код (до или после вызова - смотря что нужно по задаче).
Сложности метода:
работоемкость (необходимо переопределить все функции)
невозможность определить число параметров нестандартных (не описанных в документации) функций без декомпиляии (в заголовках dll такой инфы нет)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 18-01-2009 18:09 » 

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

Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 18-01-2009 20:33 » 

Кстати - для исследования чужих протоколов полезная прога PortMonitor от Sysinternals: http://technet.microsoft.com/en-us/sysinternals/bb896644.aspx.
По-моему когда-то она распространялась с исходниками
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 12-02-2009 20:01 » 

Алексей1153++, не понял? ты же через библиотечку решил делать?)
то, что в виртуальный com отсылается -  дело десятое... у них там на уровне драйвера свой протокол должен быть реализован, в лучшем случае на уровне библиотеки, но это вряд ли... особо не разбирался) может он и не очень сурьезный, но его они вроде не выкладывали... а чтоб интерфейс драйвера получить - эт надо какой нить снифер на IRP ставить... но в целом честно говоря смысла не вижу. через их библиотечку вполне неплохо работает, железобетонно) на удивление без глюков)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 12-02-2009 20:17 » 

Ochkarik, не понял вопроса Улыбаюсь
Записан

Art
Гость
« Ответ #21 : 14-02-2009 23:43 » 

может тут кто поможет я не программер но суть вопроса в том что не получается связать в одну цепь "ноутбук"-"переходник USB-COM"-"адаптер К-Line"-"ЭБУ автомобиля" ВАЗовских моделей с ГАЗами все в порядке проверено на ПК с COM  все работает (переходник USB готовый от мастер-кит дрова от SilikonLabs
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 16-11-2009 10:04 » 

вот ещё вопрос. Теперь по драйверу  FTDI 2DXX - он не создаёт виртуального порта, но через  FTDI API можно работать c USB портом как с комом.

Устройство конвертирование у нас выполнено в виде шнурка, в котором FTDI микросхема и сидит. И потребовалось такая вещь:

к примеру, каким то образом (ещё не разобрался) я перечисляю в системе все разъёмы USB и мысленно называю их USB1, USB2, ...

В выпадающем списке пользователю предлагается выбрать раъём , выбирает он, скажем, USB2.

При помощи FT_GetDeviceInfoList перечисляю устройства (а из вразумительного там будет только zb индекс устройства, так как ничего в микрочхему не прописано, то есть все параметры там одинаковые). Как же определить, что устроцство конвертора, которое я взял из перечисления , вставлено именно в USB2 ? Сейчас открывается, по сути, любой девайс из воткнутых и не занятых другими процессами.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines