الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Send To port

مغلق
بدأه engbelal2003 في 15 سبتمبر 2004 · 8 رد · 2,093 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

لدي شاشة عرض للعميل خاصة باجهزة نقاط البيع واريد ارسال بعض الجمل لها مثل مثلا اسم الصنف او السعر وهكذا والحمد لله بارسل ها كويس لكن بتقابلني بعض المشاكل فيها

1- لا استطيع ارسل لها عربي

2- لا استطيع مسحها واضافة سطور متتالية

انا بافتح الكوم بورت اللي هي مربوطة به عن طريق الملفات لكن لا اعرف هل بتفتح بشكل كامل ام لا

ارجو لمن له الخبرة في هذه الامور افادتي بهل الكود هذا كامل وصحيح ام لا

وجزاكم الله خيرا

HANDLE hCom; 
	  CString str = "Welcome";
	hCom = CreateFile("Com1:",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); 
	if (hCom == INVALID_HANDLE_VALUE) 
		return;  
	else
	{
		DWORD s;

		WriteFile(hCom,str,str.GetLength(),&s,NULL);
		CloseHandle(hCom);
	}
#2

السلام عليكم ,,

اقتباس
انا بافتح الكوم بورت اللي هي مربوطة به عن طريق الملفات لكن لا اعرف هل بتفتح بشكل كامل ام لا

ارجو لمن له الخبرة في هذه الامور افادتي بهل الكود هذا كامل وصحيح ام لا

ماأعرفه أن هذا هو الكود الصحيح تماما ,, لكن أنا لم أستخدم وصلة ال com بين جهازين أبدا ,, فلم أجرب هذا الكود بالتحديد أبدا ,,

لكن ماأعرفه أن الطريقة صحيحة تماما للارتباط بين الجهازين بالمنفذ com1 ,, وفي الجهاز الثاني ستستخدم ال ReadFile ,, لقراءة البيانات ,,

وانت قلت أن الكود يعمل لكن توجد مشاكل مع :

اقتباس
- لا استطيع ارسل لها عربي

2- لا استطيع مسحها واضافة سطور متتالية

المشكلة الأولى ,, وهي مشكلة اللغة العربية ,, فسببها أنك استخدمت حروف الآسكي باستخدام ال char وليست اليونيكود w_char,, حيث أن حروف الآسكي تتسع فقط ل 256 حرف ,, واليوينكود يستحمل حتى 2 أس 16 يعني أكثر من 65 ألف حرف ,, لذا يمكننا تمثيل الحروف الصينية والعربية والبرغالية وكل الغات الموجودة ,, داخل هذه ال 65 الف خانة ,,

الان فقط مرر البارمتر الثاني للمتغير LPCVOID ك WCHAR أو TCHAR أو t_char ,, والأفضل والأريح أن تكون تستخدم دعم ال MFC لتستخدم CString

يعني كالتالي :

CString str;

str = "بلال";
WriteFile(hCom,str,str.GetLength(),&s,NULL);

واستلمها في الطرف الآخر وحوله ل CString ايضا بالتقييس :

ReadFile (hCom,str,size,&nbyte,NULL);

CString s = str;

AfxMessageBox(s);

وجرب ماسيحدث ,,

بالنسبة للمشكلة الثانية :

اقتباس
- لا استطيع مسحها واضافة سطور متتالية

عملية المسح لها علاقة بالجهاز البعيد فقط ,, فيمكن أن ترسل رقم أو حرف معين للجهاز البعيد ومعناه أمر مسح وبالتنسيق مع برنامج الجهاز الآخر ,, مثلا الحرف ; معناه امسح ,, والبايت الذي يليه رقم السطر مثلا ,,

وفي الجهاز البعيد تنفذ كود لعملية المسح لو طابق ال buffer في str رمز ال ; في أول بايت مثلا ,,

وكذلك الأمر مع السطور المتتالية فمشكلتها بسيطة باذن الله ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#3
اقتباس
1- لا استطيع ارسل لها عربي

تحتاج لإستخدام الدالتين

WideCharToMultiByte

MultiByteToWideChar

هذة الدوال تحول الحروف المكونة من بايتين ترميز ينكود ( وهي الأحرف العربية و..)

إلى بايت واحد موسع يرمز لنفس الحرف العربي

وقد شرحت أمثلة عن هذة الدوال

/index.php?showtopic=44947

لأنك ترسل المعلومات عبر منفذ تسلسلي ( لا يقبل إلى بايت واحد )

