मेरे पास एक धारावाहिक डिवाइस है जिसे मैं इनपुट पढ़ने की कोशिश कर रहा हूं। मैंने इसे एक स्ट्रिंग "आईडी \ आर" भेजा, और यह "आईडी एक्सएक्स \ आर" लौटाता है (जहां \ r एक ASCII कैरिज रिटर्न, हेक्स 0x0d है)।लाइन buffered धारावाहिक इनपुट
सीरियल.readline पर ईओएल विकल्प अब समर्थित नहीं है, इसलिए मैं धारावाहिक बंदरगाह से पढ़ने के लिए TextIOWrapper का उपयोग कर रहा हूं और एक समय में एक लाइन लौटाता हूं।
मेरी समस्या यह है कि जैसे ही यह कैरिज रिटर्न देखता है, मेरी स्ट्रिंग को वापस करने की बजाय, यह तब तक इंतजार कर रहा है जब मैंने धारावाहिक बंदरगाह खोला था। मैं इसे पूरी तरह से स्ट्रिंग वापस लौटना चाहूंगा जैसे ही यह पूरी लाइन पढ़ता है क्योंकि मेरे पास डिवाइस पर भेजने के लिए इनमें से सैकड़ों कमांड हो सकते हैं और मैं हर बार टाइमआउट का इंतजार नहीं करना चाहता हूं। अगर मैं 0 पर टाइमआउट सेट करता हूं, तो मुझे बिल्कुल आउटपुट नहीं मिलता है (संभवतः क्योंकि मेरी स्क्रिप्ट डिवाइस को कुछ भी आउटपुट करने का मौका देने से पहले प्रतीक्षा कर रही है), और यदि मैं टाइमआउट को किसी को भी सेट नहीं करता हूं, तो स्क्रिप्ट हमेशा के लिए ब्लॉक करता है।
import serial
import io
import time
ser = serial.Serial("/dev/ttyUSB0", baudrate=9600,
bytesize=8, parity='N', stopbits=1,
xonxoff=0, rtscts=1, timeout=5)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser),
newline=None)
sio.write(unicode("ID\r"))
sio.flush()
print "reading..."
x = sio.readline()
print len(x)
print x
स्क्रिप्ट हमेशा समय यह कहता है 'समझ' जब तक यह "आईडी XX" स्ट्रिंग है कि यह सीरियल पोर्ट से पढ़ा प्रिंट से 10 सेकंड लेता है:
यहाँ एक सरल परीक्षण स्क्रिप्ट है।
मुझे विश्वास है कि इस उपकरण गाड़ी वापसी outputting है कर रहा हूँ, जैसा कि मैंने strace का उपयोग किया है देखने के लिए कहता है:
select(4, [3], [], [], {5, 0}) = 1 (in [3], left {4, 991704})
read(3, "I", 8192) = 1
select(4, [3], [], [], {5, 0}) = 1 (in [3], left {4, 999267})
read(3, "D", 8191) = 1
select(4, [3], [], [], {5, 0}) = 1 (in [3], left {4, 999420})
read(3, " ", 8190) = 1
select(4, [3], [], [], {5, 0}) = 1 (in [3], left {4, 999321})
read(3, "X", 8189) = 1
select(4, [3], [], [], {5, 0}) = 1 (in [3], left {4, 999355})
read(3, "X", 8188) = 1
select(4, [3], [], [], {5, 0}) = 1 (in [3], left {4, 999171})
read(3, "\r", 8187) = 1
select(4, [3], [], [], {5, 0}) = 0 (Timeout)
select(4, [3], [], [], {5, 0}) = 0 (Timeout)
आप 2 का चयन करें() समय समाप्ति है कि 10 सेकंड की देरी दे देख सकते हैं , लेकिन आप कैरिज रिटर्न को पढ़ते हुए भी स्पष्ट रूप से देख सकते हैं। मैंने 'none' और '' (जिसे स्वचालित रूप से \ r, \ n, और \ r \ n), और '\ r' को अनुमति देने के लिए न्यूलाइन पैरामीटर सेट करने का प्रयास किया है, लेकिन प्रत्येक बार एक ही परिणाम के साथ।
मैंने BufferedRWPair() में buffer_size को बफरिंग इनपुट से रखने के लिए '1' पर कॉल करने का भी प्रयास किया है, लेकिन इससे कोई फर्क नहीं पड़ता।
कोई विचार क्या मैं गलत कर रहा हूं?
यदि मैं यह काम नहीं कर पा रहा हूं, तो मेरा अगला कदम एक समय में एक चरित्र को पढ़ने के लिए serial.read() का उपयोग करना होगा और अपनी लाइन बफरिंग करना होगा, लेकिन मैं इसे "सही करने की कोशिश करना चाहता था "पहले textiowrapper के साथ रास्ता।
सेट करने के अलावा, यह भी करना था, क्या आप निश्चित रूप से प्रिंट स्टेटमेंट आउटपुट बफरिंग ट्रिगर नहीं कर रहा है? इसे चलाने की कोशिश करें -u –