Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 02-07-2008 11:31 » |
|
пока решил сюда тему создать.
Вопрос такой: кто пользовался микроконтроллером FT232BM ( это эмулятор ком порта, который работает через USB )
пока так удочку закинул - чтобы найти, кому потом глупые вопросы позадавать )
И имеется ли альтернативное решение, не только этот МК ?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #2 : 02-07-2008 12:04 » |
|
вот вот, и у нас такой кабель, только дровина, с ним идущая, ставит в систему кроме самого девайса ещё виртуальный ком, который нахрен не нужен. Пытаюсь найти, как напрямую работать из программы с драйвером.
Кстати, Джон, скажи, где брал кабель и драйвер - может мы тоже перекинемся на него ? )
(а нужно для чего - у нас куча приборов на коме сидит, исторически сложилось, а сейчас появляются мамские платы, у которых кома нет, зато усб - как винограда)
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Online
Пол:
|
|
« Ответ #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
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 02-07-2008 18:30 » |
|
кстати, разобрался я с этим уже Скачал у них дистрибу для "прямой работы с драйвером" , устанавливается через диспетчер устройств. Виртуального кома не появляется, работаю через длл. Больше 128 посылается на ура Работу с компортом заменил в программе так: написал класс A для работы с USB-конвертором , класс B для кома уже был. Класс Z содержит в себе мемберы обоих классов плюс переменную-текущий тип порта. И всю работу с комом (с классаи B) по всей программе завёл на класс Z , в котором в зависимости от текущего режима работаем либо с комом, либо с USB. Всё идеально Красиво получилось
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 04-07-2008 10:38 » |
|
Ochkarik, а не подскажешь, как снифер сделать для этого драйвера - тупо подглядывать, что было считано FT_READ и записано FT_WRITE ?
(оно, конечно, могу прямо в своей программе это сделать, но так будет не совсем удобно, хочется снифер сделать)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #7 : 04-07-2008 11:10 » |
|
вобще был снифер готовый, USB HDD или USB HHD назывался. демку поставил - очень понравилось. хотя FTDI своего внутреннего протокола не раскрывают. так что снифер FR_READ/WRITE только через хуки ихней библиотеки... PS либо драйвер фильтр садить на ихний драйвер.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #8 : 04-07-2008 11:33 » |
|
1) коли готорвый - поищу
2) так что снифер FR_READ/WRITE только через хуки ихней библиотеки... - как это делается ? Опыта не имею
а при чём тут протокол, кстати, мне просто данные нужны, которые гоняются )
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 04-07-2008 12:06 » |
|
готовый снифер не могу найти ( А у них на сайте в разделе утилит тоже нету ничего похожего
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #10 : 04-07-2008 12:41 » |
|
2. тоже ни разу не пробовал) SetWindowsHookEx. MSDN. пример использования там же. а раз данные...тогда да... ток так.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 07-07-2008 13:19 » |
|
ага... вот, дошли руки, и очередной облом: у всех типов хуков коллбэк вида
LRESULT CALLBACK ...( int nCode, WPARAM wParam, LPARAM lParam );
как же захучить функцию не такого типа ? Или где там будет инфа о содержимом параметров ?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 07-07-2008 14:33 » |
|
я подозревал это
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 07-07-2008 14:40 » |
|
но ведь как-то же должно это делаться
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 08-07-2008 04:29 » |
|
может кто знает, как поставить хук на определённую процедуру , расположенную в длл ? Или как это вообще делается
|
|
|
Записан
|
|
|
|
|
Kivals
|
|
« Ответ #16 : 18-01-2009 17:59 » |
|
может кто знает, как поставить хук на определённую процедуру , расположенную в длл ? Или как это вообще делается
Вот что я знаю по вопросу универсального перехвата функций (далее - теория, т.к. до практики руки не дошли): Существует определенный порядок поиска dll: сначала она ищется в каталоге, откуда запущена прога, а потом - в системных каталогах. На это основан следующий метод: в каталог проги кладется dll с именем, аналогичным перехватываемой (вариант метода: dll кладется на место перехватываемой, а оригинальная перемещается куда-то, например - в подкаталог. По такому принципу работает OpenConf для 1С 7.7). Далее в ней реализовываются все функции, которые есть в оригинальной dll, для всех функций пишешь вывоз аналогичной из оригинальной dll, а для нужных (к перехвату) - кроме того добавляешь свой код (до или после вызова - смотря что нужно по задаче). Сложности метода: работоемкость (необходимо переопределить все функции) невозможность определить число параметров нестандартных (не описанных в документации) функций без декомпиляии (в заголовках dll такой инфы нет)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 18-01-2009 18:09 » |
|
Kivals, нет, так в этом случае не пойдёт Я вышел из положения проще - написал "гляделку" прямо в своей программе - что отправляю в "ком-порт", а что принимаю оттуда
|
|
|
Записан
|
|
|
|
|
Ochkarik
|
|
« Ответ #19 : 12-02-2009 20:01 » |
|
Алексей1153++, не понял? ты же через библиотечку решил делать?) то, что в виртуальный com отсылается - дело десятое... у них там на уровне драйвера свой протокол должен быть реализован, в лучшем случае на уровне библиотеки, но это вряд ли... особо не разбирался) может он и не очень сурьезный, но его они вроде не выкладывали... а чтоб интерфейс драйвера получить - эт надо какой нить снифер на IRP ставить... но в целом честно говоря смысла не вижу. через их библиотечку вполне неплохо работает, железобетонно) на удивление без глюков)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 12-02-2009 20:17 » |
|
Ochkarik, не понял вопроса
|
|
|
Записан
|
|
|
|
Art
Гость
|
|
« Ответ #21 : 14-02-2009 23:43 » |
|
может тут кто поможет я не программер но суть вопроса в том что не получается связать в одну цепь "ноутбук"-"переходник USB-COM"-"адаптер К-Line"-"ЭБУ автомобиля" ВАЗовских моделей с ГАЗами все в порядке проверено на ПК с COM все работает (переходник USB готовый от мастер-кит дрова от SilikonLabs
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 16-11-2009 10:04 » |
|
вот ещё вопрос. Теперь по драйверу FTDI 2DXX - он не создаёт виртуального порта, но через FTDI API можно работать c USB портом как с комом.
Устройство конвертирование у нас выполнено в виде шнурка, в котором FTDI микросхема и сидит. И потребовалось такая вещь:
к примеру, каким то образом (ещё не разобрался) я перечисляю в системе все разъёмы USB и мысленно называю их USB1, USB2, ...
В выпадающем списке пользователю предлагается выбрать раъём , выбирает он, скажем, USB2.
При помощи FT_GetDeviceInfoList перечисляю устройства (а из вразумительного там будет только zb индекс устройства, так как ничего в микрочхему не прописано, то есть все параметры там одинаковые). Как же определить, что устроцство конвертора, которое я взял из перечисления , вставлено именно в USB2 ? Сейчас открывается, по сути, любой девайс из воткнутых и не занятых другими процессами.
|
|
|
Записан
|
|
|
|
|