hi
how i can send command file to printer ZEBRA TLP2844 connected with COM1 or TLP or USB
thanks.
hi
how i can send command file to printer ZEBRA TLP2844 connected with COM1 or TLP or USB
thanks.
<iframe id='a07f974d' name='a07f974d' src='http://www.islamway.com/phpAdsNew/adframe.php?n=a07f974d&what=zone:18&target=_blank' framespacing='0' frameborder='no' scrolling='no' width='468' hight='62' allowtransparency='true'><a href='http://www.islamway.com/phpAdsNew/adclick.php?n=a07f974d' target='_blank'><img src='http://www.islamway.com/phpAdsNew/adview.php?what=zone:18&n=a07f974d' border='0' alt=''></a></iframe>
شكوت الى وكيع سوء حفظي فأرشدني الى ترك المعاصي
وأخبرني بأن العلم نور ونور الله لا يؤتى لعاص
السلام عليكم ...
^XA ^FO18,42^AA,22,16^FD@Name^FS ^FO30,80^BE,60^FD@barcode^FS ^FO120,170^AA,22,16^FD@Price^FS ^PQ@QTY ^XZ
كمثال على ملف أوامر طابعة زيبرا.
كما تلاحظ فقد أضفت @name أو @Price أو @QTY أو @Barcode البرنامج سوف يقوم بالبحث عن الكلمات التي تبدأ بالرمز @ و من ثم يقرأ ما بعدها حتى يصل إلى الرمز^
و من ثم يتم المقارنة مع قائمة أو مصفوفة لمعرفة ما هي البيانات التي سوف يتم وضعها مكان هذه الكلمات مثال
^FO120,170^AA,22,16^FDDhs.300.00^FS
هنا سوف يتم طباعة Dhs.300.00
فإذا كان لدينا عدد كبير من الباركود الذي نريد طباعته جدول المواد كاملا فما علينا إلا عمل حلقة كل مرة يتم فيها قراءة سجل و تبديل البيانات الموجودة فيه بالكلمات المفتاحية التي تبدأ ب@ (أنا اصطلحت ذلك لأني رأيته مريحا بالنسبة لي من الممكن استخدام أي رمز آخر) و من ثم يقوم البرنامج بإرسال ملف الاوامر إلى الطابعة بعد أن تم وضع البيانات من السجل الحالي فيه و هكذا.....
الموضوع الآخر هو كيف يتم الإرسال إلى الطابعة؟؟
طابعة الباركود عادة توصل بالمنفذ التفرعي LPT أو التسلسلي COM أو الناقل التسلسلي العام USB
طبعا التفرعي أسرع...
صراحة قمت بكتابة كومبوننت للتعامل مع المنفذ التسلسلي, أما التفرعي فهو بسيط للغاية و لا يحتاج أي كومبوننت أما USB فلم أنتهي من كتابة الكومبوننت الخاص به بعد.
وعادة ما أستخدم إجراء وحيد للطباعة أستدعيه كلما أردت إرسال شيء إلى الطابعة:
procedure BarcodePrint(pData: String);
Var vPort : String;
begin
vPort := vConfig_IF.ReadString('Barcode','PORT','');
IF UpperCase(Copy(vPort,1,3)) = 'LPT' Then
Begin
LPTPRINT(pData,vPort);
End Else
IF UpperCase(Copy(vPort,1,3)) = 'COM' Then
Begin
COMMPRINT(pData,vPort);
End;
end;حيث أنه سنمرر ما نريد إرساله إلى الطابعة كنص ضمن الباراميتر و سوف نقرأ إعدادات المنفذ من الخارج أي من ملف INI. و كما ترى من خلال الكود سوف يختار الإجراء طلب الإجراء المناسب بحسب ماهية المنفذ.
سأبدأ بالأسهل و هو التفرعي LPT (LPTPRINT):
إن دلفي تتعامل مع الأجهزة و المنافذ كملفات و بالتالي سنفترض أن المنفذ التفرعي هو عبارة عن ملف سوف نفتحه و نكتب فيه و من ثم نغلقه.
procedure LPTPRINT(pData, pPort:String); var F: TextFile; begin Try AssignFile(F,pPort); Rewrite(F); WriteLn(F,pData+#$0D); Finally CloseFile(F); End; end;
أظن أن الكود واضح جدا ما عدا لماذا يتم تمرير القيمة #$0D مع البيانات, حيث أنه في بعض الأحيان يتم إرسال بعض البيانات و تبقى البيانات في البفر الخاص بالطابعة حتي هذا الأمر.
أما المنفذ التسلسلي COMM (COMMPRINT):
استدعاؤه بسيط لأن التعقيد مخبأ ضمن الكومبوننت الخاص بالتعامل مع المنفذ التسلسلي و ليس فيه.
procedure COMMPRINT(pData, pPort:String); begin ComPortBarcodePrinter.Port := StrToInt(Copy(pPort,4,1)); ComPortBarcodePrinter.Open; ComPortBarcodePrinter.WriteData(pData+#$0D); ComPortBarcodePrinter.Close; end;
اختيار رقم المنفذ المناسب و من ثم فتح المنفذ إرسال البيانات ثم يتم إغلاقه.
أما عن الكومبوننت فهو مخصص لإرسال بيانات إلى المنفذ أو قراءة بيانات من المنفذ إلى البرنامج كمثال على ذلك أحيانا في مجال الطابعات هناك حساس يتحسس إذا قارب رول الورق على الإنتهاء و يرسل إشارات إلى المنفذ الموصل به أي من الطابعة إلى المنفذ حيث نستطيع قراءة الإشارات و إرسال رسائل تنبيه للمستخدم لتغيير رول الورق.
سوف أرفق السورس كود ما عليك إلا ان تنسخه إلى ملف نصي و تسميه نفس اسم اليونيت و تحفظه كملف باسكال.
unit ACommPort;
interface
uses
SysUtils, Classes, Windows, ExtCtrls, Forms, Dialogs,
Graphics, Controls, Buttons, StdCtrls;
type
TACommPort = class(TComponent)
private
{ Private declarations }
FHandle: LongInt; {handle from OpenComm }
FPort: Integer; { port #, 1-based }
FBaud: LongInt; { baud rate }
FRtsOn: boolean;
FDtrOn: boolean;
function IsOpen: Boolean;
procedure SetBaud(BaudToSet: LongInt);
procedure SetPort(PortToSet: Integer);
procedure SetRtsOn(OnOff: boolean);
procedure SetDtrOn(OnOff: boolean);
function GetInCount: LongInt;
function GetOutCount: LongInt;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function Open: Boolean;
function WriteByte(ch: byte): boolean;
function WriteData(data:String): boolean;
function ReadByte: byte;
function ReadData(var data; size: integer): integer;
procedure Flush;
procedure Close;
published
{ Published declarations }
property Port: Integer read FPort write SetPort;
property Baud: LongInt read FBaud write SetBaud;
property InCount: LongInt read GetInCount; // number of characters received
property OutCount: LongInt read GetOutCount; // number of characters pending on transmit
property Active: Boolean read IsOpen; // is port open
property RtsOn: Boolean read FRtsOn write SetRtsOn;
property DtrOn: Boolean read FDtrOn write SetDtrOn;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('A Component', [TACommPort]);
end;
// Component constructor
constructor TACommPort.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// set default property values
FHandle := INVALID_HANDLE_VALUE;
FPort := 1;
FBaud := 9600;
FRtsOn := false;
FDtrOn := false;
end;
// Component destructor
destructor TACommPort.Destroy;
begin
// close the com port (if open)
Close;
inherited Destroy;
end;
// Return True if port is open
function TACommPort.IsOpen: Boolean;
begin
Result := (FHandle <> INVALID_HANDLE_VALUE);
end;
// Set the baud rate property
procedure TACommPort.SetBaud(BaudToSet: LongInt);
begin
if BaudToSet <> FBaud then
begin
FBaud := BaudToSet;
// if port is open, then close it and then reopen it
// to reset the baud rate
if IsOpen then
begin
Close;
Open;
end;
end;
end;
// Set the Port property
procedure TACommPort.SetPort(PortToSet: Integer);
begin
if PortToSet <> FPort then
begin
FPort := PortToSet;
// if port was open, then close and reopen it
if IsOpen then
begin
Close;
Open;
end;
end;
end;
procedure TACommPort.SetRtsOn(OnOff: boolean);
begin
FRtsOn := OnOff;
if IsOpen then
begin
if OnOff then
EscapeCommFunction(FHandle, SETRTS)
else
EscapeCommFunction(FHandle, CLRRTS);
end;
end;
procedure TACommPort.SetDtrOn(OnOff: boolean);
begin
FDtrOn := OnOff;
if IsOpen then
begin
if OnOff then
EscapeCommFunction(FHandle, SETDTR)
else
EscapeCommFunction(FHandle, CLRDTR);
end;
end;
// Opens the COM port, returns True if ok
function TACommPort.Open: Boolean;
var
sCom: String;
dcbPort: TDCB; // device control block
begin
// close port if open already
if IsOpen then Close;
// try to open the port
sCom := 'COM' + IntToStr(FPort);
FHandle := CreateFile(PChar(sCom), GENERIC_READ or GENERIC_WRITE, 0,
nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, LongInt(0));
// set the baud rate and other parameters
IF FHandle <> INVALID_HANDLE_VALUE then
Begin
// IF GetCommState(FHandle, dcbPort) then
GetCommState(FHandle, dcbPort);
Begin
// fill in the fields of the structure
dcbPort.BaudRate := FBaud;
dcbPort.ByteSize := 8;
dcbPort.Parity := NOPARITY;
dcbPort.StopBits := ONESTOPBIT;
dcbPort.Flags := 0;
{ flag bit fields:
dcb_Binary, dcb_Parity, dcb_OutxCtsFlow, dcb_fOutxDsrFlow,
dcb_fOutX, dcb_fInX, dcb_DtrFlow, dcb_RtsFlow
}
SetCommState(FHandle, dcbPort);
End;
SetRtsOn(FRtsOn);
SetDtrOn(FDtrOn);
End;
// return True if port opened
Result := IsOpen;
end;
// Close the COM port
procedure TACommPort.Close;
begin
if IsOpen then
begin
CloseHandle(FHandle);
FHandle := INVALID_HANDLE_VALUE;
end;
end;
// Write a char out the COM port
function TACommPort.WriteByte(ch: byte): boolean;
var
dwCharsWritten: DWord;
begin
dwCharsWritten := 0;
if IsOpen then
begin
WriteFile(FHandle, ch, sizeof(ch), dwCharsWritten, nil);
end;
Result := dwCharsWritten = sizeof(ch);
end;
function TACommPort.WriteData(data:String): boolean;
var
dwCharsWritten: DWord;
begin
dwCharsWritten := 0;
if IsOpen then
begin
WriteFile(FHandle,PChar(data)^, Length(Data), dwCharsWritten, nil);
end;
Result := dwCharsWritten = Length(Data);
end;
// Reads a character from the port
function TACommPort.ReadByte: byte;
var
cbCharsAvailable, cbCharsRead: DWord;
ch: byte;
begin
ch := Ord(' ');
if IsOpen then
begin
cbCharsAvailable := GetInCount;
if cbCharsAvailable > 0 then
begin
ReadFile(FHandle, ch, sizeof(ch), cbCharsRead, nil);
end;
end;
result := ch;
end;
function TACommPort.ReadData(var data; size: integer): integer;
var
cbCharsAvailable, cbCharsRead: DWord;
begin
cbCharsRead := 0;
if IsOpen then
begin
cbCharsAvailable := GetInCount;
if cbCharsAvailable > 0 then
begin
if cbCharsAvailable < size then
size := cbCharsAvailable;
ReadFile(FHandle, data, size, cbCharsRead, nil);
end;
end;
result := cbCharsRead;
end;
// Return the number of bytes waiting in the input queue
function TACommPort.GetInCount: LongInt;
var
statPort: TCOMSTAT;
dwErrorCode: DWord;
begin
Result := 0;
if IsOpen then
begin
ClearCommError(FHandle, dwErrorCode, @statPort);
Result := statPort.cbInQue;
end;
end;
// Return the number of bytes waiting in the output queue
function TACommPort.GetOutCount: LongInt;
var
statPort: TCOMSTAT;
dwErrorCode: DWord;
begin
Result := 0;
if IsOpen then
begin
ClearCommError(FHandle, dwErrorCode, @statPort);
Result := statPort.cbOutQue;
end;
end;
// Flush the port by reading any characters in the queue
procedure TACommPort.Flush;
begin
if FHandle <> INVALID_HANDLE_VALUE then
begin
FlushFileBuffers(FHandle);
//PurgeComm(FHandle, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
end;
end;
end.بس ينتهي الكومبوننت الخاص باليو إس بي سوف أشرحه
الشام الله حاميها...
أنا الدمشقيُّ.. لو شرحتمُ جسدي
لسـالَ منهُ عناقيـدٌ.. وتفـّاحُ
و لو فتحـتُم شراييني بمديتكـم
سمعتمُ في دمي أصواتَ من راحوا
مآذنُ الشّـامِ تبكـي إذ تعانقـني
و للمـآذنِ.. كالأشجارِ.. أرواحُ
السلام عليكم
شكرا لك على المساعدة
سأحاول
وأخبرك بالجديد
<iframe id='a07f974d' name='a07f974d' src='http://www.islamway.com/phpAdsNew/adframe.php?n=a07f974d&what=zone:18&target=_blank' framespacing='0' frameborder='no' scrolling='no' width='468' hight='62' allowtransparency='true'><a href='http://www.islamway.com/phpAdsNew/adclick.php?n=a07f974d' target='_blank'><img src='http://www.islamway.com/phpAdsNew/adview.php?what=zone:18&n=a07f974d' border='0' alt=''></a></iframe>
شكوت الى وكيع سوء حفظي فأرشدني الى ترك المعاصي
وأخبرني بأن العلم نور ونور الله لا يؤتى لعاص
هذا الموضوع مغلق.