我正在编写一个通过Serial连接到Arduino或Teensy的小软件。我希望软件能够实现USB-Serial是否已断开连接,并在再次插入时自动重新连接。
这在Linux下非常简单,但我甚至不确定Windows是否可行,因为我找到的所有终端程序在断开连接后无法重新连接到COM端口。
我目前正在使用QT5 QSerialPort实现,但是如果有人知道C ++类能够在不重新启动程序的情况下正确地重新连接,那么我会在一秒钟内改变。
如果有人知道可以自动重新连接的串行终端程序,我非常感谢你的回答。
编辑我正在使用通常为32位程序的64位Win7。
答案 0 :(得分:1)
关键是当连接到串行端口的设备断开连接时,您将在readline中收到null,因此如果它为null,则尝试重新连接。此外,您需要设置超时,否则readline将永远等待。 Python示例:
import serial
import threading
import time
class MainTHread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self._data = ""
self.ser = None
def run(self):
while(True):
try:
time.sleep(1)
ser = serial.Serial('COM3',9600,timeout=2)
except serial.SerialException as err:
print("Connection failed")
try:
ser.close()
except UnboundLocalError:
print("No Serial")
print(err)
continue
while True:
try:
print("Trying to read")
data_json = ser.readline()
self._data =data_json.decode('UTF-8');
if(not self._data):
break
print("Main Thread " + self._data)
except serial.SerialException as err:
print("Connection failed")
ser.close()
break
def getData(self):
return self._data
thread = MainTHread()
thread.start()
答案 1 :(得分:1)
在Powershell上更轻松:
function triaComPort(){
$selection = [System.IO.Ports.SerialPort]::getportnames()
If($selection.Count -gt 0){
$title = "Serial port selection"
$message = "Which port would you like to use?"
# Build the choices menu
$choices = @()
For($index = 0; $index -lt $selection.Count; $index++){
$choices += New-Object System.Management.Automation.Host.ChoiceDescription $selection[$index]
}
$options = [System.Management.Automation.Host.ChoiceDescription[]]$choices
$result = $host.ui.PromptForChoice($title, $message, $options, 0)
$selection = $selection[$result]
}
return $selection
}
$port = triaComPort
if(!$port){"Must choose";return}
Write-Host $("Port:"+$comport)
$port= new-Object System.IO.Ports.SerialPort $port,57600,None,8,one
while($true){
if(!$port.IsOpen){
try{
$port.Open()
write-host "+"
}catch{
write-host "-" -NoNewline
}
}
if($port.BytesToRead -gt 0){
Write-Host $port.ReadExisting()
}
}
$port.Close()
此脚本打印-无法连接时打印,+连接时,速度固定为57600,您可以更改它。
希望有帮助。