python - पायथन 3-इनट्स से 'बाइट्स' में परिवर्तित करने और फिर उन्हें कंटेट करने के लिए(सीरियल ट्रांसमिशन के लिए)



python-3.x serial-port (1)

बहुत बेकार खोज के बाद ... मैं 'बाइट्स' और हेक्साडेसिमल सामग्री को पायथन 3.2 में नियंत्रित करने के तरीके को समझने में एक बहुत विशिष्ट समस्या है। मुझे पता है कि मैं ग़लत समझ रहा हूं, लेकिन सही पथ खोजने में असमर्थ हूं।

मेरा अंतिम लक्ष्य बाइट्स के अनुक्रम को प्रसारित करने के लिए अजगर सीरियल मॉड्यूल का उपयोग करना है। कुछ बाइट स्थिर हैं और बदल नहींेंगे। दूसरों को मूल्य में 0-255 से भिन्न होना चाहिए। इन सभी को एक साथ धब्बा और एक बार में संचारित करने की आवश्यकता है। (ये एक प्रोग्राम डिस्प्ले के लिए निर्देश हैं। कोड में बीजी रंग सेट करने के लिए निश्चित निर्देश हैं, आर, जी और बी वैल्यू के लिए प्रत्येक के बाद एक बाइट है I परीक्षण के लिए लूप में रंग तीव्रताओं के माध्यम से चक्र करने की कोशिश कर रहा हूं, लेकिन बाद में मैं ' प्रदर्शन पर व्यावहारिक कार्यों के लिए ऐसा करने में सक्षम होना चाहता हूँ)।

एक पूर्ण स्थैतिक संचरण, सफलतापूर्वक कार्य किया गया परीक्षण, निम्नानुसार हो सकता है:

ser.write(b'\xAA\x11\x05\x00\x00\x00\xc3')  #this works great

इसी प्रकार, मैं उन्हें एक साथ छू सकता हूं, अर्थात्:

ser.write(b'\xAA\x11\x05' + b'\x00\x00\x00\xc3')  #also works great

अब अगर मैं उन तीन शून्य-मान बाइट्स में से एक लेना चाहता हूं, और उसे एक चर के साथ बदलना चाहता हूँ, तो यह सब नाशपाती के आकार का हो जाता है। बहुत प्रयोग करने के बाद मुझे कुछ के साथ समाप्त हुआ जिसने कथित रूप से एक लूप के लिए पूर्णांक चर को बाइट्स की उपरोक्त श्रृंखला के साथ संगत के साथ संगत प्रकार के रूप में परिवर्तित किया।

SET_BG_COLOR = b'\xAA\x03\x03'
for r in range(0,255):
            red = hex(r).encode('utf-8')
            blue = hex(255-r).encode('utf-8')
            ser.write(SET_BG_COLOR + blue + b'\x00' + red + b'\xC3') #BGR format

हेक्स (पूर्णांक)। एन्कोड ('यूटीएफ -8') अभी तक एकमात्र ऐसा तरीका था, जिसने अन्य सामानों को जोड़ने में असमर्थ होने के बारे में सिर्फ एक त्रुटि नहीं डाली, मैं सीरियल कनेक्शन को बंद करने की कोशिश कर रहा हूं। लेकिन यह काम नहीं करता है, और जब परिणाम देखता है:

>>> x = b'\05'
>>> x
b'\x05'
>>> y = hex(5).encode('utf-8')
>>> y
b'0x5'
>>> type(x)
<class 'bytes'>
>>> type(y)
<class 'bytes'>
>>> x + y
b'\x050x5'   #(this is what I get)
>>> z = b'\05'
>>> x + z
b'\x05\x05'  #(this is what I want)
>>> 

ऐसा लगता है, हालांकि यह मुझे सम्मिलित करने देता है ... यह स्ट्रिंग डेटा का एक द्विआधारी प्रतिनिधित्व है, या कुछ समय? तो मुझे सम्मिलित करने देगा लेकिन यह सही हेक्स मूल्य नहीं है? क्या मैं x = 255 से x = b '\ FF' पर जाने के लिए अंधाधुंध रूप से स्पष्ट तरीके से चूक गया? या मेरा पूरा तरीका क्या यह करने का गलत तरीका है? -_- आपके समय के लिए धन्यवाद।


आप यहां पायथन बाइट शाब्दिक सिंटैक्स को भ्रमित कर रहे हैं; आपको शाब्दिक सिंटैक्स उत्पन्न करने की आवश्यकता नहीं है, बस बाइट मान; bytes() प्रकार पूर्णांक के अनुक्रम को भी स्वीकार करता है:

>>> bytes([255])
b'\xff'

आपके कोड पर लागू:

SET_BG_COLOR = b'\xAA\x03\x03'
for r in range(0,255):
    red = bytes([r])
    blue = bytes([255 - r])
    ser.write(SET_BG_COLOR + blue + b'\x00' + red + b'\xC3') #BGR format

या, अभी भी सरल:

SET_BG_COLOR = [0xAA, 0x03, 0x03]
for r in range(0,255):
    ser.write(bytes(SET_BG_COLOR + [r, 0x00, 255 - r, 0xC3])) #BGR format

शाब्दिक हेक्स पूर्णांक संकेतन का उपयोग करना

r = 10 लिए डेमो:

>>> SET_BG_COLOR = [0xAA, 0x03, 0x03]
>>> r = 10
>>> bytes(SET_BG_COLOR + [r, 0x00, 255 - r, 0xC3])
b'\xaa\x03\x03\n\x00\xf5\xc3'

hex() फ़ंक्शन प्रत्येक बाइट में 4 वर्णों को आउटपुट करता है; पूर्णांक संख्या के हेक्स प्रतिनिधित्व द्वारा पीछा एक शाब्दिक 0x साथ शुरू। यूटीएफ 8 को एन्कोड किया गया है जो अभी भी 4 बाइट्स है, b'\x30\x78\x30\x31' पूर्णांक मान 10 के लिए, उदाहरण के लिए, वास्तविक बाइट के लिए बनाम b'\x10' जो आप चाहते थे





byte