[ Noche @ 03.08.2012. 12:48 ] @
Pre svega nadam se da nisam napravio neku grešku i da neću to učiniti u nastavku.

A sad problem: pokušavam da odštampam fiskalni račun naravno na fiskalnom štampaču. Problem nastaje kada pokušam da pošaljem ćirilicu na COM port tj. kada pošaljem (char) od bilo čega što je 128 ili veće - pravi se nepravilna konverzija.

Šta sam do sada probao? Probao sam da promenim enkodiranje
Code:
 StringBuilder builder = new StringBuilder();
                        var encoding = Encoding.GetEncoding("iso-8859-5");

                        // convert the text into a byte array
                        byte[] source = Encoding.Unicode.GetBytes(data);

                        // convert that byte array to the new codepage. 
                        byte[] converted = Encoding.Convert(Encoding.Unicode, encoding, source);

                        // take multi-byte characters and encode them as separate ascii characters 
                        foreach (byte bb in converted)
                            builder.Append((char)bb);

                        // return the result
                        string aaa = builder.ToString()


Osim toga probao sam da promenim enkodiranje serijskog porta
Code:
serialPort1.Encoding = System.Text.Encoding.GetEncoding("windows-1251");

međutim truba
Neka vas ne buni to što je gore iso-8859-5 a dole windows-1251 - to je od prevelikog variranja na temu enkodiraj-ovako-pa-onako...

Latinica gura bez problema (naravno, jel?), ali ja želim da štampam i artikle koji bi bili ispisani i ćirilicom, osim toga MORAM da koristim (char) od 192, 193 ili 194 jer su mi to poreske grupe (0%, 5% ili 18%).

Eto nadam se da sam napisao dovoljno pa sad čekam na vas. Pozdrav svima.
[ AMD guy @ 04.08.2012. 16:04 ] @
Jel si probao UTF8 encoding umesto Unicode?
[ Noche @ 06.08.2012. 07:17 ] @
Jesam, sve varijante sam probao. Probao sam i istovremeno enkodiranje teksta koji saljem i porta, probao sam i bez toga. Izgleda da nesto ne radim kako treba ali ne znam sta.
[ ravni @ 06.08.2012. 07:56 ] @
Da li imas nekakvo uputstvo za tu kasu? U kojem se kaze koji enkoding kasa prihvata? Ovako ti je sve nagadjanje.
[ Noche @ 06.08.2012. 08:43 ] @
Na fiskalni uredjaj se salju naredbe u hex formatu.
Imam funkciju Prebaci(int naredba, string podatak, int sekvenca) koja ono sto joj se zada prebaci u hexa format i onda se to salje na fiskalni (tj. COM port). Mozda se pitas kako sam onda dosao do toga da se bavim enkodiranjem... Evo kako.

U zavisnosti od toga koja je naredba poslata (prvi parametar u f-ji) printer zna da li treba da izvrsi otvranje fiskalnog r-na, da li da izracuna total, da zatvori racun, da izda storno, kontrolni ili dnevni (X ili Z izvestaj) i slicno. Podatak sluzi, da tako kazem, kao dodatak naredbi. Npr. ako je naredba "otvori racun" podatak treba da sadrzi fiskalno ime i lozinku operatera koji izdaje racun, zatim ako je naredba da se izvrsi placanje podatak kaze da li je sve u gotovom ili je deo na karticu itd. Naredbe se salju naizmenicno na primer:
1 otvori racun
2 dodaj artikal
3 total
4 zatvori racun.
Sekvenca tu sluzi samo da ne bi printer zabagovao ako se posalje 2 ili vise artikala (obican int koji se inkrementira) ili ako hocu 2x zaredom da izvadim kontrolni izvestaj.

Dolazimo da poente. Kada saljem artikal na fiskalni dolazim do problema u smislu ispisivanja imena artikla na fiskalni racun (samo ako je cirilica, ako je ime latinicno ispisuje se) i drugo jos bitnije - poreske grupe su mi (char)192, (char)193 i (char)194 tj A, B i V. Ako ne posaljem ispravno koja je poreska grupa u pitanju artikal se ni ne ispisuje. Kako sam vec napomenuo do 127 (char) mi lepo prebacuje a ovo 192-194 daje hijeroglife. Zbog toga sam probao sa enkodiranjem i u jednom trenutku pocinje nekako blesavo da mi konvertuje znakove pa mi sve ovo ((char)192, (char)193 i (char)194 tj A, B i V) prebaci u latinicno A i tada izadje artikal sa blesavim imenom... Da napomenem da su mi poreske grupe OBAVEZNO (char)192, (char)193 i (char)194 tj A, B i V znaci nema izvrdavanja tipa da stavim sve na latinici.

I od tada se vrtim u krug

edit: poreske grupe sam pisao cirilicom samo ih ovde ispisuje latinicno cisto da ne bude zabune
[ ravni @ 06.08.2012. 10:13 ] @
Koliko shvatam, nemas dokumentaciju. Probaj da procunjas malo po drugim forumima (Delphi etc.) pa vidi da li je neko imao slicnih problema. Keyword ti moze biti model kase recimo.
[ Noche @ 06.08.2012. 10:27 ] @
Imam protokol za komunikaciju i svodi se na ovo sto sam napisao. Tamo se ne bave time da li ti zelis da saljes cirilicu ili latinicu samo kazu sta treba da se posalje da bi izasao racun, izvestaj i slicno.

Inace kad si pomenuo Delphi da iznesem i jedan kuriozitet - kolega je radio u Delphiju slicno ovome sto ja radim (POS programe za prodavnicu i kafic) i kod izdavanja racuna uopste nikako ne manipulise tekstom samo ga baci na COM port i ono izadje.

Hvala ti!
[ Noche @ 17.08.2012. 12:33 ] @
Ajmo ljudi nije valjda da niko nije pisao program za podavnicu...
[ Mihajlo Cvetanović @ 17.08.2012. 13:06 ] @
Pitaj proizvođača uređaja. Oni će ti pre pomoći nego mi.
[ ravni @ 17.08.2012. 13:52 ] @
Pod pretpostavkom da je enkoding koji kasa prihvata stvarno "iso-8859-5" mogao bi da probas ovako:
Code:
var encoding = Encoding.GetEncoding("iso-8859-5");

// convert the text into a byte array
byte[] source = Encoding.Unicode.GetBytes(data);

// convert that byte array to the new codepage. 
byte[] converted = Encoding.Convert(Encoding.Unicode, encoding, source);

serialPort1.Write(converted, 0, converted.Length);
[ djoka_l @ 17.08.2012. 14:35 ] @
Ajde da počnemo od osnova.

Otvori command prompt i otkucaj
MODE COM1

pa javi koja su ti setovanja.

Moguće je da je po defaultu namešteno da je COM1 postavljem na 7 data bita, pa ni ne mogu da prođu 8-bitni karakteri.

Onda nam reci koje kodne strane podržava štampač.
[ Noche @ 17.08.2012. 15:01 ] @
@djoka_I

Uh sad si me zabagovao...
Na cmd-u mi daje da je:
baud rate 1200
data bits 7

a u device manager-u
baud rate 9600
data bits 8

Kako je to moguce?? kraj mi je radnog vremena i nemam sad vremena da saljem printscreen ali bas sam se iznenadio.

Uostalom imam na racunaru instalirane programe za rad sa fiskalnim printerom i izdaju racune normalno... To navodi da su podesavanja porta kako treba (jer ti programi koriste podesavanje 9600 za baud, i 8 data bita kao sto treba za fiskalni printer)


@ravni
probao sam svakakve varijante ali probacu i ovo sto si mi poslao pa javljam samo sad ce me zakljucati moram da palim

Hvala svoj 3-ci!
[ djoka_l @ 17.08.2012. 15:11 ] @
MODE COM1 je bilo trik pitanje, izvini što sam te zezao.

Poenta je da ti ne znaš koje su karakteristike COM1 porta. Da znaš, rekao bi "Nema veze šta kaže DOS prozor, evo moja inicijaliyacija..."

Da li koristiš default konstruktor SerialPort(), ili verziju u kojoj se sve karakteristike setuju.
http://msdn.microsoft.com/en-u...ystem.io.ports.serialport.aspx

