Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.04.2013, 20:30
Dimrix Dimrix вне форума
Прохожий
 
Регистрация: 21.08.2012
Сообщения: 4
Репутация: 10
Счастье Com-порт WinApi

Добрый день всем. При работе с ком-портом наступил на грабли и нормального решения пока не нашёл. Проблема собственно в том, что если я на ком-порт отправляю запрос с верным завершающим символом, тогда всё ок, но если с "неверным" завершающим символом - ответ не получаю что естественно и все последующие команды висят. Но если порт закрою и наново открою, указав необходимый символ конца строки - запросы всё равно висят и не обрабатываются.
ЗЫ: советы мол не отправляй "левые" символы - не вариант, ибо если какое-то "тело" отправит команду на порт с неверным символом в конце, то моя программа перестаёт работать до ребута устройства, а хочется что бы программе даже кривые руки Юзверя не мешали.
ЗЫЫ: то что порт даже после "кривых" запросах может начать адекватно работать - это факт, ибо другое ПО успешно отправляет/получает данные на порт.
Код инициализации:
Код:
  CommHandle := CreateFile(PChar('\\.\'+Port),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);
  PurgeComm(CommHandle,PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
  SetCommMask(CommHandle,EV_RXFLAG);
   GetCommState(CommHandle,DCB);
   DCB.BaudRate:=CBR_115200;
   DCB.Parity:=NOPARITY;
   DCB.EofChar:=#0;
   DCB.ErrorChar:=#0;
   DCB.ByteSize:=8;
   DCB.StopBits:=OneStopBit;
   DCB.EvtChar:=EvtChar;//задание символа для флага
   DCB.XonChar:=#$11;
   DCB.XoffChar:=#$13;
   DCB.XonLim:=8192;
   DCB.XoffLim:=51200;
   SetCommState(CommHandle,DCB);
   lpCommTimeouts.ReadIntervalTimeout:=-1;
   lpCommTimeouts.ReadTotalTimeoutMultiplier:=-1;
   lpCommTimeouts.ReadTotalTimeoutConstant:=500;
   lpCommTimeouts.WriteTotalTimeoutMultiplier:=1;
   lpCommTimeouts.WriteTotalTimeoutConstant:=50;
   SetCommTimeouts(CommHandle,lpCommTimeouts);
   SetupComm(CommHandle,4096,4096);
   CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
Параметры порта именно такие, т.к. получил их при помощи снифера порта и стороннего ПО по работе с портом.
запись в порт:
Код:
   WriteFile(CommHandle,Transmit,Kol,Kol,@Ovr);
  PurgeComm(CommHandle,PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
  z:=0;
  repeat
    Sleep(1);
    Inc(z);
  until (msg_ans<>'') or (z>500);
z - защита от зависания, может есть другие методы, но мне ничего другого не пришло в голову да и этот метод безотказно работает, хотя есть риски запуска моего ПО на древнем железе где 500мс будет маловато...
Считывание
Код:
     while true do
   begin
    TransMask:=0;
    WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
    if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие
     begin
      ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг
      Kols := Stat.cbInQue;
      ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем
      msg_ans:=Resive;
      ansver:=1;
     end;//mask
    end;//while

Последний раз редактировалось Dimrix, 25.04.2013 в 20:35.
Ответить с цитированием
  #2  
Старый 25.04.2013, 20:39
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Была же уже такая тема.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 25.04.2013, 20:55
Dimrix Dimrix вне форума
Прохожий
 
Регистрация: 21.08.2012
Сообщения: 4
Репутация: 10
По умолчанию

Нашёл просто решение: просто первую команду отправляю дважды на порт.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:23.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter