太陽能逆變器(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