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

طلب مساعده فى عمل برنامج يرسل أوامر الى السريال بورت

بدأه eng.omar1987 في 3 أكتوبر 2008 · 10 رد · 2,898 مشاهدة · في نظام تشغيل Unix & Linux
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم اخوانى كل عام ةانت بخير

انا اعمل فى مشروع التخرج واول جزء مطلوب به

هو عمل برنماج يرسل اوامر AT commands الى موبايل

ويستقبل منه الرد كل هذا بداخل اللينوكس

فقبل ان ابدا بعمليه كتابه البرنامج قمت أولا باستخدام بعض البرامج مثل minicom

ونجحت فى ارسال واستقبال ال AT commands

بعدها بدات فى هذا الموقع الذى يشرح اساسيات عمل البرنامج الذى أحتاجه

http://www.easysw.com/~mike/serial/serial.html

وقمت بعمل برنامج بناء على ما فهمته فى هذا الموقع

قمت بعمل البرنامج الذى يرسل الأمر AT الى الموبايل

ويستقبل الرد من الموبايل الذى هو OK

لكن لم ياتى رد من المويايل مما يدل على انه لم يصله شئ

انا بقالى ثلاث أيام فى هذا البرنامج دون نتيجه للاسف

ارجو أن تساعدونى فى معرفه الخطا فى البرنامج

البرنامج انا وضعته كملف مرفق

لانى حاولت أضعه هنا لكنه لا يظهر بشكل صحيح

تم تعديل هذه المشاركة بواسطة eng.omar1987 في 11 أكتوبر 2008 في 01:36

ان أردت ان تستزيد من العلم فاهلاً بك فى مدونتى ولا تنسانى بالدعاء

هنا

#2

السلام عليكم

اخى الكريم انت تريد تصميم برنامج للسيريال بورت ولكن لماذا فى الكود الخاص بك ترسل الداتا على ال USB وليس على منفذ سيريال . اذا كنت تستخدم كابل للتحويل من usb الى serial فهناك مشاكل تنتج بسبب التحويل احيانا لا اعرف سببها لوكن انصحك بتجريب برنامجك على جهاز به منفذ serial مباشرة

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

من خلال الكود :-

  1.  
  2. int fd ;
  3. /* open the port */
  4.  
  5. fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
  6.  
  7. if(fd == -1)
  8. { printf("file is closed");/* added by omar to test the file describtor USB0*/
  9.  

ولذلك فالمشكلة فى البداية وهذا لا يعنى ان الكود لا يعمل ولكن هذا يعنى ان هناك مشكلة فى انك لم تقم بتوصيل الكابل على المنفذ usb0 واكرر ياريت تتعامل مع ال serial port مباشرتا

Accessing Serial Ports

Like all devices, UNIX provides access to serial ports via device files. To access a serial port you simply open the corresponding device file.

Serial Port Files

Each serial port on a UNIX system has one or more device files (files in the /dev directory) associated with it:

Table 2 - Serial Port Device Files System Port 1 Port 2

IRIX® /dev/ttyf1 /dev/ttyf2

HP-UX /dev/tty1p0 /dev/tty2p0

Solaris®/SunOS® /dev/ttya /dev/ttyb

Linux® /dev/ttyS0 /dev/ttyS1

Digital UNIX® /dev/tty01 /dev/tty02

Opening a Serial Port

Since a serial port is a file, the open(2) function is used to access it. The one hitch with UNIX is that device files are usually not accessable by normal users. Workarounds include changing the access permissions to the file(s) in question, running your program as the super-user (root), or making your program set-userid so that it runs as the owner of the device file (not recommended for obvious security reasons...)

For now we'll assume that the file is accessable by all users. The code to open serial port 1 on a PC running Linux is show in Listing 1.

Listing 1 - Opening a serial port.

  1.  

  2. #include <stdio.h> /* Standard input/output definitions */
  3. #include <string.h> /* String function definitions */
  4. #include <unistd.h> /* UNIX standard function definitions */
  5. #include <fcntl.h> /* File control definitions */
  6. #include <errno.h> /* Error number definitions */
  7. #include <termios.h> /* POSIX terminal control definitions */
  8.  
  9. /*
  10.   * 'open_port()' - Open serial port 1.
  11.   *
  12.   * Returns the file descriptor on success or -1 on error.
  13.   */
  14.  
  15. int
  16. open_port(void)
  17. {
  18. int fd; /* File descriptor for the port */
  19.  
  20.  
  21. fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
  22. if (fd == -1)
  23. {
  24. /*
  25. * Could not open the port.
  26. */
  27.  
  28. perror("open_port: Unable to open /dev/ttyS0 - ");
  29. }
  30. else
  31. fcntl(fd, F_SETFL, 0);
  32.  
  33. return (fd);
  34. }
  35.  

Other systems would require the corresponding device file name, but otherwise the code is the same.

Open Options

You'll notice that when we opened the device file we used two other flags along with the read+write mode:

  1.  
  2. fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
  3.  

The O_NOCTTY flag tells UNIX that this program doesn't want to be the "controlling terminal" for that port. If you don't specify this then any input (such as keyboard abort signals and so forth) will affect your process. Programs like getty(1M/8) use this feature when starting the login process, but normally a user program does not want this behavior.

The O_NDELAY flag tells UNIX that this program doesn't care what state the DCD signal line is in - whether the other end of the port is up and running. If you do not specify this flag, your process will be put to sleep until the DCD signal line is the space voltage.

Writing Data to the Port

Writing data to the port is easy - just use the write(2) system call to send data it:

  1.  
  2. n = write(fd, "ATZr", 4);
  3. if (n < 0)
  4. fputs("write() of 4 bytes failed!n", stderr);
  5.  

The write function returns the number of bytes sent or -1 if an error occurred. Usually the only error you'll run into is EIO when a MODEM or data link drops the Data Carrier Detect (DCD) line. This condition will persist until you close the port.

Reading Data from the Port

Reading data from a port is a little trickier. When you operate the port in raw data mode, each read(2) system call will return the number of characters that are actually available in the serial input buffers. If no characters are available, the call will block (wait) until characters come in, an interval timer expires, or an error occurs. The read function can be made to return immediately by doing the following:

  1.  
  2. fcntl(fd, F_SETFL, FNDELAY);
  3.  

The FNDELAY option causes the read function to return 0 if no characters are available on the port. To restore normal (blocking) behavior, call fcntl() without the FNDELAY option:

  1.  
  2. fcntl(fd, F_SETFL, 0);
  3.  

This is also used after opening a serial port with the O_NDELAY option.

Closing a Serial Port

To close the serial port, just use the close system call:

  1.  
  2. close(fd);
  3.  

Closing a serial port will also usually set the DTR signal low which causes most MODEMs to hang up.

هناك الكثير من المواقع التى تحدثت عن برمجة ال serial port تحت اللينكس ومن ضمنها :-

http://www.easysw.com/~mike/serial/serial.html#2_5_3

http://www.faqs.org/docs/Linux-mini/IO-Por...ramming.html#s2

http://www.linux.org/docs/ldp/howto/Serial-HOWTO-11.html

http://tldp.org/HOWTO/Serial-Programming-HOWTO/index.html

اطيب المنى :)

