2014-04-09 2 views
1

USB 포트를 사용하여 '가상 COM 포트'로 컴퓨터와 통신하는 STM32 마이크로 컨트롤러를 사용하는 내장 컨트롤이 있습니다. 현재 컨트롤이 자동으로 5 분 동안 켜지고 10 초 동안 꺼지는주기 테스트를 실행 중입니다. 이것은 50-200이 다시 시작될 때마다 나타날 오류를 잡는 것입니다.재부팅을 통해 USB 가상 COM 장치를 영구화하십시오.

장치가 이미 가상 COM 포트를 통해 디버그 메시지를 출력하고 있지만 장치가 다시 시작되면 USB 장치의 연결이 끊어지고 다시 연결됩니다. 그럼 내가 출력 (퍼티, 테라 용어 등)을 모니터링하기 위해 사용하고있는 프로그램이든간에 연결이 끊어 지므로 수동으로 USB 케이블을 뽑았다가 다시 연결해야하며 사용중인 모든 COM 응용 프로그램을 다시 시작해야합니다.

목표는 Tera Term 또는 퍼티를 설정하여 COM 포트를 열어두고 전체 세션을 로그 파일에 기록하는 것입니다.하지만 USB 장치가 다시 시작되므로 영구적이지 않습니다.

USB 포트를 '가상화'하거나 .ini 파일을 수정하여 USB 포트를 영구화 할 수있는 방법이 있습니까? 여기에 내가

[USBtoSer.nt.Services] 
AddService=usbser, 0x00000002, DriverService 

[DriverService] 
DisplayName=%USBIOMport% 
ServiceType=1 
StartType=3 
ErrorControl=1 
ServiceBinary=%12%\usbser.sys 

내가 포함 된 응용 프로그램이 STM32에서 실행 만 USB

를 통해 미리 프로그램 된 터미널을 통해 상호 작용할 수 있습니다 수정할 수 없습니다 .ini 파일의 관련 섹션 믿는 것입니다 편집 : 여기에 무엇을 설명하는 Microsoft에서 정보를 a link 있습니다. 나는 어떤 변화가 내 응용 프로그램에서 작동하는지 결정하지 못했기 때문에 다른 ErrorControl 및 StartType을 사용하여 시행 착오를 시작할 수 있습니다 (비록 내가 읽은 것으로부터 그들은 내 문제를 해결할 것이라고는 거의 의심하지 않습니다).

+0

devcon.exe을 가지고, 자신 만의 변경이나 임베디드 코드의 변경없이이 문제는 프로그래밍 구성 요소가 전혀 없습니다. 수퍼 유저를 시도해보십시오. –

+0

@BenVoigt 님의 추천에 감사드립니다. 나는 분명히 다른 터미널을 사용하지 않아도된다. 나는 스스로 쓸 수는 있지만 여전히 비 지속성 장치의 문제를 해결하지는 못한다. USB 포트를 계속 폴링 상태로 유지하기 위해 자체 프로그램을 작성할 수 있다고 제안 하시겠습니까? – StephenH

+1

자신의 프로그램을 작성한 경우 장치 제거와 관련된 OS 이벤트를 처리하고 포트를 닫을 수 있습니다. 그런 다음 장치가 다시 돌아 오면 사용중인 포트를 찾지 못하고 다시 장치를 회수합니다. 장치를 연결하는 이벤트도 발생하며 포트를 다시 열어야 함을 나타냅니다. –

답변

0

나는 이것에 대한 답을 결코 게시하지 않았다. 내가 해결할 수 없었던 USB Virtual COM 드라이버의 문제 였지만이 문제를 해결할 수있었습니다.

참고 :이 질문과 대답은 Windows 플랫폼 특정입니다.

Microsoft는 devcon.exe이라는 프로그램을 제공합니다. Windows 장치 콘솔, 장치 관리자의 명령 줄 버전의 종류입니다.

Ultimatlely, 장치를 제거하고 다시 뽑을 수 있다면 (즉, 플러그를 뽑지 않고 "사실상"플러그를 뽑지 않아도 됨),이 응용 프로그램을 호출하여 나를 위해 특정 장치를 제거 할 수 있음을 깨달았습니다. 그런 다음 연결이 끊어지면 장치 구조를 다시 검색하십시오. 그래서 여기에 직렬 데이터 덤프 사이에 이것을 수행하기 위해 사용했던 파이썬 스 니펫이 있습니다. 아마도 가장 깨끗한 코드가 아닐지도 모르지만, 이것은 빠르고 더러운 로깅 스크립트에만 해당됩니다. 다행히도 이것은 당신 중 일부가 같은 문제를 경험하도록 도울 수 있기를 바랍니다.

import serial 
from subprocess import call 
from time import sleep 

def remove(ser): 
    try: 
     ser.close() 
    except: 
     print "Could not close port" 
    call(["devcon.exe","remove","USB\VID_0D59&PID_0005*"]) 

def rescan(): 
    call(["devcon.exe","rescan"]) 
    sleep(30) 

def send(ser, message): 
    if ser.isOpen(): 
     try: 
      ser.write(message) 
     except serial.serialutil.SerialException: 
      remove(ser) 
      rescan() 
      try: 
       ser.open() 
      except serial.serialutil.SerialException: 
       try: 
        remove(ser) 
        rescan() 
       except: 
        print 'Could not reconnect' 
        return False 
      else: 
       print 'Reconnected to %s' % (ser.portstr) 
       ser.write(message) 
       return True 
     else: 
      return True 

중요 사항 : 포트로 데이터를 보내고 예외를 수신하려고 시도하는 것이 장치가 다시 시작되었음을 알리는 유일한 방법이었습니다. 오픈, 클로즈, 또는 체크 연결의 양은이 드라이버로 성공한 것으로 입증되지 않았으므로,이 시간에 나올 수있는 최상의 솔루션이었습니다.

또한 rescan() 함수의 임의의 30 초 지연에 유의하십시오. 이는 컴퓨터가 장치를 인식하고 적절한 드라이버를 찾을 수있는 충분한 시간을 허용하기위한 것입니다. 시스템과 장치마다 시간이 다릅니다.

이 코드는 마지막으로이 아마 분명하다 파이썬 2

이지만,이 솔루션은 다른 사람에 의해 쓰여진 터미널을 사용하여 제한되기 때문에 같은 디렉토리 나 PATH

관련 문제