Barkod Printer, Seri Port, USB, C# üzerine… – 3

Bundan önceki ilk 2 makalede sırasıyla Barkod yazıcılara ve C# içinden erişime değinmiştik. Ülkemizde yaygın olarak bulunan Zebra ve Argox yazıcılar için, barkod komut dili olan PPLA PPLB ZPL gibi diller ile tasarım yapmayı ve bu tasarımları barkod yazıcıya göndermeyi anlatmıştım.

Bu makalede ise  C# içinden  USB ile bağlı olan yazıcıya, data göndermek üzere gliştirilmiş kütüphaneyi ve C# içinden kullanımını göstereceğim.

aşağıdaki kodu DirectPrint.cs olarak kaydedip, var olan projenize item olarak eklemeniz yeterlidir.

// DirectPrint.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;

namespace VYP
{
	public class RawPrinterHelper
	{
		// Structure and API declarions:
		[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
		public class DOCINFOA
		{
			[MarshalAs(UnmanagedType.LPStr)]
			public string pDocName;
			[MarshalAs(UnmanagedType.LPStr)]
			public string pOutputFile;
			[MarshalAs(UnmanagedType.LPStr)]
			public string pDataType;
		}
		[DllImport("winspool.Drv", EntryPoint = "OpenPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
		public static extern bool OpenPrinter([MarshalAs(UnmanagedType.LPStr)] string szPrinter, out IntPtr hPrinter, IntPtr pd);

		[DllImport("winspool.Drv", EntryPoint = "ClosePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
		public static extern bool ClosePrinter(IntPtr hPrinter);

		[DllImport("winspool.Drv", EntryPoint = "StartDocPrinterA", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
		public static extern bool StartDocPrinter(IntPtr hPrinter, Int32 level, [In, MarshalAs(UnmanagedType.LPStruct)] DOCINFOA di);

		[DllImport("winspool.Drv", EntryPoint = "EndDocPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
		public static extern bool EndDocPrinter(IntPtr hPrinter);

		[DllImport("winspool.Drv", EntryPoint = "StartPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
		public static extern bool StartPagePrinter(IntPtr hPrinter);

		[DllImport("winspool.Drv", EntryPoint = "EndPagePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
		public static extern bool EndPagePrinter(IntPtr hPrinter);

		[DllImport("winspool.Drv", EntryPoint = "WritePrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
		public static extern bool WritePrinter(IntPtr hPrinter, IntPtr pBytes, Int32 dwCount, out Int32 dwWritten);

		// SendBytesToPrinter()
		// When the function is given a printer name and an unmanaged array
		// of bytes, the function sends those bytes to the print queue.
		// Returns true on success, false on failure.
		public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
		{
			Int32 dwError = 0, dwWritten = 0;
			IntPtr hPrinter = new IntPtr(0);
			DOCINFOA di = new DOCINFOA();
			bool bSuccess = false; // Assume failure unless you specifically succeed.

			di.pDocName = "Mavis RAW Document (Barcode)";
			di.pDataType = "RAW";

			// Open the printer.
			if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
			{
				// Start a document.
				if (StartDocPrinter(hPrinter, 1, di))
				{
					// Start a page.
					if (StartPagePrinter(hPrinter))
					{
						// Write your bytes.
						bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
						EndPagePrinter(hPrinter);
					}
					EndDocPrinter(hPrinter);
				}
				ClosePrinter(hPrinter);
			}
			// If you did not succeed, GetLastError may give more information
			// about why not.
			if (bSuccess == false)
			{
				dwError = Marshal.GetLastWin32Error();
			}
			return bSuccess;
		}

		public static bool SendFileToPrinter(string szPrinterName, string szFileName)
		{
			// Open the file.
			FileStream fs = new FileStream(szFileName, FileMode.Open);
			// Create a BinaryReader on the file.
			BinaryReader br = new BinaryReader(fs);
			// Dim an array of bytes big enough to hold the file's contents.
			Byte[] bytes = new Byte[fs.Length];
			bool bSuccess = false;
			// Your unmanaged pointer.
			IntPtr pUnmanagedBytes = new IntPtr(0);
			int nLength;

			nLength = Convert.ToInt32(fs.Length);
			// Read the contents of the file into the array.
			bytes = br.ReadBytes(nLength);
			// Allocate some unmanaged memory for those bytes.
			pUnmanagedBytes = Marshal.AllocCoTaskMem(nLength);
			// Copy the managed byte array into the unmanaged array.
			Marshal.Copy(bytes, 0, pUnmanagedBytes, nLength);
			// Send the unmanaged bytes to the printer.
			bSuccess = SendBytesToPrinter(szPrinterName, pUnmanagedBytes, nLength);
			// Free the unmanaged memory that you allocated earlier.
			Marshal.FreeCoTaskMem(pUnmanagedBytes);
			return bSuccess;
		}

		public static bool SendStringToPrinter(string szPrinterName, string szString)
		{
			IntPtr pBytes;
			Int32 dwCount;
			// How many characters are in the string?
			dwCount = szString.Length;
			// Assume that the printer is expecting ANSI text, and then convert
			// the string to ANSI text.
			pBytes = Marshal.StringToCoTaskMemAnsi(szString);
			// Send the converted ANSI string to the printer.
			SendBytesToPrinter(szPrinterName, pBytes, dwCount);
			Marshal.FreeCoTaskMem(pBytes);
			return true;
		}
	}

}

VS içindeki Projeniz şuna benzer bir şekilde görünür…

Artık, nereden isterseniz erişebileceğiniz çok düzgün bir sınıfımız oldu. SendBytesToPrinter içinde, yazdırma yöneticisine gönderilecek döküman adı bilgisini görebilirsiniz. Siz barkod bastır komutu verdiğinizde, Windows yazdırma yöneticinde bu isim görünecektir. Dolayısıyla projenize uygun şık bir isim girebilirsiniz.

Programınızdan kullanımı ise, bir önceki makalede gösterildiği gibidir. Yine de kısaca tekrar etmek gerekirse

RawPrinterHelper.SendStringToPrinter(printerName, barStrings);

şeklindeki bir yapı işinizi görür. Buradaki printerName, windows sürücüleri ile kurulu yazıcınızın adıdır. barstrings ise göndereceğiniz barkod komutlarıdır.

Benzer şekilde, paralel port kullanan nokta vuruşlu yazıcılara da direk USB üzerinden aynı sınıfı kullanarak erişebilirsiniz.

Barkod Printer, Seri Port, USB, C# üzerine… – 3” üzerine 53 düşünce

  1. Geri izleme: Barkod Printer, Seri Port, USB, C# üzerine… – 2 | Mavis Kameralı Kontrol Projeleri

  2. Mustafa bey; ellerinize sağlık konuyu derinlemesine işlemiş ve uygulama geliştiren arkadaşları barkod konusunda aydınlatmış oldunuz çok teşekkur ederim.

  3. tesekkur ederiz.
    class i yazdik…
    daha sonra form icerisinde

    OpenFileDialog dosya_ac = new OpenFileDialog();
    if (DialogResult.OK == dosya_ac.ShowDialog(this))
    {

    PrintDialog printer_bul = new PrintDialog();
    printer_bul.PrinterSettings = new PrinterSettings();
    if (DialogResult.OK == printer_bul.ShowDialog(this))
    { RawPrinterHelper.SendFileToPrinter(printer_bul.PrinterSettings.PrinterName, dosya_ac.FileName);
    }
    }

    seklinde kodu calistirdim..
    ama print yapamadim..
    hic hata da vermiyor
    sizce neyi eksik yaptim?

  4. Adım adım gidersek;

    1. yazıcı windows a düzgün olarak kurulu mu? (Yazıcı Zebra serisi mi? Argox serisi mi, diğer bir yazıcı mı)
    2. Yazıcının kendi utility programından baskı alabiliyor musunuz?
    3. hiç hata vermese bile, windows task bar da (Tray Icon) olarak, altta saatin yanında yazdırma yöneticisi hata mesajı karşınıza çıkıyor mu?

    Bu sorulara vereceğiniz cevaplara göre bir ilerleme kaydedebiliriz belki.

    Selamlar
    Kolay Gelsin.

  5. Aslinda ben böyle bir sey programlamistim. Bende hepsi gayet güzel calisiyor. Yani Zebra yazicisina gönderince hepsi güzelce cikiyor. Bende yazicilar otomatik olarak siralaniyor oradan seciyorum. Normal yaziciya gönderince ordanda cikti aloyorum. Benim sorunum Text to File ile. Orda hersey gayet normal calisiyor. Ama file olusmuyor. FREE PDF CReator da da durum ayni. Sizce neye bagli olabilir. Simdiden tesekkürler

  6. Buradaki kod “raw printing” yapmaktadır. Raw print işlemi, tıpkı seri porta data gönderir gibi, RAW datayı, printer a gönderme işlemidir. RAW datanın hangi USB portuna gönderileceği gibi işlemler, printer tanıtma kısmında yapıldığı için yazıcıyı tanıtmaya gerek vardır. Yine de yazıcıya göre değişebilir, denemeniz lazım. Yazıcının kendi sürücüsüyle değil de, Generic olarak tanıtılması da yeterli olabilir.

  7. Merhaba,
    Makale çok yararlı olmuş teşekkürler. Benim de buna benzer bir örnek yapmam gerekiyor ancak yazıcım ağ kablosuyla bağlı yani çıktıyı ağdan göndermem gerekiyor. Onu nasıl yapabilirim fikriniz var mı acaba? Bir de yazıcım monarch marka.

  8. Merhabalar,
    Makaleniz için öncelikle teşekkür ederim. Bir konuda sizden yol göstermenizi rica edeceğim, benim bilgisayarıma bağlı iki yazıcı var, bunlarla ilgili yapmak istediklerim.
    – default bir yazıcı offline duruma geldiginde diğer yedekte bağlı olan online Yazıcı’nın default yazıcı olmasını istiyorum.
    – offline yazıcısında aralıklarla kontrol edip online duruma geçmesini
    – offline olan yazıcı yerine default olan online yazicinin aynı durumla karşılaşması durumunda döngüyü tekrar etmek istiyorum.

    Bunun için nasıl bir yol izlemeliyim yazıcılar USB ile bağlı. Bu konuda bana nasıl ilerleyebeliçegim hakkında bilgi verebilirseniz memnun olurum.

    Yardımlarınız için şimdiden teşekkürler.

  9. Yazıcılarınızın markası-modeli nedir?

    Yazıcıların Offline duruma geçmesi derken, mesela barkod yazıcıların üzerinde ready /hazır gibi bir buton vardır. Bu butona basılı değilse, yazıcı kapalı olur gibi bir anlam mı?

    Demek istediğim şu :
    Yazıcının Online/Offline olduğu 2 şekilde anlaşılır.
    1. Windows Yazdırma Yöneticisi (Windows Yazıcılar Klasöründeki Offline ibaresi)
    2. Yazıcının haberleşme fonksiyonlarına cevap vermemesi (Genelde Seri port ile çalışan yazıcılarda kullanılır)

    Sizin örneğinizde, yazıcıların USB ile bağlı olduğunu belirtmişsiniz. Dolayısıyla, işiniz Window Yazdırma Yöneticisi üzerinden offline olup olmadıklarını anlamaya kalıyor.

    http://www.dreamincode.net/code/snippet4831.htm

    şu adresteki ki IsPrinterOnline kodunu, belirli periyotlarla çalıştırırsanız (Timer kullanarak mesela) amacınıza ulaşabilirsiniz sanırım.

  10. Öncelikle merhabalar. Bu makaleyi paylaştığınız içinde teşekkür ederiz.
    Sizlere bir sorum olacaktı. Ben Zebra ZM400 barkot yazıcısı kullanarak barkot çıktısı alıyorum. Ancak şöyle bir sorunum var yazıcıya yazdırılacak dosyayı gönderdiğimde yazıcının bunu alıp almadığını yada yazdırıp yazdırmadığını belirten bir cevap almak istiyorum. Bunu nasıl sağlayabilirim?

  11. Eğer Argox için sormuş olsaydın, http://www.mavis.com.tr/prog/tools/PPLA&PPLB.pdf dokümanında sayfa 4 te istediğin anlatılıyor derdim. Z4M ile çalışmadım. Eğer, z4M için, user guide değil de, programming guide bulabilirsen (ürün CD si içinde vardır) orada açıklanıyor olmalı. Muhtemelen seri port kullanan bağlantı ile yazıcının durumunu (Ribon bitti, etiket yok, vs.) sorgulayan komut içerecektir. Windows tarafında IsPrinterReady gibi bir fonksiyon ile, yazıcının hazır olup olmadığını sorgulayabilirsin ama bu senin tam işine yaramaz. Özetle, Programming Manual bul ve orada mutlaka anlatılacaktır. Kolay Gelsin.

  12. Print olayını yapıyorum yazıcıya belgeyi gönderiyor ama çıktı alamıyorum. Zebra tlp 2844 barkod cihazım var

  13. Kardeş ilgilendiğin için teşekkür ederim. bunu hallettim etiketi çıkarıyorum. yanlız şöyle bi sorunum var ben bunu web application olarak kullanıyorum local’de sistem çok güzel çalışıyor ama sunucuya attığımda client’eki printerları görmüyor. sunucu portuyla işlem yapıyor. ben bunu client’teki printerdan çıkta alabilmesi için ne yapmam gerekiyor… şimdiden teşekkürler

  14. Kardeş ilgilendiğin için teşekkür ederim. bunu hallettim etiketi çıkarıyorum. yanlız şöyle bi sorunum var ben bunu web application olarak kullanıyorum local’de sistem çok güzel çalışıyor ama sunucuya attığımda client’eki printerları görmüyor. sunucu portuyla işlem yapıyor. ben bunu client’teki printerdan çıkta alabilmesi için ne yapmam gerekiyor… şimdiden teşekkürler.

  15. Merhaba datamax o’neil m-class mark II printerindan USB baglantısıyla etiket çıkartmak istiyorum.projemde rawprinterhelper kullandım ama yazdırma işlemi gerçekleşmedi. printer default printer olarak pc de ekli.pc de sınama sayfası gönderebiliyor,etiket designer programından yazdırabiliyorum fakat projemden yazdırma işlemi yapamıyorum yardımcı olabilir misiniz. rawprinterhelper class olarak ekledim .string s=”aaaa”;
    PrintDialog pd = new PrintDialog();
    pd.PrinterSettings=new PrinterSettings();
    if (DialogResult.OK == pd.ShowDialog(this))
    {

    // Send a printer-specific to the printer.
    RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName,s);
    }
    aaa yazısının çıktısını alamıyorum.

  16. o şekilde direk çıktı alamayabilirsin. Senin yaptığın, USB portundan yazıcıya “aaaa” göndermek. Yazıcı bunu dikkte almayabilir? Gönderdiğin “aaaa” bilgisini nereye yazacak, hangi fontta, hangi satıra, hangi kolona, hele etiketten bahsediyorsan, etiket boyutu ne, ribbon mu var, termal mi? vb. hiçbirşey bilmediği için, gelen bilgiyi ihml edecektir. (Bunları hiç ihmal etmeden, defult ayarlara göre yazan yazıcılar da olabilir ama anladığım kadarıyla seninki o türden değil.)

    Dolayısıyla yapman gereken, yazıcıya anladığı dilden komutları göndermek. Burada 1,2 ve 3 artikel şeklinde anlattığım makaleleri dikkatle okursan bunlara değiniyorum. Mesela “aaaa” göndermek için, önce barkod yazıcının kendi designer programından gönder. Sonra, yazıcı ayarlarına gir ve “print to file” işaretle. Yani yazıcıya değil de dosyaya yazdır. Göreceksin, “aaaa” yazdırabilmek için, program yazıcıya yukarıda bahsettiğim bilgileri de gönderecektir. Sen de o dosyayı alıp değiştirip gönderebilirsin mesela…

    Kolay Gelsin.

  17. Merhaba,

    Bilgisayara tanımlanan yazıcının bilgisayara bağlı olduğunu ek olarak açık olup olmadığını nasıl kontrol edebilirim acaba ? Daha önceki cevaplarınızdaki siteye baktım ama kodlar class eksik olduğu için çalışmadı.

  18. Sorduğunuz soru, yazıcının markasına, desteklediği porta (USB, Seri) desteklediği dile (PPLA, PPLB) kullandığınız işletim sistemine (Windows, MacOS, Linux…) değişir. Her bir yazıcıya uyan bir cevap yoktur. Daha önce çalıştığım ARGOX yazıcılar, seri port üzerinden durum sorgulamasına izin veriyordu. Etiket bitti, kağıt sıkıştı, yazıcı meşgul, herşey yolunda, baskı tamam vb. cevaplar dönderiyordu. Bunları seri porttan dinleyerek yazıcının durumunu öğrenebiliyordun. Diğer markalar aynı şeyi yapmak zorunda değil, ya da başka bir yöntemle yapabilirler. En iyisini, yazıcıyı aldığınız yer bilir. Yazıcının Programlama kılavuzu (genelde CD ile gelir) bunları anlatır. Yazıcının Türkiye distribütörü bilir. Hadi onlar da bilemedi, orijinal üreticisine sorarlar ve size uygun bir cevap verirler. Ne ben, ne de herhangi biri, ilk başta saydığım maddeleri bilmeden cevap yazamaz. Burada anlatılan makale, tüm yazıcılar için geçerli olan evrensel bir yoldur. Daha önceki cevaplarda yazdığım, IsPrinterOnline fonksiyonu, windows print management tarafından sorgulanır (ve ben denedim çalışıyor). Eğer çalışmıyorsa bile, google da aratın benzer bir sürü kod bulacaksınız. Kolay Gelsin.

  19. hocam benim lx 300 yazıcı var ve yukarıdaki class ile koordinat belirterek yazdırmayı nasıl yapabiliriz, ve türkçe karakter sorunuda var 🙁

  20. lx 300, epsonun nokta vuruşlu yazıcısı değil mi? Eğer öyle ise, o zaman (bence) en ideal yol, Code39 gibi bir font yükle ve barkod basmak istediğin yere, Code39 fontunda yazı bas (barkod olarak görünecektir) Yani, lx300 ile istediğin yere, “merhaba” yazabiliyorsan, barkod da basabilirsin (Dediğim gibi Code39 gibi barkod fontları yüklü olmalıdır)

  21. Merhaba,

    Epson TM-T88II model serial port üzerinden çalışan bir printer var elimde. Bunun üzerinden barkod yazdırmak istiyorum ama veri gönderdiğim zaman “????*???” gibi tanımsız karakterler çıkıyor sadece. Bu şekilde hata almamın sebebi sizce ne olabilir ?

  22. merhaba mehmet benimde elimde fiş yazıcı var buradaki kodlarla birşeyler yazmayı denedim ama halen istenilen kıvama getiremedim, Epson’un kodlarını tam olarak nasıl kullanacağımı bilmiyorum sen nasıl gönderiyorsun barkodu?

  23. Buradaki kodlar, seri port ile çalışan barkod yazıcılardan, USB üzerinden çıktı alabilmek içindir. Elinizdeki Fiş yazıcısı,
    i) windows yazıcısı olarak görünüyor mu? (Sınama sayfası yazabiliyor musun)
    ii) seri / paralel / usb hangi porttan bağlı?
    iii) PPLA / PPLB gibi akıllı barkod komut setine destek veriyor mu? (barkod yazıcısı değilse vermez muhtemelen)

    Normalde, yazıcının muhtemelen windows tarafından tanınacaktır ve buradaki kodlar ile değil, çok daha basit yazdırma yöntemleri ile çıktı alabileceksiniz.

  24. @selo

    Ben bundan önce usb bağlantılı bir epsondan yazdırmaya çalışıyordum o çok basitti. PrintDocument’ın printpage() methodu içerisine yazıyordum ben gerekli kodları. Senin fiş yazıcısının bağlantısı usb mi ?

  25. @Mustafa Sarı

    i) Şuan için windows yazıcısı olarak görmüyor. Gerekli driverleri epsonun kendi sitesinde bile bulamadım.
    ii) Seri port’ta bağlanıyor.(COM1)
    ii) PPLA/PPLB konusunda bilgim yok ama barkod yazıcısı olduğunu biliyorum 🙂 Çünkü linux ile çalışan verisiyonunu gördüm aynı modelin…

  26. Ben aşağıdaki gibi çıktı alabiliyorum ancak sayfa yönetimini yapamıyorum yazıyı ortalama,sağ,sol, kağıt boyutu vs. işlemleri yapmak istiyorum daha önce Epson ESC Command ile uğraşan arkadaş tecrübelerini paylaşırsa sevinirim.. kolay gelsin

    private void button2_Click(object sender, EventArgs e)
    {
    string GS = Convert.ToString((char)29);
    string ESC = Convert.ToString((char)27);
    string COMMAND = “”;
    COMMAND = ESC + “d” + ” — Selo —” + “@” + GS + “V” + (char)1;
    MessageBox.Show(COMMAND);

    //// Allow the user to select a printer.
    PrintDialog pd = new PrintDialog();
    pd.PrinterSettings = new PrinterSettings();
    if (DialogResult.OK == pd.ShowDialog(this))
    {
    // Send a printer-specific to the printer.
    RawPrinterHelper.SendStringToPrinter(pd.PrinterSettings.PrinterName, COMMAND);
    }
    }

  27. @mustafa sarı, daha basit yazdırma yöntemleri derken bir örnek verirseniz çok sevinirim, benim yazıcım Perkon A9, USB bağlı ve Windows’tan sınama veya diğer programlardan çıktı alabiliyorum, yazıcım Epson/ESC Pos Komutlarını destekliyor. ama bu komutları c# ile nasıl kullnacağımı bir türlü anlamadım.

  28. hocam ilk olarak ellerinize sağlık vermiş olduğunuz bilgiler doğrultusunda artık istediğim gibi barcode oluşturup yazdırabiliyorum fakat benim sormak istediğim konu şu; ben hata kontrolü yapmak istiyorum yazıcıya barkod oluştur komutu yolladığım zaman yazı barcode yazdıktan sonra bana hazırım mesajını yollamasını istiyorum. ve ben buna göre tekrar bir barcode oluştur demek istiyorum. temel olarak veri kayıplarını engellemek istiyorum. 500 adet barcode oluşturacağımızı düşünürsek 500 adet barcode bilgisini direk gönderdiğimiz zaman bazı sebeplerden dolayı arada bilgi kayıpları olabilir. ben bunun önüne geçmek için yazıcıdan ben barcode oluşturudum hazırım gibi bir mesajı yayınlamasını nasıl sağlarım .

    barcode yazıcım zebra 105SL. saygılarımla.

  29. Yazıcı destekliyorsa, seri port kablosu üzerinden size durum bilgisi verecektir. Daha önce çalıştığım Argox yazıcı PPLA komut setini kullanıyordu ve seri port ile kağıt bitti/hazır/kağıt sıkıştı/yazdırılıyor/yazdırılamadı vb. hata mesajlarını iletiyordu. (Ya da siz sorarsanız söylüyordu).

    PPLB daha üst seviye bir dil olduğundan bu tür komutlar içermez. PPLA daha low level (makina seviyesinde) komutlar içermektedir.

    Son olarak, yazıcının Programmer manual gibi dökümanlarını takip edin. Farklı üreticiler, farklı yöntemler geliştirmişlerdir.

  30. Yazıcınız eski bir model ise, önce şu testi yapın.

    DOS komut satırına inerek (çalıştır da cmd yazıp entera basın)
    dir > COM1
    yazıp entera basın. Bu komut tıpkı DIR komutu gibi, klasörlerin listesini yazıcıya gönderiyorsa, yazıcınız seri porttan gelen herşeyi yazabiliyor demektir.
    Bu durumda işiniz kolay demektir, direk seri porta gönderirsiniz veriyi.

  31. Epson ESC kodları, text modunda yazı yazmak için geçerlidir. Bold, italic, underline gibi birkaç tipi destekler. Bunun dışında FF, LF (Form feed, line feed) gibi komutları destekler. Genelde Fatura yazıcılarında kullanılır. Son derece hızlıdır. Fakat, ekranın istediğin koordinatına göndermek için, hazır bir komutu yoktur. Sen boşlıuk karakterleri ile bunu yapmalısın.
    Mesela Ortaya Tarih sağa rakam yazacaksan ” 21.03.2017 45.00 TL” gibi bir bilgi göndermelisin. Bence önce bir text dosyaya yaz, sonra bu dosyayı direk yazıcıya gönder. EPSON ESC kodlarını internette hemen her yerde bulabilirsin.

  32. paylaşım için çok teşekkürler. sorunsuz çalışıyor. fakat tek bir sıkıntı var, barkod dizaynımda ürün açıklaması yer alıyor iki satırda. ilk satıra sığmayan ikinci satıra geçip devam ediyor. rawprinterhelper ile bunu beceremedim. o kod şu şekilde :

    A377,273,2,3,1,1,N,”*1;Aciklama,1*”
    A377,251,2,3,1,1,N,”*1;Aciklama,2*”

    buraya *Aciklama* değerini değiştir diyorum, yazıcıda çıkan sadece *1;Aciklama,1* ve *1;Aciklama,2*.

    bu konuda yardımınız olursa. çok çok sevinirim. tekrar teşekkürler.

  33. *1;Aciklama,1* ifadesinde bir sorun var galiba. C# tarafında String.Replace ile değiştirirken “*1;Aciklama,1*” ifadesini kendi değerinle mi değiştiriyorsun, yoksa *Aciklama* ifadesini mi? Eger 2. sini yapiyorsan calismaz. Sorun senin tarafindaki kodlarda ve biraz dikkat edersen kolayca cozulur bence.

  34. sablon = sablon.Replace(“*Barkod*”, (string)dataGridView1[6, 0].Value);
    sablon = sablon.Replace(“*Aciklama*”, (string)dataGridView1[3, 0].Value);
    sablon = sablon.Replace(“*UrunMarka*”, (string)dataGridView1[2, 0].Value);
    sablon = sablon.Replace(“*Araba*”, (string)dataGridView1[1, 0].Value);

    bunlar, prn dosyamda değiştirdiğim stringler.
    dediğim gibi bir tek Aciklama’yı iki satıra yazamıyorum. tek satıra yazmasında sıkıntı yok. etiketime bütün açıklamayı yazabilmek için iki satıra yazdırmak istiyorum, ki netsis bunu ilk yorumumdaki kod ile yapıyor. ben c# ile yapamadım. daha farklı ne yapabilirim de bunu çözerim bilemiyorum. string i parçalamayı düşündüm ama, netsis bunu kolayca yapabildiğine göre, barkod yazıcımla yaptığım konuşmada bir sıkıntı olduğunu düşünüyorum. ona doğru şekilde gönderemiyorum komutu.

  35. Yazıcı ile konuşmada bir sıkıntı yok. Öyle olsaydı hiç barkod bastıramazdın. Netsis bu yöntemle yapmıyor olabilir, birçok barkod bastırma yöntemi var. Barkod yazıcı ile gelen uygulama ile (LabelDesigner vb…) bu dediğini yapmaya çalış. Yapabilirsen, barkod kodlarını dosyaya yazdır ve nasıl yapıldığına bak. (Ya da PPLA – PPLB – ZPL gibi programming language manuallerini oku) Bazı barkod yazıcılar Enter karakterini kabul eder, bazıları etmez. (Aciklama stringin abc\r\nxyz gibi ise mesela, bazıları alt satıra geçer) Bazı barkod yazıcılarda Word Wrap (metni kırp) özelliği vardır, otomatik olarak yapar. Özetle, birçok yöntem vardır ve sana uyanı kendin bulman gerekir. Buradaki bilgiler, genel amaçlıdır. Kolay gelsin.

  36. Merhaba,

    Epson TM-T88IV model bir barkod printer var. Bundan çıktı almam gerekli. Sizin verdiğiniz fonksiyon ile deneme yaptım çıktı alıyor yalnız barkod bastıramıyorum. Printer’ın hangi barkod komut dilini kullandığını bulamadım bu konuda yardımcı olabilirmisiniz.

    Ek olarak programın driverlarını ve manual’lerini okudum programlama ile ilgili döküman mevcut ama onda da belirli uzunlukta veri göndermek ile ilgili bilgiyi göremedim. Tüm fonksiyonlarda IntPtr türünden bir değişken istiyor o kadar.

  37. Merhaba Mustafa Bey,

    Barkod ile ilgili bir araştırma yaparken sitenizi buldum oldukça faydalı,Zebra yazıcının programını kullanarak hazırladığım arayüz ‘ü string olarak kaydedip alabiliyorum şimdi bu string veriyi c# ile tekrar barkod haline çevirmem lazım bu konuda yardımcı olurmusunuz?

    Bendeki yazıcının programından aldığım string veri aşağıdaki gibi benim bu veriyi c# ile alıp yazıcıdan çıktısını almam lazım

    M23,5,5
    N
    q496
    Q376,24+0
    S3
    D8
    ZT
    TTh:m
    TDy2.mn.dd
    O
    A63,40,0,3,1,1,N,”[*1*]”
    A63,80,0,5,1,1,N,”[*33:2*]”
    A317,126,0,4,1,1,N,”TL / AD”
    A319,167,0,1,1,1,N,”K.D.V. DAHILDIR”
    B248,207,0,E30,2,2,101,B,”[*28*]”
    A50,330,0,1,1,1,N,”[*0*]”
    A317,330,0,1,1,1,N,”[*49*]”
    P1

    İyi çalışmalar

  38. bu veriyi USB üzerinden yazıcıya göndereceksin. İşte makaleler ile anlattığım gibi yapabilirsin.
    Buradaki değişen kısımları String.Replace ile değiştirip kendi güncel değerlerini set et, sonra ilk 3 makalede anlattığım gibi usb üzerinden barkod yazıcıya gönder.
    Eğer yazıcın Seri Port destekliyorsa, serialport komponenti kullan ve

    serialport1.write(bakoddata);

    gibi bir komutla hallet.
    Kolay Gelsin.

  39. Merhaba, anlatılan şekilde zebra barkod yazıcıda barkod yazdırabiliyorum fakat bilgiyi printer gönderdikten yaklaşık 10 sn sonra basıyor. fakat zebradesigner ile gönderdiğimde bir problem yok. Problem ne olabilir. Teşekkürler…

  40. ikinci kez çok teşekkür ederim bu paylaşım ve anlatımınız için. ciddi şekilde kullanıyorum bu sınıfı, fakat uzak bağlantıda barkod alamadım. diğer yazıcıları uzak bağlantıda hiç ekstra birşey yapmadan kullanabiliyorum, zebra yazıcıma gelen giden olmuyor. bununla ilgili bir düşünceniz var mı, nasıl çözülebilir.

  41. Eğer beb birden çok barkod yazıcı kullanıcaksam izleyeceğim yol nasıl olmalıdır sadece bir veriyi değiştiricem 3ünede benzer kodu yollayacağım. Birden barkod yazıcıya veri gitmeli fakat ben tuşa bastığımda çıktı vermeli bu konuda bilginiz var mı

  42. mrb mustafa bey paylaşımınız için teşekkürler
    dokumanı takip edip gerekeni yaptım yalnız ard arda barcode yolladımda spooler a doluo ama barcodu yazdırdıktan sonra yaklaşık 10 saniye bekliyor sonra bir sonrakini yazdırıyor print() fonksiyonuylada yapsam aynı sonuç sorun ne olabilir nasıl düzeltebilirim zebra designer da çıkartığım zaman bi sıkıntı yok
    Teşekkürler

  43. Villes c’était l’occasion business corevalve
    delamaison maltem meilleurmobile le droit d’organiser les
    reprise temporaire d’emploi (lire société mauricienne asset
    rachète jeu je l’ai encouragé répondre aux nombreux la n’yrien
    du tout entre d’ici la compétition. Le les programmes de du générale
    du et la sur le marché le pouvoir d’achat.

    My web page :: avis finchmarkets

  44. Merhabalar
    Üdtad ben bu kod parçalarını çalıştırmaya çalışıyorum. Ama her seferinde “Printer driver is not been specified” diye hata alıyorum. Nedeni nedir acaba ?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace TSCLIB_DLL_IN_C_Sharp
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

    TSCLIB_DLL.openport(“TSCTA210 on 10.10.30.102”);
    TSCLIB_DLL.setup(“149 mm”, “38 mm”, “3”, “8”, “0”, “0”, “0”);
    TSCLIB_DLL.clearbuffer();

    TSCLIB_DLL.printerfont(“100”, “250”, “3”, “0”, “1”, “1”, “Print Font Test”);
    TSCLIB_DLL.windowsfont(100, 300, 24, 0, 0, 0, “ARIAL”, “Windows Arial Font Test”);

    TSCLIB_DLL.sendcommand(“SIZE 4mm , 2.5mm”);
    TSCLIB_DLL.sendcommand(“BOX 10,300,300,300,5”);

    TSCLIB_DLL.printlabel(“1”, “1”);
    TSCLIB_DLL.closeport();

    }

    }
    }

  45. Merhaba,
    5li yapışkanlı rulo kağıdım var. Bunların herbirine dikey barkod yazdırmak istiyorum. Sizdeki bu kod anladığım kadarıyla bir tane ve yatay barkod basıyor. Bunları yan yana nasıl yazdırmasını sağlayabilirim?

  46. Tekrar Merhaba,
    Ayrıca bu komutlar sadece zebra barkod yazıcıda mı destekleniyor. Elimde argox os-214 plus barkod yazıcım var. Bunda da aynı komutlar çalışır mı?

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir