2010-08-24 15 views
5

तो मेरे पास एक अज्ञानी (शायद?) प्रश्न है। मैं पहली बार एक सीरियल डिवाइस पर लिखने के साथ काम कर रहा हूं। मेरे पास एक फ्रेम है [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, एक्स, वाई] कि मुझे भेजने की जरूरत है। एक्स और वाई चेकसम मूल्य हैं। पाइसरियल मॉड्यूल का उपयोग करने में मेरी समझ यह है कि मुझे इस फ्रेम को स्ट्रिंग प्रस्तुति में बदलने की आवश्यकता है। ठीक है यह ठीक है, लेकिन मैं क्या प्रारूप बातों में होने की अपेक्षा की जाती है। मैंपायथन में हेक्स से दशमलव

a = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, X, Y] 
send = "".join(chr(t) for t in a) 

कर की कोशिश की पर संदेह में हूँ लेकिन मेरी भ्रम तथ्य यह है कि एक्स और वाई, जब chr का उपयोग कर, अजीब तार में बदलना (से आता है अपने ascii प्रतिनिधित्व मानते हुए)। उदाहरण के लिए यदि एक्स 36 है, तो chr (x) '\ x24' के बजाय '$' है। क्या कोई तरीका है कि मैं एसीआईआई कोड के बजाय '\ xnn' मान का प्रतिनिधित्व करने वाली स्ट्रिंग प्राप्त कर सकता हूं? मुझे भ्रमित करने वाला यह है कि 12 और 7 सही ढंग से '\ x0b' और '\ x07' में परिवर्तित हो जाते हैं। क्या मैं कुछ भूल रहा हूँ?

अद्यतन:
तो यह हो सकता है कि मैं काफी समझ नहीं कर रहा हूँ कैसे धारावाहिक लेखन की जा रही है या क्या मेरे डिवाइस मुझे उम्मीद है। यह मेरी सी कोड के एक हिस्से की जाती है कि काम कर रहा है:

 

fd=open("/dev/ttyS2",O_RDWR|O_NDELAY); 
char buff_out[20] 
//Next line is psuedo 
for i in buff_out print("%x ",buff_out[i]); // prints b 0 0 0 0 0 0 0 9 b3 36 
write(fd,buff_out,11); 
sleep() 
read(fd,buff_in,size); 
for i in buff_in print("%x ",buff_in[i]); // prints the correct frame that I'm expecting 

 

पायथन:

 


frame = [11, 0, 0, 0, 0, 0, 0, 0, 9] + [crc1, crc1] 

senddata = "".join(chr(x) for x in frame) 



IEC = serial.Serial(port='/dev/ttyS2', baudrate=1200, timeout=0) 
IEC.send(senddata) 

IEC.read(18) # number of bytes to read doesn't matter, it's always 0 
 

मैं इस बारे में सही रास्ते पर जा रहा हूँ? जाहिर है आप बिल्कुल बता नहीं सकते क्योंकि यह डिवाइस विशिष्ट है और मैं वास्तव में बहुत अधिक विशिष्टताओं को नहीं दे सकता। लेकिन क्या सही प्रारूप है कि serial.send() डेटा की अपेक्षा करता है?

+0

अजगर प्रलेखन से, chr() नंबर पर आप रिटर्न इसे एक असीसी चरित्र के रूप में दर्ज करें। एएससीआई में 12 और 7 घंटी और फॉर्म फीड 'अक्षर' हैं, जो पाइथन मुद्रित करने में सक्षम नहीं हो सकते हैं (निश्चित रूप से नहीं जानते)। तो यह उन लोगों के लिए हेक्स प्रतिनिधित्व के लिए डिफ़ॉल्ट हो सकता है क्योंकि वे अवांछित हैं। – Joel

+0

12 \ x0c होना चाहिए, \ x0b नहीं ... – EOL

+0

क्षमा करें मेरा मतलब \ x0c था। मेरे पास एक और फ्रेम है जो 11 – Falmarri

उत्तर

3

यह पूरी तरह से सामान्य के लिए ASCII बाइट्स एकल वर्ण द्वारा प्रस्तुत किया जा सकता है अगर वे मुद्रित किया जा सकता है, और नहीं तो \x?? अंकन द्वारा है। दोनों ही मामलों में वे एक ही बाइट प्रतिनिधित्व करते हैं, और आप या तो फैशन में तार लिख सकते हैं: अगर आप अजगर 2.6 का उपयोग कर रहे

