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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2016, 11:39   #1
Dmitri4
 
Регистрация: 23.05.2010
Сообщений: 6
По умолчанию Считывание с Com порта, очистка массива

Всем привет! Пишу считыватель ключей ds1990a (по принципу передачи кода с контроллера на Com порт и последующим считыванием с порта в программе). Возникла проблема с выводом ключа в форме. Подскажите, как правильно сделать, чтобы после считывания массив очищался. И, при поднесении нового ключа, выводился новый код, а не приходилось несколько раз нажимать кнопку "Чтение", чтобы скинуть и заполнить старый массив. Заранее спасибо

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
hCom := CreateFile('COM1', GENERIC_READ + GENERIC_WRITE, 0, nil,
                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hCom=INVALID_HANDLE_VALUE then begin
   ShowMessage('Не удалось открыть порт');
    end
    else begin ShowMessage('Удалось открыть порт');
    end;

    // Проверка на ошибки
if hCom = INVALID_HANDLE_VALUE then begin
  exit;
end;

    //Чтение и новый найстройки для порта
if GetCommState(hCom, DCB) then
    //Настройки
DCB.BaudRate :=9600; // Скорость
DCB.ByteSize :=8;// Число бит при обмене
DCB.StopBits :=ONESTOPBIT;//Стоп-бит
DCB.Parity :=NOPARITY; //Четность
DCB.Flags :=20625;
    //?Записываем настройки
if not SetCommState(hCom,DCB) then
      ShowMessage('Ошибка настройки порта');
if not SetupComm (hCom,16,16) then
      ShowMessage('Ошибка настройки буферов');
if PurgeComm (hCom, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR
              or PURGE_RXCLEAR) then;  //Сброс буферов и очередей

         GetCommTimeouts(hCom,TimeOuts);
         TimeOuts.ReadIntervalTimeout := MAXDWORD;
         TimeOuts.ReadTotalTimeoutMultiplier := 0;
         TimeOuts.ReadTotalTimeoutConstant := 0;
//выполняем настройку порта с новыми таймаутами
    if not SetCommTimeouts(hCom,TimeOuts) then begin
      CloseHandle(hCom);
      Exit;
    end;
  end;
             //Закрытие порта
procedure TForm1.Button2Click(Sender: TObject);
begin
CloseHandle(hCom);
 ShowMessage('Порт закрыт');
end;
        //СЧИТЫВАНИЕ
procedure TForm1.Button3Click(Sender: TObject);
var
  d: array[1..64] of char;
  s: string;
  i: Integer;
  BytesRead: Cardinal;
begin
if not ReadFile(hCom, d, SizeOf(d), BytesRead, nil) then
  begin
    ShowMessage('Не читает');
  end;
    s := ' ';
    i:=1;
      while i<=BytesRead do
        begin
          s:=s+d[i];
          Label2.Caption:=s;
          Label4.Caption := FormatDateTime('hh:nn:ss', Time);
          i:=i+1;
        end;
PurgeComm (hCom, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR
              or PURGE_RXCLEAR);
      end;
end.
Dmitri4 вне форума Ответить с цитированием
Старый 05.04.2016, 11:58   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А использование файловых апи-функций обязательно?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.04.2016, 12:01   #3
Dmitri4
 
Регистрация: 23.05.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
А использование файловых апи-функций обязательно?
Да, к сожалению.

Зы. Я бы изначально делал с помощью компонента. Но, не прокатило бы

Последний раз редактировалось Dmitri4; 05.04.2016 в 12:04.
Dmitri4 вне форума Ответить с цитированием
Старый 05.04.2016, 12:12   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

найти тогда компонент (или модуль) для работы с портом, реализованный именно на этой АПИ, и распотроши его.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.04.2016, 14:08   #5
Dmitri4
 
Регистрация: 23.05.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
найти тогда компонент (или модуль) для работы с портом, реализованный именно на этой АПИ, и распотроши его.
Спасибо за ответ. У меня все корректно работает с API, трудность в том, что не понимаю, как очистить заполненный массив после чтения ключа.
Dmitri4 вне форума Ответить с цитированием
Старый 05.04.2016, 14:24   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
Сообщение от Dmitri4 Посмотреть сообщение
Спасибо за ответ. У меня все корректно работает с API, трудность в том, что не понимаю, как очистить заполненный массив после чтения ключа.
Какой массив надо очищать?
northener вне форума Ответить с цитированием
Старый 05.04.2016, 15:41   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Какой массив надо очищать?
кстати да!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.04.2016, 18:56   #8
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Асинхронный режим чтения из Com-порта (только работать с VCL из потока без синхронизе некомильфо)
kutani вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание данных с Com-порта avovana Микроконтроллеры, робототехника, схемотехника, 3D принтеры 72 21.09.2014 15:03
Считывание сигнала с COM порта Pasha_Sh Общие вопросы Delphi 8 13.12.2011 23:29
автоматическое считывание с com порта denis_kas Win Api 4 22.11.2010 19:11
Считывание и расшифровка (интерпретация) данных с lpt порта, передаваемых печатающему устройству Ma3a Общие вопросы Delphi 3 21.12.2009 08:46
считывание из СОМ(или USB) порта voron29 Общие вопросы Delphi 1 29.06.2008 13:09