Mаster
Гость
|
|
« Ответ #30 : 06-06-2008 11:54 » |
|
RXL, отдельное спасибо за сентенцию. Что такое XON-XOFF, я знаю. Я описал лишь решение своей проблемы. Вам же, RXL, желаю, чтобы документация, которую используете Вы, всегда соответствовала дествительности. Аминь!
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #31 : 06-06-2008 12:49 » |
|
Mаster, прочти внимательно свой пост 28 в этой ветке и расскажи нам что ты сделал. а мы тебя заслушаем
После ПЕРЕЗАГРУЗКИ - а что вообще в буфере или на порту находится ты об этом подумал? после запуска терминалки (в моём случае Terra Term Pro) на проверяемом COM-порте ситуация выправляется - понятное дело - правильно проинициализирован порт
Читай документацию.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #32 : 06-06-2008 13:30 » |
|
Вам же, RXL, желаю, чтобы документация, которую используете Вы, всегда соответствовала дествительности. Аминь! А шо? В MSDN не соответствует? А нельзя ли поподробней, а то я практически больше ничем не пользуюсь.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
Mаster
Гость
|
|
« Ответ #33 : 06-06-2008 13:34 » |
|
Sla, RXL и все, кто кинул или собирается кинуть камень в мой огород - Ребята! Я зарегистрировался на Вашем форуме по одной лишь причине: для размещения решения проблемы, с которой столкнулся я и тот, чей пост стоял первым в результатах запроса в google.ru "WinAPI потеря старшего бита". Если у Вас никогда не бывало так, что Вы делаете всё по документации (и не обязательно это - MSDN), и - не работает, то это не значит, что чтение документации на что бы то ни было всегда спасает, решает проблему. Судя по постам Sla и RXL, Ваш форум существует для того, чтобы на проблемные вопросы всегда получать ответ "Читай документацию". Подумайте, если есть документация, зачем форумы?.. Знаю, что есть правила форума и их следует придерживаться. Так же в курсе, что мой пост не содержит сколько-нибудь стоящей информации по открытой теме - сразу передаю привет модератору и готов к возмездию от него ибо причина, по которой я зарегистрировался в Вашем форуме... а, ну об этом я впрочем уже писал. Дальнейшую полемику продолжать не намерен. Всем удачи и всего доброго!
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #34 : 06-06-2008 13:53 » |
|
Mаster, ух ты какой обидчивый. Мы совсем далеки от политики посылать СРАЗУ к книжкам. Но если это действительно так и есть. Для кого делать исключения? Тем более что проблемы у Dmitry Samoylov действительно были в непонимании передачи буфера - массива байт. Насколько я знаю и RXL, и Sla, и я достаточно много работали с RS-232. Почему ты не пришёл со своей проблемой к нам раньше? Ведь метод научного тыка хорош до поры до времени. Если ты "что-то" сделал и у тебя это "как-то" получилось, то стоит ли на этом успокаиваться и называть это "я решил проблему"? Если ты сторонник такой политики, то тогда действительно - удачи тебе и всего доброго.
|
|
« Последнее редактирование: 06-06-2008 13:54 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "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."
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #35 : 06-06-2008 15:24 » |
|
Mаster, просто напросто надо полностью инициализировать порт, вне зависимости от его исходного состояния. А на счет "все по документации": много раз было. Обычный итог - неправильно понял, неверно следовал инструкциям и т.п. С неполной документацией сталкивался не раз, но COM-порт - не тот случай. Посмотри, для примера, статью Алексея: https://club.shelek.ru/viewart.php?id=208
|
|
« Последнее редактирование: 06-06-2008 15:27 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
lag
Участник
Offline
|
|
« Ответ #36 : 07-06-2008 02:21 » |
|
Мой код инициализации ком-порта, просто вставляю постоянно из одной проги в другую, работает
OpenComm() { g_hComm = CreateFile("COM1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (g_hComm == INVALID_HANDLE_VALUE) { AfxMessageBox(_T("Don't open COM-port")); g_hComm = 0; return FALSE; } DCB *dcb;
dcb = (DCB *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DCB)); dcb->DCBlength = sizeof(DCB); GetCommState(g_hComm, dcb);
dcb->BaudRate = 115200; dcb->ByteSize = 8; dcb->fParity = NOPARITY; dcb->StopBits = ONESTOPBIT; dcb->fRtsControl = RTS_CONTROL_DISABLE;
if (!SetCommState(g_hComm, dcb)) { AfxMessageBox(_T("Ошибка инициализации СОМ-порта")); CloseHandle(g_hComm); g_hComm = 0; return FALSE; }
COMMTIMEOUTS cto; cto.ReadIntervalTimeout = 1; cto.ReadTotalTimeoutConstant = g_dwCommTimeout; cto.ReadTotalTimeoutMultiplier = 0; cto.WriteTotalTimeoutConstant = 30; cto.WriteTotalTimeoutMultiplier = 0; SetCommTimeouts(g_hComm, &cto); PurgeComm(g_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); SetupComm(g_hComm, 256, 256); HeapFree(GetProcessHeap(), 0, dcb);
return TRUE; }
// g_dwCommTimeout = 20, в моем случае т.к. ответ приходит не позже чем через 10мс после отправки запроса. // далее в цикле с небольшими сокращениями кода:
SendRequest(g_hComm, w_addr, w_type); // запрос - 0 - адрес, 1 - тип ReadFile(g_hComm, rcv, 256, &done, NULL);
void SendRequest(HANDLE hComm, WORD id_device, WORD device) { WORD crc; DWORD done; BYTE seq[8] = {0x05, 0x04}; WORD *pseqw = (WORD *) seq; if (device == 0) ................................
pseqw[1] = 0x0105; pseqw[2] = id_device; crc = GetCRC(seq, 6); seq[6] = HIBYTE(crc); seq[7] = LOBYTE(crc); // Отправить пакет в сеть WriteFile(hComm, &seq, 8, &done, NULL); }
|
|
|
Записан
|
|
|
|
lag
Участник
Offline
|
|
« Ответ #37 : 07-06-2008 02:32 » |
|
А решение проблемы при помощи подбора XON и XOFF или еще каким-то хитрым способом, также как RXL считаю неправильным. Это мне напоминает ситуацию, когда я ездил на копейке мохнатого года с разбитыми шаровыми. В один прекрасный или нет момент в повороте во двор шаровая вылетела, но до дома я доехал, просто снимал колесо, вставлял шарик на место, обколачивал место посадки шарика молотком - на пару километров хватало
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #38 : 07-06-2008 06:12 » |
|
Мой код инициализации ком-порта, просто вставляю постоянно из одной проги в другую, работает Хмм... А если протокол обмена с внешним устройством (StopBits, Parity, BaudRate и т. п.) требует другой инициализации порта?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #39 : 08-06-2008 06:53 » |
|
zubr, 99% железок работает по 8N1 и с аппаратным контролем потока или без контроля, а скорость поменять не проблема. По этой причине считаю, что copy-paste тут себя вполне опрадывавает, хотя - не дурно бы иметь возможность менять параметры.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
zubr
Гость
|
|
« Ответ #40 : 08-06-2008 07:04 » |
|
RXL, ну ладно StopBits и Parity, а таймауты? Для разных устройств их по разному надо выставлять, причем иногда в зависимости от BaudRate.
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #41 : 08-06-2008 08:00 » |
|
zubr, этого я не заметил... (
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|