Wysłanie rozkazu do wagi

0

Witam,

Chcę wysłać rozkaz do wagi Elzab Prima przez port szeregowy. Według dokumentacji ma to być sekwencja:
ESC,4Dh,03,61h,0Ah

używam komponentu Comport. Po naciśnięciu przycisku w wadze do wysyłania wyniku komunikacja jest prawidłowa i w komponencie Memo pojawia się wynik.
Niestety ja potrzebuję wywołać komunikację przez aplikację a za cholerę nie wiem jak przesłać ten rozkaz, próbowałem dziesiątki możliwości, od najprostszych czyli przesłanie zwykłego stringa, poprzez string szesnastkowo, dziesiętnie itp.

Wykończyła mnie ta waga:) a niestety jest to mój pierwszy program komunikujący się poprzez porty szeregowe i doświadczenia nie mam.

Być może mam to nie wysyłać jako string? Nie wiem a próby są uciążliwe bo za każdym razem muszę kompilować program, przenosić go na kompa z portem COM itp.

Będę wdzięczny za sugestie.

Pozdrawiam
Robert

0
  1. daj kod
  2. większość wag wymaga na końcu rozkazu #13#10 czyli windowsowy koniec linii
0

Kod jest wyjątkowo prosty:

procedure Tsprzedaz.SpeedButton19Click(Sender: TObject);
var S: String;
    int : array[0..5] of byte;
begin
  if not ComPort1.Connected then
    ComPort1.Open;

    int[0]:=27;
    int[1]:=77;
    int[2]:=3;
    int[3]:=97;
    int[4]:=10;

//  S:=Chr($1B) + Chr($4D) + Chr($03) + Chr($61) + Chr($0A);
//  S:=Label1.Caption;
//  ComPort1.WriteStr(#27#77#3#97#10);

    ComPort1.Write(int,5);

end;

jak widać eksperymentowałem z różną formą wysyłki (tak naprawdę zrobiłem dużo więcej prób) ale cały czas dostaję na wadze "błąd 3" czyli wg instrukcji: błąd transmisji szeregowej i sugestie: "zmienić parametry transmisji".

tutaj jest instrukcja którą dysponuje: http://www.elzab.com.pl/files/io_prima29082011.pdf

0
  1. parzystość. prędkość, bity danych, bity stopu i sterowanie przepływem masz ustawione tak samo w wadze i w comport1?
  2. spróbuj tak
    s: string;
    s := #27#77#3#97#10#13#10;
    comport.WriteStr(s);
0

Problem rozwiązany, nakierowałeś mnie na te parametry transmisji :)
Rzeczywiście, waga miała parzystość ustawiona na Even a mój komponent na None. Zmyliło mnie to że transmisja zwrotna (czyli inicjowana przez wagę działała prawidłowo na tych ustawieniach).
Co do sekwencji to wysyłam taką jak napisałeś ale bez entera i nowej lini na końcu (chociaż myślę że nie miałoby to znaczenia).

Jeszcze raz dzięki za sugestie. Na to forum zawsze można liczyć!

0

Witam

Siedzę już jakiś czas nad drukarką fiskalną Elzab Mera EFV, a że jestem laikiem jeśli chodzi programy dla urządzeń to bardzo prosiłbym o pomoc.

  • mam: debain 6, skonfigurowany cutecom, drukarkę na /dev/ttyS4 (program testowy elzabu działa na nim bez problemu)
  • chciałbym: wysłać sekwencję ESC,21H i otrzymać zwrotnie ACK, docelowy wystawiać paragon przez www
  • jak to osiągnąć, czy wystarczy cutecom/konsola + stty? z tego co przeczytalem powinienem wysłać 27 33
  • generalnie ręce już mi opadły także byłbym wdzięczny za pomoc

wycinek z instrukcji elzab "Drukarka po włączeniu oczekuje na sekwencję sterującą. Po otrzymaniu kodu ESC (= 1BH=27D) oraz
numeru sekwencji (np. ESC,21H - początek paragonu) sprawdza czy są spełnione warunki do
zrealizowania danego zadania określonego przez numer sekwencji. Jeśli jest to sekwencja w danym
momencie możliwa do wykonania, drukarka odsyła do komputera potwierdzenie pozytywne ACK (=06H).
Po odebraniu tego potwierdzenia należy przesłać do drukarki dalsze dane jeśli sekwencja takich wymaga.
Jeśli nie jest spełniony jakikolwiek warunek niezbędny do realizacji tego zadania (np. brak papieru
w drukarce) drukarka odsyła do komputera odpowiedź negatywną NAK (=15H=21D).

pzdr
Darek

0

Teraz odpaliłem w jednej konsoli minicom -o
a w drugiej cutecom i widzę w cutcome że minicom wysyła coś do /dev/ttyS4 a drukarka zwraca \0x15 czyli błąd rozkazu...czyli całe podłączenie działa, tylko jak bezpośrednio z konsoli wysłać do drukarki rozkaz ESC,21H
próbowałem coś w tym stylu ale nic to nie daje echo -e "\x27\x33" > /dev/ttyS4

0

Śmieszne pytanie ale: JAKI TO MA ZWIĄZEK Z TEMATEM?

0

Chyba lepiej zadawać pytania w wątku który już dotyczy urządzeń Elzab niż tworzyć nowy i zaśmiecać forum?

0

Nieważne, już sobie poradziłem co prawda nie bezpośrednio w konsoli, ale przez php_serial, dla potomnych:

Podstawowy kod do sterowania drukarką fiskalną Elzab Mera EFV z poziomu PHP (suPHP, debian/ubuntu):

 
<?php 

	require("php_serial.class.php");

	$serial = new phpSerial();

	$serial->deviceSet("/dev/ttyS4");

	$serial->confBaudRate(19200); //Baud rate: 9600

	$serial->confParity("even");  //Parity (this is the "N" in "8-N-1")

	$serial->confCharacterLength(8); //Character length (this is the "8" in "8-N-1")

	$serial->confStopBits(1);  //Stop bits (this is the "1" in "8-N-1")

	$serial->confFlowControl("none"); //Device does not support flow control of any kind, so set it to none.



$serial->deviceOpen();

//27=ESC czyli początek sekwencji

//np. 25H czyli rozkaz

//drukuje raport dobowy

$serial->sendMessage(chr('27').chr(hexdec('25H')));



$read = $serial->readPort();


//6=ACK czyli okej
//np. 15 lub 21 to błędy itd.	

if(ord($read)=='6'){

echo 'ok';

}else{

	echo 'err';

	}



$serial->deviceClose();

?>

1 użytkowników online, w tym zalogowanych: 0, gości: 1