串行(COM) - 在Windows上重新连接

时间:2015-08-18 11:48:14

标签: c++ windows serial-port

我正在编写一个通过Serial连接到Arduino或Teensy的小软件。我希望软件能够实现USB-Serial是否已断开连接,并在再次插入时自动重新连接。

这在Linux下非常简单,但我甚至不确定Windows是否可行,因为我找到的所有终端程序在断开连接后无法重新连接到COM端口。

我目前正在使用QT5 QSerialPort实现,但是如果有人知道C ++类能够在不重新启动程序的情况下正确地重新连接,那么我会在一秒钟内改变。

如果有人知道可以自动重新连接的串行终端程序,我非常感谢你的回答。

编辑我正在使用通常为32位程序的64位Win7。

2 个答案:

答案 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,您可以更改它。

希望有帮助。