2016-09-18 126 views
1

太陽能逆變器(Delta RPI M6A)具有主從RS485總線。主站每秒要求變頻器發送一次響應數據組,然後由變頻器進行響應。總的通訊組爲176字節。 使用FTDI FT232 USB串行(UART)IC轉換器將Raspberry Pi 3B連接到此總線。使用pySerial讀取RS485數據時丟失字節(Delta Solar Inverter)

Python程序用於讀取總線上傳輸的數據。這隻有在沒有被解釋爲特殊字符的字節時才起作用(至少,這是我認爲的)。 我第一次讀取輸入1字節。一旦找到正確的「傳輸開始」序列(STX後跟ACK,接着是inverterID = 1),則預計將會有160字節的數據集加上結束序列。讀取的最後一個字節應該是ETX(= ascii 3)。

預期輸出是: Screenshot of expected output

我認爲這個問題是,如果一些字節是特殊字符,如逃避或換行等價,那麼這些字節不被ser.read「看到」 ()命令。然後,我將更快地獲得ETX字節幾個字節,表明中間的某些字節未被捕獲。

代碼的相關部分是:

if bytes_to_read == 1: 
    raw_data = ser.read() 
    pos = pos + 1; 
    # print pos; 
    if ord(raw_data) == 2:         # 2 = start of text character 
     pos = 1; 
     print str(pos) + ' ' + str(ord(raw_data)) 
    elif pos == 2 and ord(raw_data) == 6:     # 6 = acknowledge character 
     ack = True; 
     print str(pos) + ' ' + str(ord(raw_data)) 
    elif pos == 2 and ord(raw_data) != 6:     # 6 = acknowledge character 
     ack = False; 
     print str(pos) + ' ' + str(ord(raw_data)) + ' ack reset to False' 
    elif pos == 3 and ack and ord(raw_data) == 1: 
     bytes_to_read = 164; 
     print str(pos) + ' ' + str(ord(raw_data)) 
elif bytes_to_read == 164: 
    raw_data_byte = ser.read(164) 
    print len(raw_data_byte); 
    bytes_to_read = 1; 
    ack = False; 
    print 'got to read 164 bytes, first byte is ' + str(ord(raw_data_byte[0])) + ', last byte: ' + str(ord(raw_data_byte[163])); 
    if ord(raw_data_byte[0]) == 160 and ord(raw_data_byte[163]) == 3:      # 160 = data bytes specified by sender 
     print ('ready to process ' + str(len(raw_data_byte)) + ' bytes') 
     supplied_power_byte1 = bin(ord(raw_data_byte[101]))[2:].zfill(8) 
     supplied_power_byte2 = bin(ord(raw_data_byte[102]))[2:].zfill(8) 

捕獲的字節被後來加工以允許寫入到數據庫。

我一直在嘗試ser.read()和ser.readline(),結果相同。

我將不勝感激任何暗示將指向正確的方向。

謝謝, 的Bram

回答

0

的解決方案是設置串行接口到 '未定義' 的所有特殊字符,使用CLI命令:

[email protected]:~ $ stty -F /dev/RS-485 intr ^- 

其中 '的/ dev/RS-485'是一個真正的USB端口的符號鏈接,'intr'是特殊字符名稱的例子。當這對每個特殊字符進行(他們都可以添加到上述CLI命令),端口設置是這樣的:

[email protected]:~ $ stty -F /dev/RS-485 -g 
1400:4:cbe:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 

要看到更人性化的格式設置,使用命令

[email protected]:~ $ stty -F /dev/RS-485 -a 

所有字節現在按預期進入。