2010-10-31 6 views
16

मैं एक समस्या है, जहां खुले फ़ंक्शन जब मैं एक सीरियल पोर्ट को खोलने का प्रयास कभी नहीं आई है में सीरियल पोर्ट खोलने की कोशिश कर। यह सब समय होता है नहीं, और समस्या अगर मैं सीरियल एडाप्टर के लिए अपनी USB अनप्लग करें और उसे वापस प्लग थोड़ी देर के लिए गायब हो जाता है मेरे कोड इस तरह दिखता है:।खुला() फ़ंक्शन रुक जाता है (कभी नहीं देता है) जब मैक ओएस एक्स

fileDescriptor = open(bsdPath, O_RDWR | O_NOCTTY); 

जहां bsdPath है/dev/घन KeySerial1। मैंने ओपन कमांड में O_NONBLOCK विकल्प जोड़ने का प्रयास किया है, लेकिन यह अभी भी लटकता है।

बेशक मुझे समझने के लिए क्यों यह हो रहा है करना चाहते हैं के

। मेरा विश्वास यह है कि जो कुछ भी समस्या है, O_NONBLOCK निर्दिष्ट के साथ, खुला होना चाहिए चाहे वह बंदरगाह खोलने में असमर्थ हो। यदि यह बंदरगाह खोलने में असमर्थ है, तो फ़ाइल डिस्क्रिप्टर -1 होना चाहिए और इरनो सेट होना चाहिए (मैं कॉल को खोलने के तुरंत बाद इसकी जांच करता हूं)। बेशक, यह नहीं हो रहा है। क्या मेरी धारणा गलत है? क्या किसी त्रुटि का सामना होने पर निर्दिष्ट O_NONBLOCK के साथ भी कभी भी वापस जाने के लिए कुछ ज्ञात कारण नहीं है?

10.7.2 पर सीरियल एडाप्टर के लिए पीएल -2303 आधारित यूएसबी के साथ प्रोलिफ पीएल-2303 चालक के नवीनतम संस्करण का उपयोग करके, मैं आज इस समस्या को फिर से उत्पन्न करने में सक्षम हूं। कुछ नोट:

  • जब open() कॉल में लटका दिया है, इस प्रक्रिया का उपयोग कर कमान व्यवधान कारक नहीं है। (नियंत्रण-सी)।
  • ps -avx चल रहा है प्रक्रिया के लिए यू की प्रक्रिया स्थिति कोड दिखाता है। मुझे यकीन नहीं है कि इस कोड का क्या अर्थ है। यह Google पेजों में ps के लिए गुगलिंग द्वारा नहीं दिखाई देता है। मेरी मशीन पर ps के लिए मैन पेज में प्रक्रिया राज्य कोड की कोई सूची नहीं है। शायद यह ps के मैक (10.4+?) संस्करण के लिए विशिष्ट है?
  • मुझे लगता है कि तुरंत इस समस्या की पहली उपस्थिति से पहले चलाने पर, विकल्प पोर्ट पर वापस अपने राज्य को पुनर्स्थापित करने के लिए ioctl() करने के लिए अपने कॉल करने से पहले मैं उन्हें इस्तेमाल के लिए बदल में मेरा कार्यक्रम लटका का उल्लेख किया। मुझे कार्यक्रम को मारना पड़ा (एक्सकोड के डीबगर के माध्यम से)। इसके तुरंत बाद, कार्यक्रम के अगले लॉन्च पर, open() लटका ...

उत्तर

6

डिवाइस ड्राइवर में समस्या होने की संभावना है। आप O_NONBLOCK के व्यवहार के बारे में सही हैं, लेकिन यह सही ढंग से लागू करने के लिए ड्राइवर पर निर्भर है। यह जानना सहायक होगा कि कौन सा संस्करण ओएस एक्स और यूएसबी से सीरियल डिवाइस का उपयोग किया जा रहा है।

स्टैंडर्ड प्रक्रियाओं सुनिश्चित करें कि डिवाइस सीपीयू यूएसबी पोर्ट (नहीं एक केंद्र) में सीधे प्लग किया गया है, केबल की जाँच करें, और अद्यतन चालकों के लिए जाँच करने के लिए किया जाएगा।

इसके अलावा, जब open() ब्लॉक कर रहा है, इस प्रक्रिया को व्यवधान कारक द्वारा नियंत्रण-सी है? आप के साथ प्रक्रिया को देखें, तो "ps -aux" जबकि इसके अवरुद्ध, क्या "STAT" क्षेत्र कहता है?

+0

उत्तर के लिए धन्यवाद। मैंने इसे 10.6 और 10.7 पर एक कीस्पेन यूएसए -19 एचएस के साथ देखा है, और 10.7 पर पीएल-2303-आधारित एडाप्टर का उपयोग करके एक ही समस्या दिखाते हुए एक स्टैक ट्रेस के साथ उपयोगकर्ता से एक रिपोर्ट मिली है। मैं आपके दो सवालों के जवाब खोजने के लिए इसे फिर से पेश करने की कोशिश करूंगा। –

+0

मैंने कुछ नए अवलोकनों के साथ प्रश्न अपडेट किया है। एक बार फिर धन्यवाद। –

+0

'यू' का अर्थ है कि प्रक्रिया "अनियंत्रित" है, जिसका आमतौर पर इसका मतलब है कि डिवाइस चालक के जवाब देने का इंतजार है। ओएस एक्स थोड़ा असामान्य है कि ड्राइवर कर्नेल के बाहर, एप्लिकेशन स्पेस में चला सकते हैं। कर्नेल ने आपके 'ओपन() 'और' ioctl() 'कॉल को ड्राइवर को पास कर दिया और फिर परिणाम की प्रतीक्षा करने के लिए आपकी प्रक्रिया को बताता है। ऐसा लगता है जैसे चालक लटका हुआ है, आपकी प्रक्रिया को लटका दिया गया है (लेकिन कर्नेल सुरक्षित है)।मुझे यह धागा पीएल -2303 के बारे में मिला जो आप 10.7 शेर पर देख रहे हैं। शायद यह मदद करेगा: http://xbsd.nl/2011/07/pl2303-serial-usb-on-osx-lion.html –