從代碼中禁用python的DTR


Answers

你所描述的方法似乎是我見過的這個問題的最常見的解決方法 - 所以我懷疑沒有簡單的基於軟件的解決方案。 你當然可以使用ser.setDTR(level)手動改變DTR行的狀態 - 但是我沒有在Arduino自動復位的情況下專門嘗試過,我懷疑在打開串口之後,可能不夠快以防止重置。

其他選項,我可以看到你有可用的將是防止Arduino的硬件自動復位( 見這裡 ),或者稍微改變你的代碼,以便你允許Arduino在初始化串行連接後重新啟動,然後當你手動觸發你的串行接收模式,從Arduino發送一個初始信號,表明它現在已經準備好接收數據了。 或者,你也可以在你的腳本中加入pySerial庫的修改版本。

Question

我試圖用pyserial來發送數據到一個arduino。 但是當我打開COM端口時,它將DTR設置為低電平,並重置電路板。 但是,我有我的arduino代碼設置,以便我必須通過按住兩個按鈕1秒將其置於串行接收模式。 如果可能的話,我寧願不必在啟動arduino時進行串行輸入。

顯然你可以修改serialWin32.py文件,改變下面這一行:

self._dtrState = win32.DTR_CONTROL_ENABLE

至:

self._dtrState = win32.DTR_CONTROL_DISABLE

但是,有沒有辦法只是直接禁用我的Python腳本? 我也需要為所有系統做這個。 我寧願不強迫人們改變他們的基本串行配置只是使用這個腳本。

串口打開如下:

 com = serial.Serial(port, baud, timeout=1);

更新:最後,我發現了一個解決方案,適用於我的設置。 由於我不需要一直做串行數據,只有當我把設備設置為串行接收模式時,我發現了一種方法來禁用從Arduino本身的串行連接重置。

許多職位都表示,可以通過在5V和復位之間放置一個〜100歐姆的電阻來禁用DTR復位。 但我不希望這是一個永恆的事情。 所以,相反,我放置了一個電阻之間的PD5和重置。 然後,在軟件中:

void setup() {
    //.......
    DDRD &= ~(_BV(PD5)); //Set PD5 as input initially
    PORTD |= (_BV(PD5)); //Set high
    //.......
}

inline void setResetDisable(bool state)
{
  if(state)
    DDRD |= (_BV(PD5)); //Set PD5 as output to put 5V on reset line
  else
    DDRD &= ~(_BV(PD5)); //set back to input mode
}

所以,現在,當我想要處於串行模式時,我調用setResetDisable(true),在該100歐姆電阻和復位引腳上產生5V電壓,防止DTR將其拉低並重置芯片:)然後我只是調用setResetDisable(false )當我離開串行模式,所以芯片可以正常編程。




這是一個軟件解決方案,我一直在使用它自己一段時間,它的作品像一個魅力:

ser = serial.Serial("/dev/ttyUSB0", 115200, timeout=1)
ser.setDTR(False)
time.sleep(0.5)

請注意,睡眠是棘手的部分,沒有它不會工作