OrsSerialPort هي مكتبة منفذ تسلسلية سهلة الاستخدام لـ MacOS. من المفيد للمبرمجين كتابة تطبيقات الهدف-C أو Swift Mac التي تتواصل مع الأجهزة الخارجية من خلال منفذ تسلسلي (الأكثر شيوعًا RS-232). يمكنك استخدام OrsSerialPort لكتابة التطبيقات التي تتصل بمشاريع Arduino ، والروبوتات ، وأجهزة الحصول على البيانات ، وأجهزة الراديو HAM ، وجميع أنواع الأجهزة الأخرى. يمكن أن يكون استخدام OrsSerialPort لفتح منفذ وإرسال البيانات بهذه البساطة:
let serialPort = ORSSerialPort ( path : " /dev/cu.KeySerial1 " )
serialPort . baudRate = 4800
serialPort . open ( )
serialPort . send ( someData ) // someData is an NSData object
serialPort . close ( ) // Later, when you're done with the portأو ، في الهدف-C:
ORSSerialPort *serialPort = [ORSSerialPort serialPortWithPath: @" /dev/cu.KeySerial1 " ];
serialPort.baudRate = @ 4800 ;
[serialPort open ];
[serialPort sendData: someData]; // someData is an NSData object
[serialPort close ]; // Later, when you're done with the portيتم إصدار OrsSerialPort بموجب ترخيص معهد ماساتشوستس للتكنولوجيا ، مما يعني أنك حرة في استخدامه في كل من المشاريع المغلقة والمفتوحة المصدر. ومع ذلك ، حتى في مشروع مصدر مغلق ، يجب أن تتضمن نسخة يمكن الوصول إليها للجمهور من إشعار حقوق الطبع والنشر الخاص بـ OrsSerialPort ، والتي يمكنك العثور عليها في ملف الترخيص.
إذا كان لديك أي أسئلة حول أو اقتراحات أو مساهمات في OrsSerialPort ، فيرجى الاتصال بي. أحب أيضًا أن أسمع عن أي مشاريع رائعة تستخدمها فيها.
يوفر هذا ReadMe نظرة عامة على مكتبة OrsSerialport ويفضل تقديم معلومات كافية للاستعداد والتشغيل بسرعة. يمكنك قراءة الوثائق الفنية الكاملة لـ OrsSerialPort على http://cocoadocs.org/docsets/orsserialport/. يحتوي OrsSerialport Wiki أيضًا على وثائق مفصلة.
معظم رمز المثال في هذا ReadMe في Swift. ومع ذلك ، يمكن أيضًا استخدام OrsSerialPort بسهولة من رمز Objective-C. يحتوي مجلد الأمثلة على إصدارات سريعة وموضوعية C من جميع مشاريع المثال الأربعة. انظر قسم المشاريع المثال أدناه لمزيد من المعلومات.
هناك عدد من الطرق لإضافة Orsserialport إلى مشروعك. يمكنك استخدام مشروع الإطار المضمون أو قرطاج أو Cocoapods أو Swift Package Manager. راجع دليل تثبيت OrsSerialPort للحصول على تعليمات مفصلة لكل من هذه الطرق.
يمكنك الحصول على مثيل ORSSerialPort أي من طريقتين. الأسهل هو استخدام خاصية ORSSerialPortManager availablePorts (الموضحة أدناه). الطريقة الأخرى هي الحصول على مثيل ORSSerialPort جديد باستخدام مسار جهاز BSD للمنفذ التسلسلي:
let port = ORSSerialPort ( path : " /dev/cu.KeySerial1 " ) لاحظ أنه يجب عليك إعطاء ORSSerialPort.init(path:) المسار الكامل للجهاز ، كما هو موضح في المثال أعلاه.
بعد الحصول على مثيل منفذ ، يمكنك فتحه باستخدام طريقة open() . عند الانتهاء من استخدام المنفذ ، أغلقه باستخدام طريقة close() .
يمكن تعيين إعدادات المنافذ مثل معدل البذخ ، وعدد أجزاء التوقف ، والتكافؤ ، وإعدادات التحكم في التدفق باستخدام الخصائص المختلفة التي توفرها ORSSerialPort :
port . baudRate = 9600
port . parity = . none
port . numberOfStopBits = 1
port . usesRTSCTSFlowControl = trueلمزيد من المعلومات ، راجع دليل البدء.
إرسال البيانات الخام عن طريق تمرير كائن Data إلى send(_:) الطريقة:
let dataToSend = " Hello " . data ( using : . utf8 )
port . send ( dataToSend ) لتلقي البيانات ، يمكنك تنفيذ SerialPort لبروتوكول ORSSerialPortDelegate serialPort(_:, didReceive:) ، وتعيين خاصية مندوب ORSSerialPort . كما هو مذكور أدناه ، تسمى هذه الطريقة دائمًا في قائمة الانتظار الرئيسية. تم تضمين مثال على التنفيذ أدناه:
func serialPort ( _ serialPort : ORSSerialPort , didReceive data : Data ) {
let string = String ( data : data , encoding : . utf8 )
print ( " Got ( string ) from the serial port! " )
} يتضمن ORSSerialPort خاصية مندوب ، وبروتوكول مندوب يسمى ORSSerialPortDelegate . يقوم المنفذ بإبلاغ مندوب الأحداث بما في ذلك استلام البيانات والأحداث المفتوحة/إغلاق المنفذ والإزالة من النظام والأخطاء. لمزيد من المعلومات ، راجع دليل البدء ، أو اقرأ الوثائق في OrsSerialPort.h.
ORSSerialPortManager هو فئة Singleton (مثيل واحد لكل تطبيق) يمكن استخدامه للحصول على قائمة من المنافذ التسلسلية المتاحة. استخدم خاصية Manager's availablePorts للحصول على قائمة بالمنافذ:
let ports = ORSSerialPortManager . shared ( ) . availablePorts يمكن ملاحظة availablePorts لـ OrsSerialPortManager مع مراقبة القيمة الرئيسية التي يتم إخطارها عند توصيل أو إزالتها من محول USB إلى USB. بالإضافة إلى ذلك ، تنشر NSNotifications عند حدوث هذه الأحداث. كما أنه سيتعامل مع المنافذ التسلسلية المفتوحة عندما يذهب MAC إلى النوم ، وإعادة فتحها تلقائيًا عند الاستيقاظ. هذا يمنع المشكلات التي رأيتها مع برامج تشغيل المنافذ التسلسلية التي يمكن أن تتعلق إذا ترك المنفذ مفتوحًا عند وضع الجهاز للنوم. لاحظ أن استخدام ORSSerialPortManager اختياري. يوفر بعض الوظائف الرائعة ، ولكن ORSSerialPort فقط ضروري لإرسال وتلقي البيانات ببساطة.
لمزيد من المعلومات حول OrsSerialPortManager ، راجع دليل البدء ، أو اقرأ الوثائق في OrsSerialPortManager.h.
يتم تسليم البيانات التسلسلية الواردة إلى التطبيق الخاص بك عند استلامه. لا يوجد لدى مكتبة منخفضة المستوى مثل OrsSerialPort أي طريقة لمعرفة أي شيء عن بنية وتنسيق البيانات التي ترسلها وتتلقها. على سبيل المثال ، قد تتوقع حزمة كاملة من البيانات ، ولكن تلقي عمليات الاسترجاعات لكل بايت. عادةً ما يتطلب منك ذلك الحفاظ على المخزن المؤقت الذي تملأه بالبيانات الواردة ، فقط معالجتها عند استلام حزمة كاملة. من أجل القضاء على الحاجة إلى الإدارة اليدوية والتخزين المؤقت للبيانات الواردة ، يتضمن OrsSerialPort واجهة برمجة تطبيقات Packet. يتم تنفيذ ذلك بواسطة ORSSerialPacketDescriptor والطرق المرتبطة بها على ORSSerialPort .
لمزيد من المعلومات حول واجهة برمجة تطبيقات حزمة OrsSerialPort ، راجع دليل API Parsing Packet ، وقراءة الوثائق في OrsSerialPacketDescriptor.h ، وشاهد تطبيق مثال PacketParsingDemo.
في كثير من الأحيان ، سترغب التطبيقات في إرسال أمر إلى جهاز ، ثم انتظر لتلقي استجابة محددة قبل المتابعة. لتخفيف تنفيذ هذا النوع من السيناريو ، يتضمن OrsSerialPort واجهة برمجة تطبيقات طلب/استجابة. يتم تنفيذ ذلك بواسطة ORSSerialRequest والطرق المرتبطة بها على ORSSerialPort .
على سبيل المثال ، قد يقوم البرنامج الذي يقرأ درجة الحرارة من جهاز متصل بما يلي:
func readTemperature ( ) {
let command = " $TEMP?; " . data ( using : String . Encoding . ascii ) !
let responseDescriptor = ORSSerialPacketDescriptor ( prefixString : " !TEMP " , suffixString : " ; " , maximumPacketLength : 10 , userInfo : nil )
let request = ORSSerialRequest ( dataToSend : command ,
userInfo : SerialBoardRequestType . readTemperature . rawValue ,
timeoutInterval : 0.5 ,
responseDescriptor : responseDescriptor )
serialPort ? . send ( request )
}
func serialPort ( _ serialPort : ORSSerialPort , didReceiveResponse responseData : Data , to request : ORSSerialRequest ) {
temperature = temperatureFromResponsePacket ( responseData ) !
}
func serialPort ( _ serialPort : ORSSerialPort , requestDidTimeout request : ORSSerialRequest ) {
print ( " Command timed out! " )
}لمزيد من المعلومات حول واجهة برمجة تطبيقات طلب/استجابة ORSSERIALPORT ، راجع دليل API للطلب/الاستجابة ، وقراءة الوثائق في ORSSERIALREQUEST.H ، وشاهد تطبيق مثال requestResponsEdemo.
يتضمن OrsSerialPort مجلد يسمى أمثلة ، يحتوي على مشاريع Xcode للبرامج الصغيرة التي توضح استخدام OrsSerialPort. كل مثال متاح في كل من Objective-C و Swift. يتم تضمين تطبيقات المثال التالي:
يمكنك قراءة المزيد حول هذه الأمثلة على Wiki Orsserialport.
المساهمات في OrsSerialPort مرحب بها للغاية. ومع ذلك ، يتم تشجيع المساهمين على قراءة إرشادات المساهمة قبل بدء العمل على أي مساهمات. لا تتردد أيضًا في فتح مشكلة GitHub أو البريد الإلكتروني مع أسئلة حول مساهمات محددة.