Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Slanje ćirilice na serial COM port - C#

[es] :: .NET :: Slanje ćirilice na serial COM port - C#

[ Pregleda: 2750 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Noche

Član broj: 98924
Poruke: 9
*.205.30.247.robi.com.mk.



Profil

icon Slanje ćirilice na serial COM port - C#03.08.2012. u 12:48 - pre 142 meseci
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.
 
Odgovor na temu

AMD guy
Miroslav
.NET developer

Član broj: 128930
Poruke: 1007

Sajt: www.its.edu.rs


+38 Profil

icon Re: Slanje ćirilice na serial COM port - C#04.08.2012. u 16:04 - pre 142 meseci
Jel si probao UTF8 encoding umesto Unicode?
http://i.imgur.com/V3feW.jpg
http://on.wsj.com/H9yjz6 -- India Graduates Millions, but Too Few Are Fit to Hire
 
Odgovor na temu

Noche

Član broj: 98924
Poruke: 9
*.205.30.247.robi.com.mk.



Profil

icon Re: Slanje ćirilice na serial COM port - C#06.08.2012. u 07:17 - pre 142 meseci
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.
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Slanje ćirilice na serial COM port - C#06.08.2012. u 07:56 - pre 142 meseci
Da li imas nekakvo uputstvo za tu kasu? U kojem se kaze koji enkoding kasa prihvata? Ovako ti je sve nagadjanje.
 
Odgovor na temu

Noche

Član broj: 98924
Poruke: 9
*.205.30.247.robi.com.mk.



Profil

icon Re: Slanje ćirilice na serial COM port - C#06.08.2012. u 08:43 - pre 142 meseci
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
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Slanje ćirilice na serial COM port - C#06.08.2012. u 10:13 - pre 142 meseci
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.
 
Odgovor na temu

Noche

Član broj: 98924
Poruke: 9
*.205.30.247.robi.com.mk.



Profil

icon Re: Slanje ćirilice na serial COM port - C#06.08.2012. u 10:27 - pre 142 meseci
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!
 
Odgovor na temu

Noche

Član broj: 98924
Poruke: 9
*.205.30.247.robi.com.mk.



Profil

icon Re: Slanje ćirilice na serial COM port - C#17.08.2012. u 12:33 - pre 142 meseci
Ajmo ljudi nije valjda da niko nije pisao program za podavnicu...
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Slanje ćirilice na serial COM port - C#17.08.2012. u 13:06 - pre 142 meseci
Pitaj proizvođača uređaja. Oni će ti pre pomoći nego mi.
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Slanje ćirilice na serial COM port - C#17.08.2012. u 13:52 - pre 142 meseci
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);
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Slanje ćirilice na serial COM port - C#17.08.2012. u 14:35 - pre 142 meseci
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č.
 
Odgovor na temu

Noche

Član broj: 98924
Poruke: 9
*.205.30.247.robi.com.mk.



Profil

icon Re: Slanje ćirilice na serial COM port - C#17.08.2012. u 15:01 - pre 142 meseci
@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!
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Slanje ćirilice na serial COM port - C#17.08.2012. u 15:11 - pre 142 meseci
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...
 
Odgovor na temu

loginkiller
Login Killer

Član broj: 121645
Poruke: 76
212.178.227.*



+4 Profil

icon Re: Slanje ćirilice na serial COM port - C#18.08.2012. u 06:52 - pre 142 meseci
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]
----------
MSI H61M-P22 (B3), Intel® Pentium® Dual-Core G840 , DDR3 4GB 1333MHz Silicon Power, Nvidia GeForce 7300 LE, WD Black SATA 160GB , DVD-
RW Pioneer SATA, Bluetooth 2.0, Remote control(use IgorPLUG), Case Moded, MS Industrial 5.1(ML-6015), Dell U2312HM, Dell L100 keyboard, A4Tech X7 748k mouse
 
Odgovor na temu

Noche

Član broj: 98924
Poruke: 9
*.205.30.247.robi.com.mk.



Profil

icon Re: Slanje ćirilice na serial COM port - C#22.08.2012. u 10:53 - pre 142 meseci
@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!!!
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Slanje ćirilice na serial COM port - C#22.08.2012. u 12:54 - pre 142 meseci
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.
 
Odgovor na temu

[es] :: .NET :: Slanje ćirilice na serial COM port - C#

[ Pregleda: 2750 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.