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