أما عن طريقة فتح المنفذ ( يفضل )

"\\\\.\\COM1 "

لكي يعرف النظام أنك تريد فتح جهاز مقيم في الذاكرة

--

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#4
اقتباس
لأنك ترسل المعلومات عبر منفذ تسلسلي ( لا يقبل إلى بايت واحد )

كلامك صحيح تماما يا jaas ,, لكن الا ترى أن أن متغير ال data في WriteFile هو من النوع void* وبالتحديد LPCVOID يعني يمكنه أن يتحمل أي طول فيمكن أن نرسل سلسلة كاملة من الأحرف كاسم مثلا للمنفذ الآخر ببساطة ,,

ولو مررنا اليها بارمتر من النوع WCHAR سيتم تقييسه وتحوليه ل LPCVOID على أنه بايتين وليس بايت واحد ,, وسيرسل كبايتين تماما لكن على دفعتين ,, كما يحدث تماما في مفهوم ارسال سلسلة حقيقية من أحرف char مثلا ,, سيتم فيها ارسال كل حرف "على حسب مايتحمل الجهاز" كل مرة في حالة com بايت واحد كل مرة حتى تنتهي السلسلة ,, ويستلمها الطرف الآخر هناك على أنها char* ,,

في حالتنا سيستلمها على أنها WCHAR ,,

الا ترى أن التحويل سيكون سليما ؟

وشكرا للتنبيه على طرية فتح منفذ ال com1 بالطريقة الصحيحة :)

اقتباس
\\\\.\\COM1

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#5

السلام عليكم ورحمة الله وبركاته

اولا جزاكم الله خيرا علي الرد السريع علي لكن لي بعض الملحوظات

1- الاخ HGB انا لا اعرف ما الذي يقصده بموضوع استخدام الاسكي والاسترنج انا فعلا باستخدم الاسترنج كما هو واضح في الكود الي انا كاتبه وبصراحه انا لم افهم ما الذي تقصده من موضوع الاسكي ده ولا المقصود بباقي الTypies

LPCVOID ك WCHAR أو TCHAR أو t_char

2- بالنسبة لمشكلة العربي لم يتم حلها حتي الان واناباشك ان الشاشة التي لدي غير مؤهلة لعرض عربي ولو اني وجدت بعض الناس بيعرضوا عليها عربي في محلات السوبر ماركت

3- بالنسبة للموضوع الاصلي وهو اني ازاي ارسل للكوم فعلا الكود المكتوب في الاول مضبوط لكن كان ينقص بعض الاعدادات التي يجب ان يعملها البرنامج في الويندوز كي يمكن ان يرسل لهذه الشاشة وانا الحمد لله وصلت لهذه الاعدادات وهاهي لمن يريد الاستفادة منها

	HANDLE hCom; 


	hCom = CreateFile("com1:",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); 


	if (hCom == INVALID_HANDLE_VALUE) 
  return;  
	else
	{
  LPDCB dcb = new DCB;
  GetCommState(hCom,dcb);
  dcb->BaudRate=9600;
  dcb->ByteSize=8;
  dcb->Parity=0;
  dcb->StopBits=0;
  SetCommState(hCom,dcb);
  DWORD s;
  WriteFile(hCom,ComString,ComString.GetLength(),&s,NULL);
  
  CloseHandle(hCom);
	}

************************************************

وبهذا يمكن ان ارسل لشاشة عرض العميل المرتبطة بالكوم 1

لكن لا زلات مشكلة العربي لم اجد لها حل

وبالنسبة لمشكلة مسح الشاشة فقد وجدت فعلا كما تفضل الاخ في رده يعض الارقام في المانيول الخاص بالجهاز مثل رقم 12 لمسح الشاشة وارسلته لها والحمد لله عمل بشكل جيد والحمد لله

#6

أخي HGB فكرتك منطقية ولكن لم أرى لها إستخدام

أعتقد لأنها قد تسبب مشاكل في أنظمة ,وندوز NT و 9x

لأن نظام وندوز NT يستخدم دوال اليونيكود أما 9x فيستخدم الآسكي

فعندما ترسل لة بيانات لا تعتقد أن النظام سينفذ دالة واحدة

سيقوم بتنفيذ عدد من الدوال

والفكرة التي طرحتها أنك ترسل البيانات بترميز موسع WCHAR

والدوال المستخدمة في وندوز 9X آسكي - وهنا أعتقد أن الدوال لن تتعرف على الأحرف

ويظهر النص بشكل غير مفهوم

وإذا كان النظامين NT أعتقد أن الفكرة قد تكون مقبولة - الله أعلم

أما الدالة : MultiByteToWideChar

فتحول النص إلى حروف موسعة يتعرف إليها 9x و NT

أخي engbelal2003

لا أعتقد أن الشاشة لها خص في نوع الحرف - لا تعرف إلى البكسل

والمسؤال عن إظهار الحرف نظام التشغيل - إذا كان يدعم العربي أو لا يدعمة

وبالتوفيق

-

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

#7

صحيح يا Jaas لم انتبه لذلك , ربما تكون يا engbelal2003 تستخدم وندوز قديم يعني ملينيوم أو 98 أو حتى 95 فلن يعمل النظام باليونيكود وسيستخدم الآسكي فقط ,, لذا استخدم طريقة jaas التي وضحها في أول رد له ,, وستنجح مع اللغة العربية باذن الله ,,

وشكرا جزيلا لك على الكود المنقح بعد التعديل :)

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#8

الاخ jass لا اعرف كيف يمكنني استخدام هاتين الدالتين انا دخلت علي الرابط

لكن لا اعلم كيف يمكن استخدام هاتين الدالتين في حالتي هذه ارجو ان امكن تطبيق هاتين الدالتين علي الكود الذي قمت بكتابته فوق كي اقوم بتجربته ان شاء الله

وجزاكم الله خيرا

#9

شوف أخي الكريم

تأكد إن النظام عندك يدعم العربي

وبعدين جرب هذة الطريقتين

الأولى بطريقة الأحرف الموسعة

والثانية طريقة الينكود

ومافي غير هذة الطريقتين للتعبير عن الأحرف العربية

HANDLE hCom=INVALID_HANDLE_VALUE; 
BYTE Unstr[MAX_PATH];
char Asstr[MAX_PATH];
int count=0;

ZeroMemory(Unstr,MAX_PATH);
ZeroMemory(Asstr,MAX_PATH);

//أدخل النص
strcpy(Asstr,"مرحبا");
count=strlen(Asstr);
hCom = CreateFile(_TEXT("\\\\.\\COM1"),GENERIC_READ | GENERIC_WRITE,
      0,NULL,OPEN_EXISTING,0,NULL); 

if (hCom==INVALID_HANDLE_VALUE ) 
return;  

DWORD s;
memcpy(Unstr,Asstr,count);
WriteFile(hCom,(LPCVOID)Unstr,count,&s,NULL);
CloseHandle(hCom);

الطريقة الثانية

HANDLE hCom=INVALID_HANDLE_VALUE; 
BYTE Unstr[MAX_PATH];
char Asstr[MAX_PATH];

ZeroMemory(Unstr,MAX_PATH);
ZeroMemory(Asstr,MAX_PATH);

//أدخل النص 
strcpy(Asstr,"مرحبا");

hCom = CreateFile(_TEXT("\\\\.\\COM1"),GENERIC_READ | GENERIC_WRITE,
      0,NULL,OPEN_EXISTING,0,NULL); 

if (hCom==INVALID_HANDLE_VALUE ) 
return;  

DWORD s;
MultiByteToWideChar (CP_ACP,MB_PRECOMPOSED,Asstr,strlen(Asstr),(LPWSTR)Unstr,sizeof(Unstr));

WriteFile(hCom,(LPCVOID)Unstr,(strlen(Asstr)*2)+2,&s,NULL);
CloseHandle(hCom);

http://www.jaascois.com

*************************************************

مجموعة مواضيع - إحتراف البرمجة -

ّ~~~~~~~~~~~~~~~~~~~~~~

البرمجة المتقدمة & الهندسة العكسية & برمجة وأمن الأنظمة

/index.php?showtopic=45002

آخر المواضيع :

+- تحليل جرائم الكمبيوتر -+

أنظمة اليونكس(Solaris,HP, AIX,SCO)وانواع المعالجات

ثغرة SMS لأجهزة الجوال Siemens 3568i !

أخطاء وثغرات البرامج العربية !!!

سلسلة مواضيع - أمن وحماية مواقع الويب -

E البرمجة المتقدمة X للملفات التنفيذية E

سلسلة مواضيع ثغرات الأنظمة وإختراق الأجهزة

**************************************************

<span style='font-size:14pt;line-height:100%'>الإرادة تحـــقق السيـــادة</span>

**************************************************

هذا الموضوع مغلق.

مواضيع مشابهة