2015-01-28 1 views
2

하드웨어가 직렬 포트에 연결되어있는 TCL을 사용하여 하드웨어 테스트 자동화를 위해 노력했습니다. 현재 스크립트는 처음부터 직렬 포트에 연결할 수 있으며 끝에 연결을 끊을 수 있습니다. 그러나 응용 프로그램을 닫았다가 다시 열지 않으면 직렬 포트에 다시 연결할 수 없습니다. 직렬 포트에 연결하는 코드는 다음과 같습니다 return $spawn_id이전에 동일한 TCL 스크립트에서 열린 직렬 포트에 다시 연결할 수 없습니다.

직렬 포트에 연결을 종료하도록되어 코드 인 성공적인 복귀 문

if { [catch {spawn -open [open $port r+] } results] } { 
     puts $results 
     puts "Could not connect to port.\n" 
     return -1 } 

것은 :

if {[catch {close -i $handle} results]} { 
    puts "$results" 
    puts "Failed to Close Session $handle\n\r" 
    return -1 } 

#waits for handle to be properly closed 
exp_wait 

여기서 $ handle은 열린 프로 시저에서 반환 한 spawn_id입니다.

은 내가 이것을 사용하려고 방법을 설명하는 짧은 테스트 스크립트를 작성 :

'콘솔 ::'내가 가진

문제의 개폐 절차의 공간입니다

source console.tcl 

puts "available COM ports are: [console::availableSerial]" 

set handle [console::openSession COM6 BARE>] 

if {[catch {console::closeSession $handle} results]} { 
    puts $results } 


if {[catch {console::openSession COM6 BARE>} results]} { 
    puts $results } 

블로킹 활성화 및 비활성화와 같은 일부 fconfigure 매개 변수를 가지고 놀았지만 아무 소용이 없었습니다.

TCL에서 표시되는 오류 메시지는`직렬 포트 "COM6": permission denied '을 열 수 없습니다. 포트가 제대로 닫히지 않았 음을 나타냅니다. 'Exploring Expect'라는 책에는 여기에 관련된 정보가 많지 않으므로 여기있는 사람이 내가 잘못하고있는 것에 대해 통찰력을 줄 수 있기를 바랍니다. 32 비트 ActiveState ActiveTCL 8.6.3.1을 사용하고 있으며 쉘은 Tclsh36입니다.

모든 의견을 환영하겠습니다. 감사.

+0

exp_wait을 교체했다? (문제가 '대기'또는 그와 비슷한 것을 할 필요가 있다고 생각하지만, 나는 확신 할 수 없다.) –

+0

스크립트 대신 수동으로 연결을 열면 어떻게 연결을 닫을 것인가? ? – Dinesh

+0

@DonalFellows 직렬 포트를 열어 두는 문제는 스크립트 실행과 직렬 포트에 연결된 주변 장치가 변경된다는 것입니다. 나는 또한 포트를 닫은 후'4000 년 이후 '또는 다른 대기 시간을 사용하여 게임을했지만 여전히 동일한 결과를 얻고 있습니다. 죄송 합니다만, 질문에 그 정보를 포함시켜야합니다. 그래도 입력 주셔서 감사합니다. –

답변

1

여기에서 문제는 생성 된 연결을 처리하기 위해 proc을 사용하는 데 있습니다. 연결이 프로 시저에서 생성 된 경우 (foo1이라고 함) 다른 프로 시저 (foo2 인 경우)와 즉시 상호 작용할 수 없습니다. 이 작업을 수행하려면 spawn_id을 foo1에서 반환하고 foo2에 매개 변수로 전달해야합니다. 이것은 스폰 된 연결로 정보를 보내는 것뿐만 아니라 해당 연결에서 정보를받는 것에 영향을 미칩니다.

내 경우에는 close -i $handle이라고했는데 그 때가 정확히 exp_wait입니다. 전달 된 spawn_id를 사용하여 exp_wait을 호출하지 않았으므로 올바른 응답을 기다리지 않았습니다.

수정은 분명히 해결 방법은 그냥 닫지하는 것입니다 단순히 exp_wait -i $handle

관련 문제