2017-09-21 62 views
0

我遇到了Processing3的問題,當我嘗試連接到某個COM端口時,該應用程序崩潰,出現Port Busy錯誤。COM端口似乎一直很忙

下面的代碼片斷:

boolean found = false; 
text(Arrays.toString(Serial.list()), 20, 500); 
println("Still checking..."); 
for (String port : Serial.list()) { 
    myPort = new Serial(this, port); 
    myPort.clear(); 
    myPort.write("init\n"); 
    if (myPort.readStringUntil(lf) == "connected") { 
    found = true; 
    break; 
    } 
} 
if (!found) { 
    myPort = emptyPort; 
    text("Waiting for device...", 20, 40); 
} 

這是平局()循環的一部分,該誤差是在在本例中第5行拋出。在該特定端口變得可用之前,其他一切都運行得很好。

這是從連接的Arduino設置()的代碼:

從串行監控
Serial.begin(256000); 
while (!Serial.available()) {} 
while (true) { 
    String recv = Serial.readStringUntil('\n'); 
    if (recv == "init") { 
    Serial.println("connected"); 
    break; 
    } else { 
    while (!Serial.available()) {} 
    } 
} 
Serial.println("600,400"); 

測試中的Arduino IDE不產生這樣的錯誤。

+0

你有沒有想過這個想法? –

+0

@KevinWorkman哦,是的,我正在等待所以讓我接受我自己的答案,同時,有點忘了它..移動到其他問題。 –

回答

0

而不是用emptyPort替換myPort,您應該關閉myPort並通過執行myPort.stop()來釋放COM端口以反覆連接。

0

這似乎是錯誤的:

for (String port : Serial.list()) { 
    myPort = new Serial(this, port); 

這裏你連接串行端口。你應該只是連接到一個,對吧?

另外,你說你是從draw()函數做到這一點?這似乎也是錯誤的。您不希望每秒連接到端口60次。你想從setup()函數連接一次,然後在該程序的其餘部分使用該連接。

如果我是你,我會回去看看一些代碼示例。

the reference

// Example by Tom Igoe 

import processing.serial.*; 

// The serial port: 
Serial myPort;  

// List all the available serial ports: 
printArray(Serial.list()); 

// Open the port you are using at the rate you want: 
myPort = new Serial(this, Serial.list()[0], 9600); 

// Send a capital A out the serial port: 
myPort.write(65); 

這個例子只是連接到找到的第一個COM口,然後發送一個單一的值。請注意,此代碼是「一次完成」且不會重複,類似於將此全部放入setup()函數中會發生的情況。

在嘗試移植到更復雜的東西之前,獲得像這樣簡單的工作。如果您遇到困難,請發佈MCVE而不是一堆斷開連接的片段。祝你好運。

+0

由於其他問題,可能有多個端口,我需要找出哪一個連接到它,發送一個字符串,期待另一個字符串...所以是的,我需要嘗試連接到每個串口,即使在這種情況下,反正只有一個是可用的。 –

+0

我還想定期檢查端口,如果連接尚未建立。 –

+0

@JanNovák我明白了。我仍然認爲你不應該使用'draw()'函數來做到這一點,我仍然認爲你應該嘗試一些簡單的工作併發布[mcve]。 –