Форум РадиоКот https://radiokot.ru/forum/ |
|
Программирование СОМ-порта на С++ начинающему! Помощь нужна! https://radiokot.ru/forum/viewtopic.php?f=24&t=39084 |
Страница 1 из 1 |
Автор: | genii-2002 [ Пт дек 10, 2010 12:34:57 ] |
Заголовок сообщения: | Программирование СОМ-порта на С++ начинающему! Помощь нужна! |
Помогите, пожалуйста, научиться программировать на С++ (MS Visual C++2010) COM-порт. Причем интересует глубокое понимание процессов, отчасти основы программирования и архитектуры компьютером (основная база есть, немного программирую МК на Ассемблере). Может где-то что-то почитать и т.п. Может кто-то сможет прокурировать меня в этих вопросах. В долгу не останусь)))) В будущем хочу использовать USB-порт как виртуальный СОМ-порт через FTDI. Вообщем буду признателен за любую помощь! |
Автор: | Goodefine [ Пт дек 10, 2010 12:57:50 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
Не слишком давно писал небольшое приложение, которое сидит в трее и притворяется winlirc-ом. Прослушивая при этом виртуальный (или реальный) ком порт - cdc usb (или hid usb - на выбор) и работая при этом как tcp сервер - пересылая видоизмененные данные клиентам, поступивших с порта. В MVS2005... Учится, конечно быстрее всего по статьям в нете. Но толковых мало, а ньюансов много. В частности, передача данных от потока чтения кома-а (критические секции), нюансы связанные именно с cdc... Делал через апи, ибо ни одна библиотека не работала как мне нужно, либо платные... Если что, спрашивайте... |
Автор: | Мурик [ Пт дек 10, 2010 15:04:50 ] | ||
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну | ||
genii-2002 писал(а): В будущем хочу использовать USB-порт как виртуальный СОМ-порт через FTDI. В архиве есть DLL'ка, позволяющая работать как с железным так и с виртуальным COM портом.
|
Автор: | genii-2002 [ Пт дек 10, 2010 18:41:47 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
Друзья, может кто поделиться своим опытом! Как и где вы добывали знания? С какими проблемами сталкивались в освоении программирования СОМ порта и т.п.? Что читали и и где учились? |
Автор: | Goodefine [ Пт дек 10, 2010 19:13:28 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
genii-2002 писал(а): ... где вы добывали знания?... Я ж написал - в гугле! А проблемы сейчас вам ничего не скажут - столкнетесь, тогда и решать будем.. |
Автор: | YS [ Пт дек 10, 2010 21:13:20 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
Цитата: В будущем хочу использовать USB-порт как виртуальный СОМ-порт через FTDI. Реальный и виртуальный COM - разные вещи. Капитан Очевидность подсказывает, что для работы с микросхемами FTDI надо читать D2XX programmer's guide (это мануал на библиотеку от FTDI для работы с их микросхемами) и даташиты на сами микросхемы (самая распротраненная FT232R). Можно, конечно, и WinAPI использовать (гуглите функции CreateFile(...), WriteFile(...), ReadFile(...), CloseHandle(...) ), но специальная библиотека от FTDI дает гораздо большие возможности. |
Автор: | avreal [ Сб дек 11, 2010 13:22:46 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
Гораздо больше возможностей она даёт по не-компортовым вещам. В режиме «комп-порта» там в основном эмуляция того же, что в WinAPI плюс возможность читать/писать EEPROM-ку и уменьшить время таймаута отправки в комп недозаполненого буфера в микросхеме. По умолчанию 16 милисекунд и это крепко садит пропускную способность. Но EEPROM-ку читать-писать нужно сначала придумать для чего, а таймаут можно раз и навсегда уменьшить в свойствах порта в windows. Более того, я на этот таймаут и не нарывался вообще, хотя программа для работы с COM-портом через WinAPI была написана, пожалуй, до того, как миросхемы FTDI появились в природе. Просто у меня была ещё под Win98 выписана событийная работа с COM-портом и применён пакетный протокол, основанный на рамке SLIP (её же Леонид Иванович в wake использовал). Любой пакет заканчивается флаговым байтом SLIP_END. Ком-порту по WinAPI при инициализации DCB устанавливается event char на этот флаговый байт SLIP_END. Программа, точнее, поток обслуживания COM-порта, не дёргается за каждым байтом, а через WaitCommEvent (в случае работы через OVERLAPPED IO - через WaitForMultipleObjects) ждёт события прихода концевого флага. Потом смотрит, сколько у Win в буфере ком-порта набралось данных и вычитывает ровно столько одним махом, потом разбирает. Ну так вот этот же event character при работе с виртуальным портом FTDI передаётся через VCP драйвер в микросхему и та по этому байту делает отправку как по активации ножки send immedite — не ожидая даже минимальное время таймаута заполнения FIFO. Программа, написанная таким образом в 1997-98 году для обычного ком-порта, забегала с FT8U245 на отличных скоростях Ограничителем выступала мега128. |
Автор: | DX168B [ Пт дек 17, 2010 21:08:18 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
Такс..... Я не новичок в программировании COM портов, но есть у меня одна проблема с этим портом. Выкладываю отрывки Сишного кода, а потом проблему. Код: char in_p[50] = "."; int RcvCounter=0; HANDLE hFile = CreateFile("com1", GENERIC_READ|GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == INVALID_HANDLE_VALUE){display("COM Error!");} else{display("Порт открыт");} DWORD dwBytesRead1 = 0; while(1) { ReadFile(hFile, in_p, sizeof(in_p), &dwBytesRead1, NULL); Sleep(1); if(dwBytesRead1 != 0){break;} } RcvCounter = dwBytesRead1; cout <<in_p<<" : "<<RcvCounter<<endl; И такой вариант: Код: char in_p[50] = "."; int RcvCounter=0; HANDLE hFile = CreateFile("com1", GENERIC_READ|GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if(hFile == INVALID_HANDLE_VALUE){display("COM Error!");} else{display("Порт открыт");} DWORD dwBytesRead1 = 0; while(dwBytesRead1 == 0) { ReadFile(hFile, in_p, sizeof(in_p), &dwBytesRead1, NULL); Sleep(1); } RcvCounter = dwBytesRead1; cout <<in_p<<" : "<<RcvCounter<<endl; Это два варианта моих отрывков кода, который должен сначала открыть порт, за тем застрять в цикле, пока что-нибудь не придёт. Используется тут WinAPI. Настройки битрейта порта и прочих его параметров, тут я не привёл. Но там вроде всё нормально. Всё работает нормально, но если нагрузить процессор хотя бы на 60-70% так начинаются траблы. Не принимаются все байты с порта. И количество принятых байтов может отличаться от содержимого в RcvCounter. Что мне сделать, чтобы от этого избавиться. Стабильность приёма данных очень важна. |
Автор: | DX168B [ Сб дек 18, 2010 00:26:04 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
Ай дурак я. Разобрался. Таймауты порта по нулям выставил. В итоге - поток ещё не успел прочитаться, а таймаут истёк. Вот такие пЕроги. |
Автор: | genii-2002 [ Пт дек 24, 2010 15:54:16 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
так кто может прокурировать мое обучение? Сейчас осваиваю С++ в MS Visual Studio 2010. Как ыставлять логические уровни на сом-порт? |
Автор: | Engineer_Keen [ Пт дек 24, 2010 16:47:56 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
Не помню как остальными, но линиями DTR и RTS можно рулить через функцию EscapeCommFunction |
Автор: | DX168B [ Пт дек 24, 2010 17:56:00 ] | ||
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну | ||
Объяснять долго. Короче...... вот в архиве мой изврат (класс для работы с COM портом) Можешь откомпилировать её как DLL (он и рассчитан на компиляцию в DLL файл) Ищи в классе функцию: Код: extern "C" __declspec (dllexport) void DXCOM::SetLine(OUT_LINES_NAME ln, bool state) { if(!state) return ; unsigned char value; if(ln == DTR) { if(state) value = 6; else value = 5; } if(ln == RTS) { if(state) value = 4; else value = 3; } EscapeCommFunction(m_hFile, value); } Если не будут пахать линии DTR и RTS, то замени параметры DCB на: Код: dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
|
Автор: | madman64 [ Вс янв 03, 2021 16:55:05 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
А можно подробнее. мне не все понятно. И главное: так ли работает код в линукс системах? Я просто хочу написать драйвер для ком мыши в современной Mageia 7. Заранее огромное спасибо за подсказки. |
Автор: | Jack_A [ Сб янв 09, 2021 11:27:28 ] |
Заголовок сообщения: | Re: Программирование СОМ-порта на С++ начинающему! Помощь ну |
А ничего, что последний пост в этой теме - 11 лет тому назад? |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |