سؤال

لدي برنامج نصي Python الذي يكتب حزم البيانات إلى لوحة اردوينو من خلال pyserial. وبعد في بعض الأحيان أثناء كتابة التعليمات البرمجية إلى Byserial يثير خطأ إدخال / إخراج مع Errno 5.

تقول بعض الأبحاث أن هذا يشير إلى وجود خطأ أثناء الكتابة في الملف الذي يمثل الاتصال إلى لوحة Arduino.

الرمز الذي يرسل، يرسل حزم بايت واحدة فقط:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # Check if it's an integer
    elif isinstance(byte, int):
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it
    else: raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

الخطأ المطبوع بواسطة هذا الرمز هو:

خطأ في خطأ إدخال / إخراج خطأ errno 5

هل هناك شيء خاطئ في الرمز الخاص بي أثناء إرساله؟ هل أحتاج إلى التحقق مما إذا كان الاتصال التسلسلي جاهزا لإرسال شيء ما أو يجب أن يكون هناك تأخير بعد الإرسال؟ أو هل يمكن أن يكون هناك مشكلة في الأجهزة أو الاتصال مع الأجهزة؟

تعديل: نظرت إلى تطبيق Linux من Pyserial والتنفيذ يمر فقط الخطأ في التعليمات البرمجية الخاصة بي. لذلك لا رؤى حقيقية جديدة من هناك. هل هناك طريقة جيدة لاختبار ما يحدث في البرنامج؟

هل كانت مفيدة؟

المحلول

آسف أن أزعجك ولكن أنا متأكد جدا من أن الخطأ ناتج عن إعادة تعيين Arduino نفسه، وبالتالي إغلاق الاتصال بالكمبيوتر.

نصائح أخرى

المشكلة الوحيدة التي يمكنني رؤيتها على الفور في التعليمات البرمجية هي مشكلة المسافة البادئة - تغيير الكود الخاص بك على النحو التالي:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # else, check if it's an integer
    elif isinstance(byte, int): 
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: 
        raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

أشك في أن الخطأ الخاص بك يأتي من هذا، ولكن جربه بهذه الطريقة واسمحوا لنا أن نعرف! كنت تحقق إذا byte هو int فقط في القضية التي str, ، لذلك elif دائماً فشل بحكم التعريف. لكنني أعتقد إذا كنت حقيقة كان رمز البادئة مثل هذا، كنت قد حصلت على SyntaxError, ، لذلك أعتقد أنك أخطأت للتو في النشر وتبقى مشكلتك الحقيقية مخفية.

إذا كنت تقوم بتشغيل هذا على Windows، فلا يمكنك فتح Arduino IDE مع اتصال تسلسلي في نفس الوقت الذي تقوم بتشغيل البرنامج النصي Python الخاص بك. هذا سوف يرمي نفس الخطأ.

اسمحوا لي أن أحاول تقديم بعض التعليقات التي قد تكون مفيدة لك وغيرها من الناس مع مشاكل مماثلة. أولا، حاول تشغيل رسم Arduino الخاص بك مع الشاشة التسلسلية عدة مرات. يمكنك العثور على الشاشة التسلسلية تحت الأدوات في قائمة IDE. يمكنك أيضا كتابة CTRL-SHIFT-M لاستدعاء الشاشة التسلسلية.

يعرض الشاشة التسلسلية ما يرسله رسم Arduino إليك. ومع ذلك، فإنه يتيح لك كتابة البيانات التي يتم إرسالها إلى رسم Arduino. بمعنى آخر تقوم باختبار وتصحيح جانبي تدفق البيانات التسلسلية، فقط باستخدام الشاشة التسلسلية.

انظر إلى ما يظهر. سيكون من المتوقع أن يكون مفيدا للغاية في افتراض أن رسمك يحاول إرسال البيانات عبر المسلسل. بعض الملاحظات. بالتأكيد متأكد تماما من أن معدل باود مجموعة داخل الشاشة التسلسلية يطابق بالضبط مع معدل الباود في رسمك (9600 هو خيار جيد في جميع الحالات تقريبا).

الملاحظة الثانية أمر بالغ الأهمية. إن إحضار الشاشة التسلسلية إلى إعادة تعيين على لوحة اردوينو. تخطيطك يبدأ أكثر من (دائما). هذا شيء جيد لأنه يمنحك تشغيل جديد في كل مرة. لاحظ أنه يمكنك إجبار إعادة تعيين، فقط عن طريق تعيين معدل البثود إلى 9600 (حتى لو كان بالفعل 9600). يتيح لك ذلك تشغيل العديد من الاختبارات داخل الشاشة التسلسلية دون الحاجة إلى إعادة تشغيل الشاشة التسلسلية في كل مرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top