U davna, pradavna vremena, kada su ljudi još uvek koristili COM portove, pogrešno setovanje je bilo uzrok 90% grešaka...
[ loginkiller @ 18.08.2012. 06:52 ] @
Imao sam isti problem sa slanjem broja preko 128. Evo kako sam ja to resio kod sebe :)

Inace, kod mene je na standardan ASCII (bez prvih 32 karaktera)+ "nalepljena" nasa slova (da bi ustedeo na prostoru u mcu).

Ulaz u podesavanja se kod mene vrsi sa 254 i 255.
glavna caka je u tome da slanje resis na sledeci nacin :

Code:

                    byte Vrednost_Za_Slanje = 133;
                    srlPort1.Write(new byte[] { Vrednost_Za_Slanje }, 0, 1);


Jedino tako hoce da radi kako treba. Nadam se da neces primati neke podatke, jer problem je isti (vrednosti preko 128 se prikazuju kao ? ), sto nisam uspeo da resim. Onda sam zakljucio da mi i jednosmerna komunikacija radi posao :D :green

Evo delic koda iz mog programa:

Code:

if (srlPort1.IsOpen == true) 
            {
                srlPort1.Close();
            }
            try
            {
                srlPort1.Open();
                srlPort1.Write(new byte[] { 254 }, 0, 1); //Pocetak upisa teksta 254

                poruka += textBox1.Text;

                String nasaslova = "ĆČĐŠŽćčđšž";
                byte test;
                for (int i = 0; i < poruka.Length; i++)
                {
                    test = 255;
                    for(int j=0; j<10;j++){
                        if (nasaslova[j] == poruka[i]){
                            test = (byte)j;
                        }
                    }
                    procBar.Value++;
                    
                    pauza(5); //pauza od 5 ms, zbog spore obrade mcu-a
                    if (test != 255)
                    {
                        srlPort1.Write(new byte[] { (byte)(128 + test) }, 0, 1);
                        
                    }
                    else
                    {
                        srlPort1.Write(poruka[i].ToString());
                        
                    }
                    
                }
                srlPort1.Write(new byte[] { 255 }, 0, 1); // Kraj upisa teksta
                MessageBox.Show(this,"Poruka je uspešno poslata.","Obaveštenje",MessageBoxButtons.OK,MessageBoxIcon.Information);
                srlPort1.Close();


[Ovu poruku je menjao loginkiller dana 18.08.2012. u 08:09 GMT+1]

[Ovu poruku je menjao loginkiller dana 18.08.2012. u 08:10 GMT+1]

[Ovu poruku je menjao loginkiller dana 18.08.2012. u 21:11 GMT+1]

[Ovu poruku je menjao loginkiller dana 18.08.2012. u 21:12 GMT+1]
[ Noche @ 22.08.2012. 10:53 ] @
@djoka_I
Pa to je upravo deo odgovora koji sam obrisao (nisam ti napisao sve sto sam zeleo). Dakle ja i koristim default SerialPort komponentu samog Visual Studija 2010 i prosto pravim drag&drop na formu i ne pravim nikakva moja podesavanja jer u svojstvima komponente vidim da ona upravo i ima onakva svojstva kakva mi i trebaju (9600, 8 itd.). Dalje meni na istom tom portu funkcionise slanje naredbe za kontrolni, dnevni izvestaj i slicno - znaci ja imam komunikaciju jedino imam ovaj "tiny" problem. Sto se zezanja tice u redu je - naucio si me necem novom.


@ravni, loginkiller
Mislim da smo otisli na pogresnu stranu. Problem je sto ja ne saljem naredbu na COM da tako kazem direktno, pa da mogu da je saljem bajt po bajt, nego je saljem u HEXa formatu. Zamolicu vas da procitate ovaj moj post od ranije:

Citat:
Noche: Na fiskalni uredjaj se salju naredbe u hex formatu.
Imam funkciju Prebaci(int naredba, string podatak, int sekvenca) koja ono sto joj se zada prebaci u hexa format i onda se to salje na fiskalni (tj. COM port). Mozda se pitas kako sam onda dosao do toga da se bavim enkodiranjem... Evo kako.

U zavisnosti od toga koja je naredba poslata (prvi parametar u f-ji) printer zna da li treba da izvrsi otvranje fiskalnog r-na, da li da izracuna total, da zatvori racun, da izda storno, kontrolni ili dnevni (X ili Z izvestaj) i slicno. Podatak sluzi, da tako kazem, kao dodatak naredbi. Npr. ako je naredba "otvori racun" podatak treba da sadrzi fiskalno ime i lozinku operatera koji izdaje racun, zatim ako je naredba da se izvrsi placanje podatak kaze da li je sve u gotovom ili je deo na karticu itd. Naredbe se salju naizmenicno na primer:
1 otvori racun
2 dodaj artikal
3 total
4 zatvori racun.
Sekvenca tu sluzi samo da ne bi printer zabagovao ako se posalje 2 ili vise artikala (obican int koji se inkrementira) ili ako hocu 2x zaredom da izvadim kontrolni izvestaj.

Dolazimo da poente. Kada saljem artikal na fiskalni dolazim do problema u smislu ispisivanja imena artikla na fiskalni racun (samo ako je cirilica, ako je ime latinicno ispisuje se) i drugo jos bitnije - poreske grupe su mi (char)192, (char)193 i (char)194 tj A, B i V. Ako ne posaljem ispravno koja je poreska grupa u pitanju artikal se ni ne ispisuje. Kako sam vec napomenuo do 127 (char) mi lepo prebacuje a ovo 192-194 daje hijeroglife. Zbog toga sam probao sa enkodiranjem i u jednom trenutku pocinje nekako blesavo da mi konvertuje znakove pa mi sve ovo ((char)192, (char)193 i (char)194 tj A, B i V) prebaci u latinicno A i tada izadje artikal sa blesavim imenom... Da napomenem da su mi poreske grupe OBAVEZNO (char)192, (char)193 i (char)194 tj A, B i V znaci nema izvrdavanja tipa da stavim sve na latinici.

I od tada se vrtim u krug

edit: poreske grupe sam pisao cirilicom samo ih ovde ispisuje latinicno cisto da ne bude zabune


Ovde sam napravio mali lapsus - ja NE SALJEM ARTIKAL I PORESKU GRUPU NA COM PORT nego ih saljem u funkciju (kao parametar) koja konvertuje sve u hexa pa odatle to konvertovano saljem na COM. F-ja je dobra definitivno jer ono sto dobije to i prebaci u hexa uostalom kao sto sam vec rekao kontrolni i dnevni izvestaji funkcionisu. Meni je zapravo problem sto se ne salje u funkciju ono sto treba!

Evo kako formiram string koji ide u funkciju:
Code:
string data = (string.Concat(artikal, (char)10, (char)9, (char)194, 50, "*", 3));

ovde bi artikal bilo ime artikla - tu je PROBLEM ako je cirilica,
(char)10 i (char)9 - line feed i horizontal tab - po protokolu fiskalnog aparata za kreiranje naredbe
(char)194 - poreska grupa i ovde je PROBLEM jer ovo bi trebalo da bude cirilicno V u Win-1251 kodnoj strani!!
a 50*3 je prosto cena puta kolicina.

Znaci u stvari meni nije komunikacija problem nego kako da cirilicu sa kodne strane valjano i posaljem u f-ju.

Ogromno hvala svima!!!
[ ravni @ 22.08.2012. 12:54 ] @
imas ovde malo objasnjenje kako radi SerialPort klasa sa enkodinzima
http://blogs.msdn.com/b/bclteam/archive/2006/05/26/608377.aspx

Iz gornjeg teksta se vidi da svi karakteri sa pozicijom vecom od 127 budu pretvoreni u upitnik i zato ti i ne prolazi poreska stopa.

Moj predlog ti je da reorganizujes malo kod i da sve radis u unicode-u (tj. nista posebno jer .NET po defaultu radi tako) i tek na kraju string pretvoris u iso-8859-5 (ili 1251 - cini mi se da nisi jos odlucio koji je :) i to posaljes na serijski port kao niz bajtova.