программирование купюроприемников по протоколу id003

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by mixturkin, 16 May 2014.

  1. mixturkin

    mixturkin New Member

    Joined:
    17 Aug 2013
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    Программирую (пытаюсь*) *) ) JCM Taiko по протоколу ID003, много читал документацию, смотрел исходные коды, вроде все понятно, но поставить купюрник в режим приема денег (Ack mode) не получается. То есть на данной стадии меня интересуют только как отправить комманду, принимать от него - это следующий шаг. То есть пока я хочу открыть порт фунцией CreateFile(), затем настроить параметры порта функциями GetCommState()/SetCommstate() и записать в открытый порт комманду Ack из пяти байт функцией WriteFile(). Собственно у меня получился вот такой код на делфи (код процедуры нажатия кнопки,в которой идет запись в порт):
    Отправляемые комманды купюроприемнику содержатся в константах Command, PollCommand
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
         var
    
      dcb:TDcb;
      SizeOfWhat:dword;
      getcmd:array[1..5] of BYTE;
      hport:hWnd;
      
    	const
      Command:array[1..5] of BYTE = ($FC,$05,$50,$AA,$05);
      PollCommand:array[1..5] of BYTE = ($FC,$05,$11,$27,$56);
    begin
      //opening port
      hport:=createfile('COM1', GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
      if hport=INVALID_HANDLE_VALUE then
        button1.Caption:='ducking opening error' else  button1.Caption:='very goos';
      //geting TDcb class and changing its parametrs for my settings
      if not GetCommState(hport,dcb) then button1.Caption:='cant getCommState';
      dcb.BaudRate:=CBR_9600;
      dcb.Parity:=NOPARITY;
      dcb.ByteSize:=8;
      dcb.StopBits:=ONESTOPBIT;
      sizeofwhat:=0;
      if not SetCommState(hport,dcb)then Button1.Caption:='SetCommState error';
      if(not WriteFile(hport,command,sizeof(command),sizeofwhat,nil)) then button1.Caption:='err write port';
    end;
    
    после нажатия на кнопку купюрник не делает вообще ничего, т.e. даже не примает денежки, но он точно рабочий, так как тестовый софт работает и все тесты через переключение джамперов он проходит. Что я делаю не так?

    P.S. мне кажется, что так как передача данных асинхронная, то любую комманду надо отправлять каждые 100-200 мс (из спецификации) или я туплю и можно просто один раз комманду отправить и все? Я пробовал WriteFile() ставить в таймер (аля асинхронность), но результат тот же, что и при этом коде. Есть у кого-нибудь подобный опыт?
     
  2. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,300
    Reputations:
    327
    может там чемто должна завершаться последовательность бинарных данных? может \r\n или нулями? у меня тоже кстати была работа с купюрниками - но там все программатором решалось

    тебе надо датащит по этому девайсу почитать, там должны быть и протоколы передачи итд
     
    #2 sn0w, 31 May 2014
    Last edited: 31 May 2014