मैं अपने बालों को खींचने की कोशिश कर रहा हूं जब एक धारावाहिक बंदरगाह बंद हो जाता है ताकि मैं इसे फिर से खोल सकूं। यह पता चला है कि बंदरगाह वास्तव में अनलॉक होने से पहले CloseHandle()
रिटर्न देता है।धारावाहिक बंदरगाह वास्तव में बंद होने से पहले बंद हो गया है
मैं एक सीरियल पोर्ट CreateFile(FILE_FLAG_OVERLAPPED)
का उपयोग करके खोलने कर रहा हूँ, एक CompletionPort CreateIoCompletionPort()
का उपयोग कर के साथ संबद्ध, पढ़ने/ReadFile()
, WriteFile()
का उपयोग कर इसे करने के लिए लिख और CloseHandle()
का उपयोग कर इसे बंद करने।
मैंने देखा है कि अगर मैं एक सीरियल बंदरगाह को जल्दी से बंद कर देता हूं और फिर से खोलता हूं, तो मुझे CreateFile()
से वापस मिलता है। यह इस तथ्य के बावजूद हो रहा है कि मैं वापसी के लिए CloseHandle()
की प्रतीक्षा कर रहा हूं, फिर पूरा होल्डिंग पोर्ट से वापस आने के लिए उस हैंडल से जुड़े सभी उत्कृष्ट पढ़ने/लिखने के कार्यों की प्रतीक्षा कर रहा हूं। निश्चित रूप से एक बेहतर तरीका है :)
मैं एक सीरियल पोर्ट को सिंक्रनाइज़ तरीके से कैसे बंद करूं? कृपया कोई पुनः प्रयास लूप, नींद() या कुछ अन्य सस्ते हैक्स।
संपादित करें: हो सकता है कि इसका पूरा होने वाले बंदरगाहों और FILE_FLAG_OVERLAPPED के उपयोग के साथ कुछ करना है। जब पढ़ना/लिखना संचालन पूरा होता है तो मुझे कॉलबैक मिलता है। बंदरगाह बंद करने के लिए क्या कुछ कॉलबैक है?
शायद आपके विशिष्ट सीरियल पोर्ट ड्राइवर से संबंधित है। क्या आपने इसे यहां SO पर देखा है: http://stackoverflow.com/questions/2948428/reopening-serial-port-fails-if-not-closed-properly-with-closehandle –
बस सुनिश्चित करने के लिए .... आप हेवन कहीं भी 'डुप्लिकेट हैंडल' इस्तेमाल नहीं किया? –
मुझे यकीन नहीं है कि पूरा होने वाला बंदरगाह संबंधित है, मैंने हमेशा 'ReadFileEx' और' WriteFileEx' के साथ एपीसी कॉलबैक का उपयोग किया है। यह भी आसान है, क्योंकि एपीसी केवल तभी चलते हैं जब थ्रेड एक सतर्क प्रतीक्षा में प्रवेश करता है, इसलिए कोई क्रॉस-थ्रेड सिंक्रनाइज़ेशन समस्या नहीं होती है (केवल पुनः प्रवेश के बारे में सावधान रहें)। –