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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2009, 07:49   #1
gusluk
Форумчанин
 
Аватар для gusluk
 
Регистрация: 16.10.2008
Сообщений: 205
По умолчанию COM порт, как принять данные?

Подключаюсь и принимаю данные так:
Код:
procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD);stdcall;
begin
ReadFile(CommHandle, BinBuf, 128, NumberWritten, nil);
if(NumberWritten > 0) then p := BinBuf;
end;

procedure TForm1.GPS1Click(Sender: TObject);
begin
PortString := '\\.\COM'+inttostr(ComPort);
CommHandle := CreateFile(PChar(PortString), GENERIC_READ or
			GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);

if (CommHandle = INVALID_HANDLE_VALUE) then
begin
  MessageDlg('Error. Can`t Open port', mtError, [mbOK], 0);
end
else
begin
  GetCommState(CommHandle, DCB);
  DCB.BaudRate  := CBR_4800; // FORMALLY, CONNECT BAUD DOESN`T MATTER (Virtual Com Port)
  DCB.Parity    := NOPARITY;
  DCB.ByteSize  := 8;
  DCB.StopBits  := OneStopBit;

  CommTimeOuts.ReadIntervalTimeout          := 0;
  CommTimeOuts.ReadTotalTimeoutMultiplier   := 0;
  CommTimeOuts.ReadTotalTimeoutConstant     := 1000;
  CommTimeOuts.WriteTotalTimeoutMultiplier  := 0;
  CommTimeOuts.WriteTotalTimeoutConstant    := 1000;
  SetCommTimeouts(CommHandle, CommTimeOuts);
  SetCommState(CommHandle, DCB);

  uTimerID := timeSetEvent(1000,0,@FNTimeCallBack,100,TIME_PERIODIC);

  CRbyte := 13; // HEX 0x0D
  LFbyte := 10; // HEX 0x0A
  form1.GPS1.Caption:='Подключено'
end;
end;
Все работает нормально, данные приходят корректно. Но в данном случае данные читаются раз в секунду, а приходят они на порт не периодически, т.е. может прийти за секунду несколько команд а может не прийти ни одной. Поэтому иногда бывают сбои.
Есть ли способ читать данные тогда когда они на него пришли, а не через промежуток времени?
gusluk вне форума Ответить с цитированием
Старый 11.09.2009, 07:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Есть ли способ читать данные тогда когда они на него пришли
Есть, но думается мне что только драйвер позволит такие выкрутасы делать. Впрочем ты всегда можешь попробовать организовать отдельный поток (Thread имеется ввиду) для чтения, и не ставить в нем задержки
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2009, 08:07   #3
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Используйте компонент СportLib там всё просто. Очень удобно работать.
SERG1980 вне форума Ответить с цитированием
Старый 11.09.2009, 08:10   #4
gusluk
Форумчанин
 
Аватар для gusluk
 
Регистрация: 16.10.2008
Сообщений: 205
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Есть, но думается мне что только драйвер позволит такие выкрутасы делать. Впрочем ты всегда можешь попробовать организовать отдельный поток (Thread имеется ввиду) для чтения, и не ставить в нем задержки
Тогда сначала попробую интервал поменьше поставить, если не будет виснуть и сбоить то хорошо, если будет, сделаю как посаветовал.
Спасибо!
gusluk вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно в PHP принять данные из CGI exploys PHP 13 10.06.2009 02:48
Как принять ответ от сервера? (делфи) zotox Помощь студентам 2 11.11.2008 13:49
Как принять GET запрос eldar Работа с сетью в Delphi 2 11.08.2008 00:19
Как принять сообщение (SendMessage) Crazyman Win Api 4 20.02.2008 04:42
Как записать в com -порт или модем двоичные данные sergrom Win Api 10 25.06.2007 15:15