2013-08-06 4 views
5

मैंने कई उपयोगी धागे और कुछ ट्यूटोरियल का अध्ययन किया है, लेकिन मुझे अभी भी कुछ समस्याएं हैं जो बहुत सरल होनी चाहिए। संदर्भ के लिए कुछ धागे कि मैं अवलोकन किया है कर रहे हैं:लिनक्स सीरियल पोर्ट: टाइमआउट के साथ ब्लॉकिंग

How to implement a timeout in read function call?

how to open, read, and write from serial port in C

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

यहां वे सेटिंग है कि मैं बंदरगाह के लिए आवेदन कर रहा हूँ कर रहे हैं:

struct termios serial_struct; 
serial_struct.c_cflag = B115200 | CS8 | CLOCAL | CREAD; 
serial_struct.c_iflag = IGNPAR; 
serial_struct.c_oflag = 0; 
serial_struct.c_lflag = 0; 
serial_struct.c_cc[VTIME] = 1; // timeout after .1s that isn't working 
serial_struct.c_cc[VMIN] = 64; // want to read a chunk of 64 bytes at a given time 

मैं तो tcsetattr के साथ इन सेटिंग सेट() और पुष्टि करें कि बंदरगाह tcgetattr के माध्यम से सेटिंग प्राप्त()। मैं सोच रहा हूं कि मेरी सेटिंग्स विरोधाभासी हो सकती हैं, क्योंकि मेरे पढ़ने को अवरुद्ध करना प्रतीत होता है और 64 बाइट प्राप्त होने तक प्रतीक्षा करें, लेकिन टाइमआउट के संबंध में कुछ भी न करें। मैं समझता हूं कि मैं टाइमआउट से निपटने के लिए चुनिंदा() का उपयोग कर सकता हूं, लेकिन मैं कई सिस्टम कॉल से बचने की उम्मीद कर रहा हूं।

हमेशा की तरह, सहायता के लिए अग्रिम धन्यवाद।

+1

प्रश्न: डिवाइस क्या है (उदा।/Dev/ttyS0)? इस बंदरगाह पर डिवाइस क्या है (एक आरएस 232 कॉम पोर्ट? कुछ और?) भी: यह एक उत्कृष्ट लिंक है, यदि आप इससे पहले से परिचित नहीं हैं: http://www.tldp.org/HOWTO/Serial- प्रोग्रामिंग -कैसे/। आप शायद "एसिंक्रोनस I/O" भागों में रूचि रखते हैं। – paulsm4

उत्तर

6

man 3 termios से:

मिन> 0; TIME> 0: TIME एक टाइमर के लिए एक सेकंड के दसवें हिस्से में सीमा निर्दिष्ट करता है। एक बार प्रारंभिक बाइट इनपुट उपलब्ध हो जाने के बाद, प्रत्येक आगे बाइट प्राप्त होने के बाद टाइमर पुनरारंभ होता है। पढ़ें (2) या तो लौटाता है जब बाइट्स की संख्या कम हो जाती है या MIN बाइट पढ़ा जाता है, या जब इंटर-बाइट टाइमआउट समाप्त हो जाता है। चूंकि टाइमर प्रारंभिक बाइट उपलब्ध होने के बाद ही शुरू होता है, कम से कम एक बाइट पढ़ा जाएगा।

नोट जब तक डेटा की कम से कम एक बाइट प्राप्त नहीं शुरू जाता है कि टाइमर करता है। उस पहले डेटा बाइट प्राप्त करने के बाद, यदि लगातार डेटा बाइट प्राप्त करने के बीच एक सेकंड के टाइम दसवें हिस्से का अंतर होता है तो पढ़ने का समय समाप्त हो जाएगा।

+0

आह! तो इस अवधि में "असली" टाइमआउट सेट करने का कोई तरीका नहीं है कि कोई डेटा पास नहीं हो रहा है? मैं इसे कैसे हल करूं? चयन() के साथ? –

+0

हां: ऊपर दिए गए लिंक पर भी "चयन()" पर चर्चा की गई है। प्रश्न: डिवाइस क्या है? – paulsm4

+0

@ इट्सपेट मुझे लगता है कि लगभग हर कार्यक्रम अंततः इस बिंदु पर बढ़ता है कि आप (ए) 'चयन' या 'पोल' का उपयोग करके मल्टीप्लेक्स I/O या (बी) अलग-अलग थ्रेड के साथ अलग-अलग धाराओं को संभालते हैं। साथ ही इसे खत्म कर सकते हैं। – Casey

संबंधित मुद्दे