Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 17-08-2003 16:41 » |
|
Как программу, написанную на VC6++ под Windows 98 (и работающую с com портом) заставить БЫЧИТЬ под Windows XP ?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #1 : 17-08-2003 16:47 » |
|
Она обязана работать если используются CreateFile WriteFile и т.д. Если переделывалось с DOS читай устройство приема и отправки данный с COM портом на этом сайте.
Так как понял, что 3 сообщения 2 от гостя + это - твои, то стер остальные и повторяю, проблема не в версиях Windows а в твоей программе - подробности не помешают.
И не надо в будущем писать 3-5 раз одно и тоже, есил меня нет дома и народ отдыхает в воскресенье, то это ничего не даст.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #2 : 18-08-2003 06:01 » |
|
И в форум по С/С++ тоже писать не надо, это в форум по Windows.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #3 : 18-08-2003 17:10 » |
|
С повторениями - это я по неопытности лопухнулся. :? Да, я использовал функции CreateFile( ), WriteFile( ), ReadFile( ). Я сделал вывод количества отправленных (функцией WriteFile) в порт байт в отдельное окно. Под W98 отправленное количество байт равно отправляемому, а под WXP WriteFile возвращает 0 записанных байт!!! (компиляция проги - под W98)
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #4 : 18-08-2003 18:21 » |
|
Понятно... то что не понятно почему.
1. Давай попробуем исследовать проблему, как долго попытки отработать отсылку вызывают 0 если сделать цикл, с попыткой протолкнуть в порт данные...
2. Откомпилируй программу под XP и попробуй прокатать ее под 98 - возможно это решит проблдему.
3. Проверь что возвращает открытие порта и проверь как ты открываешь порт (перекопируй сюда тот кусок кода, который делает эти операции)...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #5 : 19-08-2003 05:27 » |
|
В старом форуме Grom приводил кусок кода для работы с com портом, я его компилил и он работал на Win2k, так что тот же кусок будет работать и на XP. Вот этот код(там кое что о меня, оригинал я уже не найду) DWORD dwError; DCB PortSetControl; COMMTIMEOUTS CommTimeouts; WCHAR* lpszPortName = L"COM1";
HANDLE hPort = CreateFileW (lpszPortName, // Pointer to the name of the port GENERIC_READ | GENERIC_WRITE, // Access (read-write) mode 0, // Share mode NULL, // Pointer to the security attribute OPEN_EXISTING,// How to open the serial port 0, // Port attributes NULL); // Handle to port with attribute // to copy if(hPort == INVALID_HANDLE_VALUE) { dwError = GetLastError(); wprintf(L"Error == %d\n", dwError); return 1; } PortSetControl.DCBlength = sizeof (DCB); GetCommState(hPort,&PortSetControl); //Set data PortSetControl.BaudRate=CBR_19200; PortSetControl.Parity=NOPARITY; PortSetControl.ByteSize=8; PortSetControl.StopBits=ONESTOPBIT; PortSetControl.fBinary = TRUE; // Binary mode; no EOF check PortSetControl.fParity = TRUE; // Enable parity checking PortSetControl.fOutxCtsFlow = FALSE; // CTS output flow control off PortSetControl.fOutxDsrFlow = FALSE; // DSR output flow control off PortSetControl.fDtrControl = DTR_CONTROL_DISABLE; // DTR flow control off PortSetControl.fDsrSensitivity = FALSE; // DSR sensitivity PortSetControl.fTXContinueOnXoff = TRUE; // XOFF continues Tx PortSetControl.fOutX = FALSE; // No XON/XOFF out flow control PortSetControl.fInX = FALSE; // No XON/XOFF in flow control PortSetControl.fErrorChar = FALSE; // Disable error replacement PortSetControl.fNull = FALSE; // Disable null stripping PortSetControl.fRtsControl = RTS_CONTROL_DISABLE; // RTS flow control off PortSetControl.fAbortOnError = FALSE; // Do not abort reads/writes on //Set to port SetCommState(hPort,&PortSetControl); //Settings for timeouts GetCommTimeouts(hPort, &CommTimeouts); //Set data CommTimeouts.ReadIntervalTimeout = MAXDWORD; CommTimeouts.ReadTotalTimeoutMultiplier = 0; CommTimeouts.ReadTotalTimeoutConstant = 0; CommTimeouts.WriteTotalTimeoutMultiplier = 0; CommTimeouts.WriteTotalTimeoutConstant = 0; //Set to port SetCommTimeouts(hPort, &CommTimeouts);
char* str = "THIS IS THE TEST SEQUENCE TO TEST TERMINAL SERIAL PORT SHARING"; DWORD dwBytesWrite; if(WriteFile(hPort, str, strlen(str), &dwBytesWrite,NULL)) wprintf(L"Success. dwBytesWrite ==%d!\n",dwBytesWrite); else wprintf(L"Error!\n");
CloseHandle(hPort);
|
|
« Последнее редактирование: 19-11-2007 17:01 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 19-08-2003 12:31 » |
|
если честно, не ожидал такого внимания к новичку - до этого я попадал на какой-то форум, где мне так и не ответили. теперь по пунктам: 1) Буду искать дистрибу XP и ставить вторую ОС для опытов. До этого в WXP я запускал программу на компе у заказчика, а он живёт далеко в горах (буквально, Златоуст ведь). 2)открытие порта у меня так //функция открытия порта bool CProbnikView::OpenPort(CString *port, DWORD BaudRate,BYTE ByteSize, BYTE Parity, BYTE StopBits,DWORD portTimeoutInterval) { DCB portDCB; COMMTIMEOUTS portCommTimeOuts; //создаём описатель порта portHandle = CreateFile(*port,GENERIC_READ | GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); if(portHandle == INVALID_HANDLE_VALUE) {//не получилось открыть порт return false; } //установка размеров очередей I/O SetupComm(portHandle,(DWORD)CommInQueueSize,(DWORD)CommOutQueueSize); //создаём и заполняем структуру DCB (portDCB) if(!GetCommState(portHandle, &portDCB)) {//какая-то ошибка return false; } portDCB.BaudRate = BaudRate; portDCB.fBinary = true; portDCB.fOutxCtsFlow = false; portDCB.fOutxDsrFlow = false; portDCB.fDtrControl = DTR_CONTROL_HANDSHAKE; portDCB.fDsrSensitivity = false; portDCB.fNull = false; portDCB.fRtsControl = RTS_CONTROL_DISABLE; portDCB.fAbortOnError = false; portDCB.ByteSize = ByteSize; portDCB.Parity = Parity; portDCB.StopBits = StopBits; //структурой DCB настраиваем порт if(!SetCommState(portHandle, &portDCB)) {//какая-то ошибка return false; } //создаём и заполняем структуру COMMTIMEOUTS (portCommTimeOuts) if(!GetCommTimeouts(portHandle, &portCommTimeOuts)) {//какая-то ошибка return false; } portCommTimeOuts.ReadIntervalTimeout = portTimeoutInterval; portCommTimeOuts.ReadTotalTimeoutMultiplier = TimeoutChar; portCommTimeOuts.ReadTotalTimeoutConstant = TimeOutWait; portCommTimeOuts.WriteTotalTimeoutMultiplier = 0; portCommTimeOuts.WriteTotalTimeoutConstant = 0; //структурой COMMTIMEOUTS настраиваем порт if(!SetCommTimeouts(portHandle, &portCommTimeOuts)) {//какая-то ошибка return false; } //очистка буферов ClearCommRWbufer(); return true;//всё нормально, порт открыт }
3) Спасибо ГРОМУ и СлавИ за. Внимательно просмотрю сей коддд. 4)подскажите, как в окне "Быстрый ответ" вставить табуляцию :oops:
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #7 : 19-08-2003 12:35 » |
|
Еще учти, что com порт может открыть только один процесс- пока он его не закроет, другой процесс открыть его не сможет. Проверь- не открыл ли кто com порт у твоего заказчика до тебя.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #8 : 19-08-2003 13:21 » |
|
Не правда, SlavaI, существует OVERLAPPED режим при котором я могу пользоваться портом из нескольких процессов... Для этого последний параметр OVERLAPPED который в примерах я ставил NULL надо ставить указатель на структуру, точно счас не скажу как заполнять, но там просто. Это делает разделяемый ресурс... Алексей1153, если честно, не ожидал такого внимания к новичку
На том стоим. 1. А на ком порту случаем мыша не висела у заказчика а то я так тоже разок глюк поймал, когда воткнул в COM порт GPS а его Winda опознала как вторую мышь типа радио мышки, и у меня по экрану мышь скакала, аки бэшенный горный казель... 2. ClearCommRWbufer();
Что чистит эта функция - я ее не использовал 3. Код по ходу дела отличается наличием проверки HANDSHAKE у тебя. И отсутствием у меня... По делу еще вопрос - где описан portHandle, а то я что-то не вижу, и хоть это влиять не должно, но мало ли как там все поворачивается при работе с 2-мя COM портами.... 4. Увы никак - ни в быстром ответе ни в обычном. Табуляция в IE работает на перескок между полями на сайте - используй вставки пробелов 2-4 штуки Copy-Paste.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 19-08-2003 16:37 » |
|
:arrow: про совместное открытие я в курсе. Но в моей проге юзер сам выбирает имя порта и открывает его. Если порт не - то это сразу видно. Но порт-то открывается! :arrow: по недосмотру я не расписал функцию: //очистка буферов и облом текущих операций I/O void CProbnikView::ClearCommRWbufer() { PurgeComm(portHandle, PURGE_TXCLEAR| PURGE_RXCLEAR| PURGE_TXABORT| PURGE_RXABORT) ;}
:arrow: portHandle - это у меня глобальная переменная. Она одна на всех, мы за це... эээ... Одновременно в проге может быть открыт только 1 порт . :?: как вместо слова "Цитата:" написать другое?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #10 : 19-08-2003 18:06 » |
|
Вместо quote в [] набери code в [] а вообще можешь зайти в форму обычного ответа - линк слева под быстрым и там все возможности потыкать посмотреть
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 20-08-2003 18:26 » |
|
Я установил MS WinXP home edition. Откомпилировал прогу под XP и под отладчиком обнаружилось вот шо:
:arrow: порт открывается нормально :arrow: функция bool WriteFile() возвращает false, а идущая за ней :arrow: функция GetLastError() возвращает 0x57 - что это за оши?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #12 : 20-08-2003 19:34 » |
|
0х57 = 87 ошибка... Смотрим MSDN на сайте мелкомягких http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/system_error_codes.asp87 The parameter is incorrect. ERROR_INVALID_PARAMETER Смотрим в твой код... упс не получилось твой код только открытие порта... Думаю у тебя траблы где та в маленьком символе не поставленном или поставленном, 98 пропускает воспринимает как данность а XP нет... Вот в чем ИМХО может быть фишка... Кстати - почему только вечерами заходишь тут людей вечером маловато - отдыхает народ.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 21-08-2003 06:49 » |
|
я жа работаю - лаборантом, а там сейчас типаремонт, вот и напрягли меня. Получается включаться только вечером часов с 18:00 и до победного. Или вот как сейчас - на обеде, но уже ухожу. Какую часть кода выложить? Да, ещё - при сборке под XP на кнопках проги вместо Вел.Рус. какая-то хрень. Кстати сериализация робит, а там ведь та же WriteFile() Н, ладно, а то начальство порвёт как тузик тряпку :twisted:
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #14 : 21-08-2003 09:07 » |
|
Понятно...
Какой код выкладывать - сложно сказать - скорее всего ошибка в том, что ты передаешь указатель вместо самой переменной или наоборот. Выложи для начала то место где происходит эта ошибка.
Во вторых - попробуй написать отдельно программку, которая займется тем жесамым но сгенерена будет под ХР. Просто скопируй код в другой файл в другой проект который создай в ХР именно код а не файл - дабы установки проекта сохранились и посмотри.
Отследи содержимое буферов, которые передаешь.
Насчет русского - это у тебя в настройках проекта барахлит что-то...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #15 : 21-08-2003 09:56 » |
|
Да, ещё - при сборке под XP на кнопках проги вместо Вел.Рус. какая-то хрень.
Надо или UNICODE приложение собирать, или настроить правильно шрифты для non Unicode приложений в самой операционке.
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #16 : 21-08-2003 10:03 » |
|
Да там в VC 6 есть в ресурсах, установка языковой поддержки - поставь либо Уникод либо просто Русский.
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #17 : 22-08-2003 13:07 » |
|
:arrow: Выложи для начала то место где происходит эта ошибка.
//посылка стартового байта и ожидение сигнала Ring от осцила. //Принимает стартовый байт в m_oscCurrentDirByte.Если всё прошло //нормально, возвращает true. Если вернула false, что-то не так bool CProbnikView::SendStartByteWaitRing() { MSG message; DWORD len,ModemStatus; bool b; BYTE bufer[]=|0x03,0,0"; BYTE helpbufer; //составляем команду "0x03,0xNN,0xNN" bufer[1]=bufer[2]=m_oscCurrentDirByte; //шлём команду //len - количество отправленных байт len=WritePort(bufer,3);////ЗДЕСЬ КОСЯК if (len!=3) ;//// len==0 |//что-то не так MessageBox("не удалось поместить команду в буфер порта"); return false; } else |//команда послана
..... } return true; }
//запись в порт. //возвращает количество записанных байт DWORD CProbnikView::WritePort(BYTE *bufer, WORD numbytes) { COMSTAT portComState; DWORD Written; if(numbytes!=0) { //освобождение блокировки от бывшей ошибки (если ошибка была) ClearCommError(portHandle, &Written, &portComState); if(WriteFile(portHandle,bufer,numbytes,&Written,NULL)) |return Written;} } return 0; }
:arrow: насчёт Отследи содержимое буферов, которые передаешь - имеется в виду буфер вывода порта(я не знаю как его просмотреть) или буфер в озу? То есть что что-то может поменять содержимое массивов процесса? :arrow: Во вторых - попробуй написать отдельно программку, которая займется тем жесамым но сгенерена будет под ХР. Просто скопируй код в другой файл в другой проект который создай в ХР именно код а не файл - дабы установки проекта сохранились и посмотри.
пойду попробую to do :arrow: в настройках VC я такого что-то не могу найти про шрифты(может, устал, ещё пороюсь). :arrow: Надо ... настроить правильно шрифты для non Unicode приложений в самой операционке.
- а это где настраивается?
|
|
« Последнее редактирование: 19-11-2007 17:06 от Алексей1153++ »
|
Записан
|
|
|
|
Джон
Гость
|
|
« Ответ #18 : 22-08-2003 14:57 » |
|
Попробуй убрать FILE_FLAG_OVERLAPPED из CreateFile.
MSDN для \WriteFile If hFile was opened with FILE_FLAG_OVERLAPPED, the lpOverlapped parameter must not be NULL. It must point to a valid OVERLAPPED structure. If hFile was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function can incorrectly report that the write operation is complete.
На счёт UNICODa в винде - прямо помочь не смогу - винда у меня немецкая и как это по русски называется - не знаю. Попробуй там где ты языки вставляешь (добавляешь). Типа "язык используемый по умолчанию без поддержки UNICODE"
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #19 : 22-08-2003 17:50 » |
|
оно работает :!: :!: :!: :!: :!: :!: Спасибо,Джон, (попал прямо в тыблочко), ГРОМ и SlavaI !!! Подведём итоги: :idea: неважно, под какими форточками (98/XP) собрана прога, и неважно под какой она запущена, но :arrow: под W98 com порт работает как в асинхронном режиме(dwFlagsAndAttributes==FILE_FLAG_OVERLAPPED), так и в синхронном (dwFlagsAndAttributes==NULL). Несмотря ( !) на то, что первое,как я понимаю, у меня было применено некорректно - я не заполнял структуру OVERLAPPED ); :arrow: под WXP в синхронном всё работает, а вот асинхронный режим просто так не проходит. если я что-то не так высказал - исправляйте, буду только благодарен не прощаюсь, вопросы будут ещё
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 21-10-2004 19:59 » |
|
Вот, надо же - вернулся к самой первой своей теме на Шелеке Ещё вопрос на ту же тему - всё работает, но на скорости 9600 не читается из порта - вернее читается 0 байт... (но записывается - смотрел снифером ) На скорости 115200 всё нормально, на других скоростях пока не пробовал кто встречался с таким?
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #21 : 22-10-2004 06:18 » |
|
Алексей1153 под W98 com порт работает как в асинхронном режиме [...], так и в синхронном [...]
Не так (ИМХО). Под 98 нет асинхронного режима, независимо от этого флага, т.е. порт работает всегда в синхронном режиме. Хотя в доке только что я этого не нашел, но заставить работать порт в таком режиме у меня в свое время не получилось
|
|
|
Записан
|
|
|
|
Серж
Гость
|
|
« Ответ #22 : 22-10-2004 06:37 » |
|
Алексей1153, Kivals, я сталкивался с подобным, когда программа прекрасно работавшая под WinNT c Com-портом в асинхронном режиме, совершенно перестала работать в Win98. У меня тогда не было времени разбираться, я просто перешел к синхронному режиму, но у меня не сложилось впечатления, что асинхронный прием не работает, может быть, просто нужно было изменить код.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #23 : 22-10-2004 07:07 » |
|
Серж, Возможно, но у меня остаточное впечатление, что когда я разбирался в каком-то из форумов нешел именно, что не работает. Причем для Communications Resources, к которым относится СОМ порт, для обычных файлов - все Ок Если у кого-то есть работающий кусок кода в асинхронном режиме для 98 - буду очень рад увидеть.
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #24 : 22-10-2004 07:56 » |
|
Алексей1153, Я такое встречал. Сам нарывался. Объяснить не могу. Но подозрение скорей на железо, а не на 98. Подсаживается питание порта. Для 9600 ему нужно немножечко больше напряжения. Потому как и на 2400 было то же самое, а на 19600 заработало
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 22-10-2004 14:59 » |
|
Kivals, Не так (ИМХО).
не спорю - я только в синхронном работал Sla, значит буду канючить у железячников повысить скорость приборов :new_shot:
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #26 : 22-10-2004 15:13 » |
|
Алексей1153, канючить низзя Докажи, что виноват порт, а не твоя программа. А скорость приборов не так уж просто и повысить. Тебе прощее изменить скорость. При повышении скорости - увеличиваются помехи. Дальше сам знаешь...
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #27 : 22-10-2004 18:26 » |
|
Sla, неа, именно приборов - они передают с определённой скоростью, там , вроде , даже микросхема com порта стоит, хотя утверждать не стану - не разбирался я с железками, пусть железячники наши капусты себе ломают Конечно я всё на порт валить буду
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #28 : 23-10-2004 12:01 » |
|
Алексей1153, Если я правильно понял суть проблемы - тебе нужно попробовать оттестировать связь прибора с твоей программой на другом компьютере (желательно совершенно другой конфигурации). Если стоит микросхема в приборе - то изменять скорость не сложно, но в определенных пределах.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #29 : 01-12-2004 14:17 » |
|
Люди! нашёл косяк! вот в этом дело и было: portDCB.fDsrSensitivity = TRUE; у меня так было, я переправил на FALSE - и всё заработало - под XP и под 98 -------------------------- ЗЫ отдельное спасибо Альфу, которого я мучал последние 3 дня
|
|
|
Записан
|
|
|
|
|