Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > СОМ порт


Автор: morpheyushka 9.12.2008, 11:50
Не могу понять - пишет ли моя программа в СОМ порт. Подключение проходит отлично - порт в итоге становится занятым моим приложением.

Пытаюсь записать в него:

Код

var
  Ovr: TOverlapped;
  S, Comand: String;
  WriteByte: DWORD;
  B: array [0..127] of Char;
  i: DWORD;
begin
  FillChar(B, 128, #0);
  FillChar(Ovr, SizeOf(TOverLapped), 0);
  Ovr.hEvent := CreateEvent(nil, true, false, nil);
  Comand := 'UPAS11111111111111111111';
  S := Char(253) + Comand + IntToStr(Length(Comand) + 1) + Char(254); // это по протоколу кассового аппарата, хотя не уверен что правильно записываю команды
  StrPCopy(B, S);
///////////////////////////////////////////////////////////////////////

  if not WriteFile(IdCom, B, Length(B), WriteByte, @Ovr) then
    begin //           <<-----------------------------         сюда заходит постоянно
      if (GetLastError() = ERROR_IO_PENDING) and
         (WaitForSingleObject(Ovr.hEvent,INFINITE)= WAIT_OBJECT_0) then
        begin
          GetOverlappedResult(IdCom, Ovr, i, False);
        end;
    end;
  CloseHandle(Ovr.hEvent);
end;


Пытаюсь прочитать что приходит из него
Код

procedure TReadThread.Execute;
var OverRead: TOverlapped;
   S: string;
begin
OverRead.hEvent:=CreateEvent(nil, True, False, nil);
 if OverRead.hEvent= Null then begin
  ShowMessage('Error creating read event');
  Exit;
  end;
while not Terminated do begin
    if not WaitCommEvent(IdCom, dwMask, @OverRead) then
      begin
        if GetLastError = ERROR_IO_PENDING then
        WaitForSingleObject(OverRead.hEvent,INFINITE)
       else ShowMessage('Error waiting port event');
     end;
    if not ClearCommError(IdCom, dwError, @ComStat) then
    ShowMessage('Error clearing port');
  dwRead:=ComStat.cbInQue;
  if dwRead > 0 then
   begin
     if not ReadFile(IdCom, ReceiveBuff, sizeof(ReceiveBuff), dwRead, @OverRead) then
       ShowMessage('Error reading port');
   end;
S:=string(ReceiveBuff);
Form11.Memo1.Lines.Add(s);
sleep(100);
end;
end;


В мемо ничего не выводит...и сама МАРИЯ-701 никак не реагирует

Объявление класса для чтения из порта:
Код

TReadThread = class(TThread)
   private
    { Private declarations }
  protected
  procedure Execute; override;
 end;


Создаю поток так:
Код

procedure TForm11.Button5Click(Sender: TObject);
var
  ReadThread: TReadThread;
begin
  ReadThread:=TReadThread.Create(true);
  ReadThread.FreeOnTerminate:=true;
  ReadThread.Priority:= tpNormal;
  ReadThread.Resume;
end;



Помогите пожалуйста уже который день бьюсь, ничего не получается

Автор: morpheyushka 9.12.2008, 19:01
Не много ответов за целый день...подскажите пожалуйста - как точно узнать, что то, что я отправляю устройство получает

просто я первый раз работаю с СОМ портом...перечитал уже море инфы, может кто то с протоколом для фискального регистратора (фискальный принтер) МАРИЯ-701 работал или хотя бы с 301 моделью - буду очень благодарен за любую помощь

Автор: ama_kid 11.12.2008, 23:40
Цитата(morpheyushka @  9.12.2008,  20:01 Найти цитируемый пост)
как точно узнать, что то, что я отправляю устройство получает
Подцепись к другому компу по СОМ и через гипертерминал проверь... А для начала - поставь бряк на WriteFile и проверь, что буфер корректный...
Цитата(morpheyushka @  9.12.2008,  12:50 Найти цитируемый пост)
В мемо ничего не выводит...
Аналогичный совет - ставь бряк на ReadFile и проверяй отладчиком содержимое полученного буфера. Не факт, что приходящий буфер можно преобразовать в строку для вывода в Мемо...
P.S. Ну и не очень понятно, зачем используешь буферизированный (Overlapped) режим? Лишний геморрой имхо... Пиши-читай синхронно, пакеты-то небольшие, как я понимаю...

Автор: morpheyushka 12.12.2008, 16:40
Цитата(ama_kid @  11.12.2008,  23:40 Найти цитируемый пост)
P.S. Ну и не очень понятно, зачем используешь буферизированный (Overlapped) режим? Лишний геморрой имхо... Пиши-читай синхронно, пакеты-то небольшие, как я понимаю...

Правильно понимаешь - просто я нашел только для асинхронного доступа - все примеры только с ним

По сути дела, в определенный момент мне нужно отправить на распечатку чек в фискальный регистратор - там указывается только сумма.
Потом, запросить номер чека и все...и так до следующего раза...программа в любом случае будет ждать распечатки чека (бизнес-правило)

Добавлено через 41 секунду
Может знаешь где можно пример синхронного доступа посмотреть?

Автор: ama_kid 12.12.2008, 20:18
Цитата(morpheyushka @  12.12.2008,  17:40 Найти цитируемый пост)
Может знаешь где можно пример синхронного доступа посмотреть? 
Да там все то же самое, только при вызове CreateFile убери флаг FILE_FLAG_OVERLAPPED, выкидывай все Overlapped-структуры и имей ввиду, что WriteFile и ReadFile будут ожидать завершения передачи данных (это неприменимо для работы из основного потока, но у тебя все вызывается из отдельного - поэтому все должно быть нормально). 

Автор: Felan 13.12.2008, 13:27
Цитата(morpheyushka @  12.12.2008,  18:40 Найти цитируемый пост)
Правильно понимаешь - просто я нашел только для асинхронного доступа - все примеры только с ним

Ну вот есть http://forum.sources.ru/index.php?showtopic=173025&view=findpost&p=1462984 для синхронного... даже с исходниками smile

Автор: morpheyushka 15.12.2008, 10:21
Попробую разобраться, если что, еще напишу smile 

Автор: morpheyushka 16.12.2008, 13:34
Цитата(Felan @  13.12.2008,  13:27 Найти цитируемый пост)
Ну вот есть пример для синхронного... даже с исходниками smile 




Felan, спасибо - взял твой класс...переделал под свои потребности все пишет, читает...короче помогло - теперь буду долбать протокол этого кассового аппарата

Автор: Felan 17.12.2008, 08:52
Не за что smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)