ProgramingTip

Python으로 사용 가능한 com 포트 텍스트

bestdevel 2020. 11. 3. 08:20
반응형

Python으로 사용 가능한 com 포트 텍스트


PC에서 사용 가능한 모든 COM 포트를 사용하는 간단한 방법을 찾고 있습니다.

이 방법을 찾았지만 Windows 전용입니다. Windows에서 일련의 (COM) 포트 그래픽?

Windows 7 PC에서 pySerial과 함께 Python 3을 사용하고 있습니다.

pySerial API ( http://pyserial.sourceforge.net/pyserial_api.html )에서 serial.tools.list_ports.comports()com 포트 (내가 원하는대로)를 사용 하는 함수 찾았 습니다 .

import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))

하지만 작동하지 않는 것입니다. 내 USB-COM 게이트웨이가 PC에 연결되어있을 때 (장치 관리자에 COM5가 표시됨)이 COM 포트는 반환 된 목록에 포함되지 않습니다 list_ports.comports(). 대신 모뎀에없는 것처럼 보이는 COM4 만 얻습니다 (장치 관리자의 COM & LPT 섹션에는 표시됩니다)!

왜 작동하지 않는지 아십니까? 특정 시스템이 아닌 다른 솔루션이 있습니까?


이것이 제가 사용하는 코드입니다.

Windows 8.1 x64, Windows 10 x64, Mac OS X 10.9.x / 10.10.x / 10.11.x 및 Ubuntu 14.04 / 14.10 / 15.04 / 15.10에서 Python 2 및 Python 3에서 모두 사용하여 테스트.

import sys
import glob
import serial


def serial_ports():
    """ Lists serial port names

        :raises EnvironmentError:
            On unsupported or unknown platforms
        :returns:
            A list of the serial ports available on the system
    """
    if sys.platform.startswith('win'):
        ports = ['COM%s' % (i + 1) for i in range(256)]
    elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
        # this excludes your current terminal "/dev/tty"
        ports = glob.glob('/dev/tty[A-Za-z]*')
    elif sys.platform.startswith('darwin'):
        ports = glob.glob('/dev/tty.*')
    else:
        raise EnvironmentError('Unsupported platform')

    result = []
    for port in ports:
        try:
            s = serial.Serial(port)
            s.close()
            result.append(port)
        except (OSError, serial.SerialException):
            pass
    return result


if __name__ == '__main__':
    print(serial_ports())

당신이 사용할 수있는 :

python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"

기기 포트로 필터링 : python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"

자세한 내용은 https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports를 참조하세요.


Thomas의 탁월한 대답에 대한 가능한 개선은 Linux를 사용하고 OSX도 포트를 열고 열 수있는 포트만 반환하도록하는 것입니다. 그 이유는 Linux는 최소한 아무 것도 연결되지 않은 / dev /에있는 파일로 포트의 보트로드를 나열하기 때문입니다. 터미널에서 실행중인 경우 / dev / tty는 작업중인 터미널이고 열고 닫으면 명령 줄이 망가질 수 있으므로 glob은 그렇게하지 않도록 설계되었습니다. 암호:

    # ... Windows code unchanged ...

    elif sys.platform.startswith ('linux'):
        temp_list = glob.glob ('/dev/tty[A-Za-z]*')

    result = []
    for a_port in temp_list:

        try:
            s = serial.Serial(a_port)
            s.close()
            result.append(a_port)
        except serial.SerialException:
            pass

    return result

Thomas의 코드에 대한이 수정은 Ubuntu 14.04에서만 테스트되었습니다.


moylop260 의 답변에 대한 개선 :

import serial.tools.list_ports
comlist = serial.tools.list_ports.comports()
connected = []
for element in comlist:
    connected.append(element.device)
print("Connected COM ports: " + str(connected))

여기에는 사용중인 포트를 포함하여 하드웨어에 존재하는 포트가 나열됩니다. pyserial 도구 문서 에 따라 훨씬 더 많은 정보가 목록에 있습니다.


기본적으로 pyserial 문서 https://pyserial.readthedocs.io/en/latest/tools.html#module-serial.tools.list_ports 에서 언급했습니다.

import serial.tools.list_ports
ports = serial.tools.list_ports.comports()

for port, desc, hwid in sorted(ports):
        print("{}: {} [{}]".format(port, desc, hwid))

결과 :

COM1 : 통신 포트 (COM1) [ACPI \ PNP0501 \ 1]

COM7 : MediaTek USB 포트 (COM7) [USB VID : PID = 0E8D : 0003 SER = 6 LOCATION = 1-2.1]


pySerial 패키지로 한 줄 솔루션.

python -m serial.tools.list_ports

몇 가지 옵션을 사용할 수 있습니다.

모든 DOS 장치를 나열하려면 NULL lpDeviceName을 사용하여 QueryDosDevice호출하십시오 . 그런 다음 각 장치 이름과 함께 CreateFile 및 GetCommConfig사용 하여 직렬 포트인지 확인합니다.

GUID_DEVINTERFACE_COMPORT의 ClassGuid를 사용하여 SetupDiGetClassDevs호출합니다 .

WMI는 C / C ++ 프로그램에서도 사용할 수 있습니다 .

win32 뉴스 그룹 과 CodeProject, er, project 에 대한 대화가 있습니다 .


이 코드를 시도하십시오 :

import serial
ports = serial.tools.list_ports.comports(include_links=False)
for port in ports :
    print(port.device)

우선 직렬 포트 통신을 위해 패키지를 가져와야합니다.

import serial

그런 다음 현재 사용 가능한 모든 직렬 포트 목록을 만듭니다.

ports = serial.tools.list_ports.comports(include_links=False)

그런 다음 전체 목록을 따라 가며 예를 들어 포트 이름을 인쇄 할 수 있습니다.

for port in ports :
    print(port.device)

이것은 포트 목록을 가져오고 이름을 인쇄하는 방법의 예일 뿐이지 만이 데이터로 수행 할 수있는 다른 옵션이 있습니다. 이후에 다른 변형을 인쇄 해보십시오.

포트.

참고 URL : https://stackoverflow.com/questions/12090503/listing-available-com-ports-with-python

반응형