amdvsintel22.jpg

--i use AMD--

لا اله الا الله محمد رسول الله

أستعن بالله و لا تعجز

تابعنى على تويتر

***

#3

بص أخى الكريم انا وضعت برنامجى على جهاز رقم واحد والجهاز الثانى عليه برنامج minicom وقمت بتوصيل الجهازين مع بعضهما by serial to serial cable

وقمت بتشغيل البرنماج على الجاهز 1 وتم استقبال الأمر المرسل الى الجهاز 2 وظهر الأمر على شاشه ال minicom

قمت باستبدال الجهاز الثانى بالهاتف النقال وجربت ارسال الأمر AT لم أجد أى أستجابه

ان أردت ان تستزيد من العلم فاهلاً بك فى مدونتى ولا تنسانى بالدعاء

هنا

#4
eng.omar1987 كتب:
قمت باستبدال الجهاز الثانى بالهاتف النقال وجربت ارسال الأمر AT لم أجد أى أستجابه

اذا ليست ا لمشكلة فى البرنامج

وكيف تعرفت انه لم يصل للموبايل شئ من كلامك السابق انك صممت ايضا برنامج على الموبايل عندما يشتقبل ال AT يقوم بالرد عليها فلماذا لا يكون هنا الخطأ فى هذا الجزء

اتمنى التوضيح كيف عرفت ان الموبايل لم يستقبل شئ

والله الموفق

amdvsintel22.jpg

--i use AMD--

لا اله الا الله محمد رسول الله

أستعن بالله و لا تعجز

تابعنى على تويتر

***

#5

السلام عليكم

موضوعك حله ممكن إن شاء الله ، ولقد بحثت في الأمر ، ولكن أحتاج إلى وقت لكي أرتب لك الموضوع

لذا أرجو إعطائي فرصة إلى يوم الخميس لأني هذه الأيام مشغول جدا.

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#6
eramax كتب:
اذا ليست ا لمشكلة فى البرنامج

وكيف تعرفت انه لم يصل للموبايل شئ من كلامك السابق انك صممت ايضا برنامج على الموبايل عندما يشتقبل ال AT يقوم بالرد عليها فلماذا لا يكون هنا الخطأ فى هذا الجزء

اتمنى التوضيح كيف عرفت ان الموبايل لم يستقبل شئ

والله الموفق

بص يا أخى الكريم

انا هوضح لك فكره ال AT commands وكيف يكون هناك رد من الموبايل وغير هذا حتى تعم الفئده ونكمل بعض

اولا :بعض الهواتف النقاله تحتوى بداخلها على ما يسمى GSM module هذا الجز من الموبايل هو عقل الموبايل وقلبه النابض حلوه النابض ديه :lol: المهم ان هذا ال module عباره عن دائره الكترونيه مش مهم فيها أيه خلينا أزاى نستخدمها وازاى هتفيدنا

اولا أزاى هتفيدنا :

ال GSM module بيعطيك الأمكانيه انك تتصل بيه عن طريق كابل الداتا الخاص بالهاتف ويمكنك ان ترسل له بعض الأوامر تسم لك باجراء اتصال او التعيدل فى الموبايل او تنزيل نغمات او مسح ناس من القائمه الأسماء وغيرها من الأشياء الكثيره كل هذا عن طريق مجموعه من الاوامر التى ترسل الى هذا ال module فهو مجهز لخدمه هذه الوظيه اى أستقابل أوامر وتنفيذها عن طريق كاب الداتا المتصل به

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

كده جميل أوى السؤال دلوقتى هل كل الموبيلات كده ؟؟؟

الأجابه لا بعض الموبيلات تسمح باستقابل ال AT commands وتنفيذها مثل الموبايل الذى معنا وهو T290i sony ericson

كده انا غطيت لك النقطه الأولى

النقطه الثانيه ازاى هنستخدمها :

الهدف الأساسى فى الفتره ديه ان اعمل برنماج يسال المستخدم عن الرقم الذى يرد الأتصالا به ثم يقوم البرنماج باخذ الرقم ومعرفه الأمر المناسب للأتصال وارساله الى ال serial port ثم تصل هذه الأوامر بدورها الى قلب الموبايل النابض GSM module ويبدا هوه بتصل منغير ما اخلى حد يلمس الموبايل كله عن طريق البرنماج الى بعمله

فكل شغلى مركز على الكمبيوتر مليش دعوه انا بالموبايل هوه مجزه وعليه كل البرامج الى بتفهم الأوامر وتنفذها بس كده

المهم انا فى البرنامج الى بعته هنا فى المنتدى بقوم بارسال الأمر

AT

لو تم استجابته من الموبايل فيرد تلقائيا

OK

اى أنه يوجد أتصال بيننا

لو تم هذا اخى هعمل أى حاجه و ابعت اى أمر

اوابقى كده خلصت

الجزئيه ديه من المشروع

بالنسبه للأخ برق انا منتظر ردك بإذن الله وانا كمان بعت لك رساله على الخاص اتمنى تقراها وشكرا انكم مهتمين بالموضوع يا جماعه

تم تعديل هذه المشاركة بواسطة eng.omar1987 في 10 أكتوبر 2008 في 03:59

ان أردت ان تستزيد من العلم فاهلاً بك فى مدونتى ولا تنسانى بالدعاء

هنا

#7

هل يوجد اخبار جديدة اخى عمر

amdvsintel22.jpg

--i use AMD--

لا اله الا الله محمد رسول الله

أستعن بالله و لا تعجز

تابعنى على تويتر

***

#8

جزاك الله خيرا على السؤال يا eramax الحمد لله تم تشغيل البرنماج بنجاح

وتم ارسال AT commands

وسامحنى فى تاخرى فى الرد عليك كل هذه الفتره

ان أردت ان تستزيد من العلم فاهلاً بك فى مدونتى ولا تنسانى بالدعاء

هنا

#9

بالتوفيق ان شاء الله

amdvsintel22.jpg

--i use AMD--

لا اله الا الله محمد رسول الله

أستعن بالله و لا تعجز

تابعنى على تويتر

***

#10

السلام عليكم

آسف جدا لانقطاعي ، فقد كنت مسافرا ، وكنت مشغولا جدا ، ولم يكن الانترنت متوفر في المكان الذي كنت أسكن فيه.

على العموم ، الحمد لله أن البرنامج اشتغل معاك، لكن ، هل ممكن أن تعرفنا ماذا فعلت ، حتى نستفيد.

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#11

المشكله يا أخ برق كانت فى ان هناك pin فى السريال بورت وهى DTR كان يجب جعلها بواحد

تانى شئ كان يجب أدخال الموبايل فى command mode ليقبل الأوامر المرسله له

عن طريق الأمر Wait لفتره حوالى ثانيه

بس هوه ده كل المشكله

وسامحنى انا مش هقدر أحط الأكواد لان الناس الى كنت شغال معاهم فى الموضوع رفضوا أننا نحط أى كود للشغل بتعنا على النت غير بعد ما المشروع يخلص كله

لان فيه أكتر من مجموعه بتحاول تعمل نفس الشغل بتعنا

وجزاك الله خيرا على الأهتمام

تم تعديل هذه المشاركة بواسطة eng.omar1987 في 31 أكتوبر 2008 في 03:51

ان أردت ان تستزيد من العلم فاهلاً بك فى مدونتى ولا تنسانى بالدعاء

هنا

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…