>>> '\x68\x65\x6c\x6c\x6f' 
'hello' 

हालांकि या बाद में तो आप आसान और अधिक प्राकृतिक उपयोग करने के लिए मिल सकती है में निर्मित ord या struct के साथ गड़बड़ करने के बजाए bytearray

>>> vals = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, 36, 100] 
>>> b = bytearray(vals) 
>>> b 
bytearray(b'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00$d') 

तुम बस कास्टिंग द्वारा (अजगर 3 में या bytes) एक str में बदल सकते हैं, और सूचकांक bytearray पूर्णांकों वापस पाने के लिए कर सकते हैं।

>>> str(b) 
'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00$d' 
>>> b[0] 
12 
>>> b[-1] 
100 

अपने सीरियल अजगर कोड के रूप में, यह मेरे लिए ठीक लग रहा है - मुझे यकीन है कि तुम क्यों लगता है कि वहाँ एक समस्या है नहीं कर रहा हूँ ...

+2

+1 बाइट्स –

+0

के तारों से निपटने के दौरान +1 बाइटियर एक बहुत अधिक प्राकृतिक विकल्प है क्योंकि यह एक समस्या है क्योंकि यह सी में काम करता है और पायथन में नहीं;) मैं इसे देखता रहूंगा। सी वास्तव में जटिल है इसलिए शायद मुझे कुछ याद आया – Falmarri

1

ASCII-code 36 के साथ वर्ण'$' है। किसी भी ASCII तालिका में इसे देखो। यदि चरित्र प्रिंट करने योग्य नहीं है (नियंत्रण वर्ण आदि) तो पाइथन केवल हेक्स से बचता है।

निम्नतम स्तर पर, यह वही पैटर्न है वैसे भी - इससे कोई फर्क नहीं पड़ता कि पाइथन इसे हेक्स से बचने के रूप में प्रिंट करता है या एएससीआईआई मूल्य के साथ चार के रूप में प्रिंट करता है।

लेकिन आप struct मॉड्यूल का उपयोग करना चाह सकते हैं, तो यह आपके लिए ऐसे रूपांतरणों का ख्याल रखता है।

+0

से शुरू होता है मैंने संरचना की भी कोशिश की। मुझे लगता है कि मुझे यकीन नहीं है कि मॉड्यूल मुझे डेटा देने के लिए कैसे चाहता है – Falmarri

0

मुझे लगता है कि आप struct चाहते हैं।

>>> import struct 
>>> struct.pack('>B', 12) 
'\x0c' 
>>> vals = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0xa, 0xb] 
>>> ''.join(struct.pack('>B', x) for x in vals) 
'\x0c\x00\x00\x00\x00\x00\x00\x00\x07\x00\n\x0b' 
+2

* आप एक सूची समझ का उपयोग नहीं करेंगे जहां जनरेटर अभिव्यक्ति पर्याप्त है। * – delnan

+0

@ डेलन - पर्याप्त मेला। – Seth

0

आप करते क्या बिल्कुल ठीक है: अपने send तुम क्या चाहते है: मान आप चाहते हैं (a) के साथ बाइट्स की एक दृश्य।

आप क्या send में वर्णों की हेक्साडेसिमल कोड को देखने के लिए चाहते हैं, आप कर सकते हैं:

import binascii 
print binascii.hexlify(send) 

या

print ''.join(r'\x%02x' % ord(char) for char in send) 

(आप \x उपसर्गों चाहते हैं)।

आप क्या देखते हैं जब सीधे repr(send) मुद्रण एक प्रतिनिधित्व send की, जो ASCII का उपयोग करता है: 65 'ए' का प्रतिनिधित्व करता है, लेकिन चरित्र 12 '\ x0c' है। यह केवल पाइथन द्वारा उपयोग किया जाने वाला एक सम्मेलन है, जो सुविधाजनक है जब स्ट्रिंग में शब्द होते हैं, उदाहरण के लिए: \ x48 \ x65 \ x6c \ x6c \ x6f से 'हैलो' प्रदर्शित करना बेहतर होता है!