[英]How to find EOL (end of line) in a byte-stream from a serial device
我嘗試從設備讀取行,該設備每2秒發送1到3行文本到串行打印機,並使用pyserial讀取該設備的串行輸出。
首先,我使用minicom來獲得輸出樣本:當我使用hax閱讀器(在Linux中為ghex)打開它時,我看到每一行的末尾都有十六進制值x0A。
當我逐字節捕獲pyserial(3.2.1版)的輸出時:
print(self.ser.read())
行末的輸出是
b'\\ r'
b'\\ n'
每次一行結束(為什么要輸入兩個字符?)
我試圖定義一個read_line()函數:
import serial
def read_line(self):
line = []
print("start read_line")
while True:
print("read_line_loop")
for c in self.ser.read():
line.append(c)
print("appended")
if c == b'\x0A':
print("stop condition")
print("Line: " + line)
line = []
break
按預期方式進入了循環,但從未滿足條件c == b'\\ x0A'。 顯示的消息為“ read_line_loop”,每隔幾秒“附加”幾次,但從不“停止條件”。
任何想法?
使用\\ r \\ n(回車,換行)結束一行是Windows的普通方法(和打字機)來結束一行。 用十六進制翻譯的這些符號是“ \\ x0D”和“ \\ x0A”。 為什么找不到它,我不能告訴你。 但是,當您正在讀取行時,我將使用串行端口的readline方法。 由於您的行以\\ n結尾,因此應該可以正常工作。 當您的行不是以\\ n結尾,而是以其他結尾時,您只會遇到問題。
一種方法是輸出c以查看其實際含義。 c可能與您的想法有所不同。
另一種方法是使用內置的readline方法,該方法使用換行符( http://pyserial.readthedocs.io/en/latest/shortintro.html#readline )。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.