簡體   English   中英

來自Arduino的PySerial讀取線延遲

[英]PySerial delay in reading line from Arduino

我將arduino uno與基本的“ DigitalReadSerial”設置結合使用,如下所示: http ://arduino.cc/en/Tutorial/DigitalReadSerial

如果我使用arduino IDE隨附的串行監視器,則它會立即顯示從按按鈕開始的任何更改。

這是我想要的pyserial,根據按鈕是否按下而為0或1。 (最終觸發計時器)

只是為了測試它,我把它放在一起,不是最漂亮的,但是似乎讀出了按鈕狀態,但是有20秒的延遲。

    import serial
    ser = serial.Serial()
    ser.setPort("COM2")
    ser.baudrate = 9600
    ser.open()
    while 1==1:
        ser.readline()

有人有什么想法嗎?

這似乎是一個緩存/同步問題,類似於那些影響普通文件系統中文件同步的問題。 我的arduino / pyserial遇到了這個問題...直到現在?

http://pyserial.sourceforge.net/pyserial_api.html中 ,如果我在程序中放入了3個刷新命令:ser.flush(),ser.flushInput()和ser.flushOutput(),它似乎可以正常工作。

我只是遇到了同樣的問題,而且我確信PySerial不會延遲。

延遲是由於我的PyQT線程的延遲引起的。我通過arduino的串行端口以1行/0.1秒的速度進行打印,但是我以0.5秒的延遲讀取QThread的串行輸出,這就是問題。隨着時間的流逝,延遲將增加。

我通過從項目中提取串行讀取代碼來驗證這一點。請記住, 讀取頻率不應小於寫入頻率

從您的代碼中,我假設您的python環境不夠快,無法及時從arduino接收數據

嘗試通過在兩次打印之間插入一個小的延遲來降低串行打印速度。

僅在有需要讀取的內容時才開始讀取行,否則它將在等待eol時阻塞,或者可能在讀取串行緩沖區的一半時超時,從而截斷了字符串。 這樣可以加快循環速度,並允許您使用較短的超時時間,非常適合在多個端口之間循環。 使用pyserial3.0 ...

while 1:
    if ser.in_waiting > 0:
        data = ser.readline()
        print(data)

也嘗試類似的東西

while 1:
    if ser.in_waiting > 0:
        data = ser.read(32)
        print(data)

如果緩沖區包含的字節數少於指定的字節數,這將不在乎,我有時會這樣做,因為它將讀取/刷新緩沖區中累積的額外數據。

您在Arduino代碼中使用的是Serial.print還是Serial.println 如果是前者,則不會發出回車,並且代碼中的ser.readline()將等待一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM