Dr.Yevhenius
|
|
« : 30-06-2010 08:13 » |
|
У меня есть джойстик, который подключается к порту СОМ. Хочу для него написать драйвер. Но перед этим хотелось бы точно знать, что по нажатию кнопок на джойстеке в порт действительно отправляется информация. Мне нужна программа, которая может любым образом отобразить поступившую с СОМ информацию... Можете посоветовать?
|
|
« Последнее редактирование: 10-11-2010 07:21 от Джон »
|
Записан
|
|
|
|
baldr
|
|
« Ответ #1 : 30-06-2010 08:20 » |
|
Поиском в гугле нашел много ссылок: http://www.google.ru/search?q=com+port+snifferПопробуй одну из этих программ. К сожалению, своего опыта в этом нет и посоветовать конкретного ничего не могу.
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
Золотая Лань
Молодой специалист
Offline
Пол:
|
|
« Ответ #2 : 30-06-2010 08:29 » |
|
послушайте… я конечно не доктор, но разве hyperterminal, штатно входящий в состав Windows, не делает именно это?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 30-06-2010 08:45 » |
|
Золотая Лань, не, гипер отпадает QoI, что нибудь вроде LGComSpy надо. Только он 1 и 2 порты умеет, если номер больше - то что -то другое надо искать это тоже Realterm - даже получше будет
|
|
« Последнее редактирование: 30-06-2010 08:54 от Алексей1153++ »
|
Записан
|
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #5 : 01-07-2010 01:37 » |
|
Спасибо за ответы!
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #6 : 12-07-2010 07:27 » |
|
Подскажите пожалуйста: если я открыл СОМ-порт (методом CreateFile), закрыть его мне нужно функцией CloseHandle или DeleteFile?
Я использую CloseHandle, но если неправильно, то напишите.
|
|
« Последнее редактирование: 12-07-2010 07:41 от QoI »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #7 : 12-07-2010 08:13 » |
|
CloseHandle - правильно.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Dr.Yevhenius
|
|
« Ответ #8 : 12-07-2010 18:03 » |
|
Работал по примеру https://forum.shelek.ru/index.php/topic,7459.0.html. Но как только хочу что-то прочитать с порта, прога зависает, то есть сигналов/данных нет. Возможно сам джойстик их не посылает. Я же надеюсь, что у меня в коде где-то ошибка. Если вас не затруднит, посмотрите, пожалуйста, мой код. Открытие порта: char portIndent[10]; sprintf(portIndent, "\\\\.\\COM%d", no); // no - это номер порта.
port = CreateFile(portIndent, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); if(port != INVALID_HANDLE_VALUE) { opened = true; DCB dcb; if(GetCommState(port, &dcb) == 0) { this->close(); throw COMDCBReadErrorException(); } else { dcb.fOutX = 1; dcb.fInX = 1; dcb.fTXContinueOnXoff = 1; dcb.fDtrControl = 1; dcb.fRtsControl = 0; dcb.fOutxDsrFlow = 0; dcb.fOutxCtsFlow = 0; dcb.XoffChar = 0x13; dcb.XonChar = 0x19; SetCommState(port, &dcb); } } else { success = opened = false; }
Reading: if(!opened) throw COMPortIsUnopenedException(); else { char inputBuffer[COM_BUFFER_SIZE] = {0}; DWORD recd = 0; if(FALSE == ReadFile(port, // тут происходит остановка :(. inputBuffer, COM_BUFFER_SIZE - 1, &recd, NULL ) ) { throw COMUnableToReadException(); } else { if((recd > 0) && (recd < COM_BUFFER_SIZE)) { char* copy = new char[COM_BUFFER_SIZE] for(unsigned int i = 0; i < recd; ++i) copy[i] = inputBuffer[i]; copy[recd] = '\0'; this->clear(); buffer = copy; copy = 0; } else { this->clear(); }
return buffer; } }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 13-07-2010 10:52 » |
|
может быть, проще сделать inputBuffer не локальным, тем самым избавиться от char* copy = new char[COM_BUFFER_SIZE] и прочитать (правильно настроив таймайту) так (указатель на буфер передать, естественно, в функцию): if(!opened) { return 0;//прочитано 0 байтов } else { DWORD recd = 0; if(!ReadFile(port,inputBuffer,COM_BUFFER_SIZE - 1,&recd,NULL)) { return 0;//прочитано 0 байтов } else { return recd; } }
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #10 : 09-11-2010 16:01 » |
|
Снова вернулся к оживлению джойстика... Из всех портов от 0 до 255 все возвращают INVALID_HANDLE_VALUE, за исключением №1 (\\.\СОМ1); последний инициализацию проходит успешно, но останавливается на части кода Проблема в том, что джойстик этот от какого-то караоке (сейчас нету ни его, ни инструкции к нему). Может быть, что разъём похож на RS-232 ( http://ru.wikipedia.org/wiki/Файл:RS-232.jpeg)(а таки похож), но стандарт иной?
|
|
|
Записан
|
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #12 : 09-11-2010 22:21 » |
|
RXL, нет, у меня 9-контактный раъем, в точности, как на рисунке в Википедии.
|
|
« Последнее редактирование: 10-11-2010 14:46 от Dr.Y »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #13 : 14-11-2010 13:01 » |
|
Может тему стоит перенести в тематический раздел?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|