Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2011, 14:21   #1
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
Злость Com порт - странное поведение

Я откопипастил программу для работы с Com портом в асинхронном режиме.
Вчера вечером всё работало! А сегодня начались чудеса.
У меня на столе два ноутбука, соединены шнурком для RS232. Запускаю одну и ту же (свою) программу на обоих ноутах и пробую передать с одной на другую любую строчку. В одну сторону идёт, а в другую нет! Переворачиваю кабель (подумав что может в распайке дело), повторяю - результат тот же, опять не идёт в ту же сторону куда не шло. Открываю на стороне которая не могла принять HyperTerminal - всё отлично проходит! Открывал HyperTerminal на всякий случай на другой стороне тоже, также всё работало.
Я ума не приложу почему не работает в одну сторону.
Событие выставлено в EV_RXFLAG. Пытался ловить событие отладчиком - а события нет! Я плохо понимаю какая между ними разница, но попробовал выставить событие в EV_RXCHAR. Стало ловить но программа начала вести себя по другому - она стала принимать пакетами по 16 байт, соответственно если я посылаю 17 то приходит один, она приняла 16, обработала и принимает дальше. Понятно что можно обработать эту приёмку пакетами, но ведь можно наверно и без неё обойтись как нибудь??
Объясните пожалуйста что происходит. Почему по EV_RXFLAG события не происходит, хотя на другом компе всё отрабатывается замечательно. И с другой стороны - можно ли обойти эту нарезку по 16 байт?

вот прикрепляю основной код потока для чтения на всякий случай
это версия с EV_RXFLAG которая работает в одну сторону
Код:
DCB.EvtChar:=char(#13);
/////////////////////////////////
procedure thread.Execute;
var
ComStat: TComStat;
dwMask, dwError:DWORD;
OverRead:TOverlapped;
Buf: array [0..$FF] of Char;
dwRead:DWORD;
begin
 SetCommMask(CommHandle,EV_RXFLAG);
 FillChar(OverRead,SizeOf(TOverlapped),0);        
 OverRead.hEvent:=CreateEvent(nil,true,true,nil); 
while not Terminated do
   begin
     WaitCommEvent(CommHandle,dwMask,@OverRead); 
     WaitForSingleObject(OverRead.hEvent,INFINITE); 
                                                    
     if not ClearCommError(CommHandle,dwError,@ComStat) then
       raise Exception.Create('Error clearing port');

     dwRead:=ComStat.cbInQue;

     if dwRead>0 then
      begin
       if not ReadFile(CommHandle,Buf,dwRead,dwRead,@OverRead) then
        raise Exception.Create('Error reading port');
       MainForm.Panel1.Caption:=string(Buf);
      end;
    end;
end;
может ли быть дело в железе?

Последний раз редактировалось BoozZzilla; 12.07.2011 в 15:53.
BoozZzilla вне форума Ответить с цитированием
Старый 13.07.2011, 08:22   #2
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию ап

Попробовал на другой паре ноутбуков - опять ловится только на одном ноутбуке, причём на том же самом что ловил в прошлый раз.
Выходит что на одной машине по приёму #13 портом генерируется событие, а на других не генерируется??
Ребята, может у кого возникнет идея? Я спал плохо сегодня
BoozZzilla вне форума Ответить с цитированием
Старый 13.07.2011, 08:34   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Посмотри мою прогу работает с Com портом, может что для себя найдешь в ней
Весь код по работе написан в unit FunctComPort.pas
http://zalil.ru/31414794

Последний раз редактировалось Aliens_wolfs; 13.07.2011 в 08:38.
Aliens_wolfs вне форума Ответить с цитированием
Старый 13.07.2011, 10:02   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

TC, у вас вот в гипертерминале все работает как понял? Вы в курсе, что он настраивает COM порт (там походу видно), а вот по вашему коду вижу работу с DCB только вот с этим DCB.EvtChar:=char(#13); - и где все остальное, тайминги, настройка буфера, стоп-битов, ...?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 13.07.2011, 11:12   #5
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
TC, у вас вот в гипертерминале все работает как понял? Вы в курсе, что он настраивает COM порт (там походу видно), а вот по вашему коду вижу работу с DCB только вот с этим DCB.EvtChar:=char(#13); - и где все остальное, тайминги, настройка буфера, стоп-битов, ...?
Нет нет нет
Эту строчку я показал чтобы было ясно что событие я выставил на #13
При открытии я конечно всё выставляю что важно: baudrate, parity, bytesyze, stopbits.
И повторю: на другом конце эта же программа всё принимает.

upd.
Да да да
я опять опрофанился
у меня была написана функция настройки порта, но я её /мля/ оказывается не запускал!!! ...
Извиняюсь, тема закрыта...

Последний раз редактировалось BoozZzilla; 13.07.2011 в 12:02. Причина: глупость автора...
BoozZzilla вне форума Ответить с цитированием
Старый 13.07.2011, 13:04   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

это уже восьмая тема на моей памяти, когда забывают настроить порт ...ничего, с кем не бывает
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 15.07.2011, 20:41   #7
YoZHeG
 
Регистрация: 15.07.2011
Сообщений: 3
По умолчанию

Приветствую товарищей програмеров!
Не откажете в помощи начинашке?
Мне необходимо доработать готовую прогу для работы с СОМ портом. Сама прога есть уже и скомпилированая и работает нормально, но вот в исходниках что-то не так (либо в том как я их открываю): при открытии в Делфи 7 он мне заявляет "Class TComPort not found. Ignore the error and continue?", хотя TComPort вроде описан в отдельном модуле CPort. При попытке скомпилировать вылазит ошибка "Field Form1.ComPort1 does not have corresponding component. Remove the declaration?" (где Form1.ComPort1:TComport). При ответе "нет" - спокойно компилит, и прога естественно не работает.
Я предположил что прога написана на более раннем делфи, но на 5м делфи проблема не исчезла а только обросла ошибками с русскими символами в форме.

Вот сами исходники: http://zalil.ru/31427017 (прога, исходник проги, модуль CPort в отдельной папке Com_port)
Я решил не создавать отдельной темы т.к. сдесь до самого программирования компорта я даже не дошел - даже готовую прогу открыть не могу.
YoZHeG вне форума Ответить с цитированием
Старый 15.07.2011, 20:44   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Компонент TComPort установлен?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.07.2011, 21:22   #9
YoZHeG
 
Регистрация: 15.07.2011
Сообщений: 3
По умолчанию

В самом Delphi? Видимо нет.
Только в uses прописан Cport. или это не та степь?
YoZHeG вне форума Ответить с цитированием
Старый 15.07.2011, 23:23   #10
YoZHeG
 
Регистрация: 15.07.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Компонент TComPort установлен?
а как это сделать для Д7 ?
YoZHeG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Странное поведение чисел.... sult9191 Общие вопросы по Java, Java SE, Kotlin 2 20.01.2011 17:12
Странное поведение realloc eraserhp Помощь студентам 0 15.05.2010 18:06
Странное поведение gets alex_alpha Общие вопросы C/C++ 3 27.03.2010 18:21
Странное поведение TTreeView mutabor Компоненты Delphi 1 01.05.2009 05:17
Странное поведение базы yulia БД в Delphi 7 22.04.2009 07:15