2014-04-05 13 views
3

을 여는 경우 프로그램 중지 (무한 루프?)의 원인이된다. 불행히도 나는 QSerialPort가 리눅스에서 제대로 구현되지 않았다는 느낌을 가지고있다. 다른 방법 (파이썬)과는 대조적으로 나는 때때로! 내가 전화하려고 할 때 프로그램의 중지 : 나는 http://qt-project.org/wiki/QtSerialPort에서 예제를 사용하고QSerialPort 내가 직렬 장치에 쓰고 싶은 장치

serial.open(QIODevice::ReadWrite) 

(아래 참조). QSerialPortInfo가 제대로 작동하여 장치를 열기 전에 장치를 검색 할 수 있습니다. 문제는 모든 Qt 5. * 시리즈에서 나타났습니다. 현재 OpenSuse 저장소에서 5.3 베타 버전을 사용 중입니다. 다른 도구 또는 방법은 장치가 작동하고 있음을 증명합니다 (Windows 또는 Python).

// Example use QSerialPortInfo 
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { 
    qDebug() << "Name  : " << info.portName(); 
    qDebug() << "Description : " << info.description(); 
    qDebug() << "Manufacturer: " << info.manufacturer(); 

    // Example use QSerialPort 
    QSerialPort serial; 
    serial.setPort(info); 
    if (serial.open(QIODevice::ReadWrite)) // Hang of the program 
     serial.close(); 
} 

근무 파이썬 스크립트 :

com_port = 4 
baud_rate = '9600' 
pySerial = serial.Serial(com_port, baud_rate) 

편집 : 나는 디버거를 테스트했다. 적어도 리눅스에서는 Qt 5의 문제로 보입니다. 장치 잠금 장치와 연결된 것처럼 보입니다.

+0

당신은 QSerialDevice 무엇을 의미합니까 ... 직렬 포트를 열 수 있어야한다? 그런 수업은 없습니다! 예배당이 당신을 위해 일합니까? – lpapp

+1

예제는 여러 Qt 버전이있는 내 시스템 (OpenSuse)에서만 작동합니다. PySerial은 항상 작동합니다 (windows, linux). 실제로 그것이 저만의 것인지, 아니면 그것이 단지 Qt 문제인지 궁금합니다. 그러나 QSerialPort로 매달리지 않으면 모든 것이 원활합니다. – dgrat

+0

어떤 예를 들어 말씀하십니까? 커맨드 라인 독자와 작가를 시도해 보셨습니까? 어떤 Qt 버전을 사용하고 있습니까?아마도 당신은 구식 QtSerialPort를 사용하고 있습니까? 너 어디서 났니? 정확히 어떤 유형의 시리얼 포트를 사용하고 있습니까? – lpapp

답변

4

I 씨 PAPP에 대해 불평 모르겠어요; 더 이상의 정보없이 문제를 재현 할 수있었습니다.

Linux의 경우 열려있는 QSerialPort 인스턴스가있는 Qt 프로세스가 비정상적으로 종료되거나 프로세스 종료시 QSerialPort 인스턴스가 삭제되지 않으면 잠금 파일이 멈추고 문제가 발생할 수 있습니다. 낡은 잠금 파일로 인해이 문제가 발생하지 않아야합니다. 잠금 파일에는 손상된 응용 프로그램의 PID가 들어 있으며 새 응용 프로그램 인스턴스는 해당 PID가있는 프로세스가 존재하지 않음을 인식하고 새 잠금을 생성하기 직전에 잠금을 삭제합니다. strace는 새 프로세스가 부실 잠금 파일이 삭제되었는지 여부를 반복적으로 검사 할 때 증가하는 백 오프 시간과 함께 문제의 잠금 파일을 반복적으로 표시합니다. 따라서 파일을 삭제하십시오 (예 : /var/lock/LCK..ttyS0). 추락 한 응용 프로그램을 실행 한 경우 잠금 파일을 소유하게됩니다.

임의의 부가 메모 : 파이썬에서 PyQt5를 통해 QSerialPort를 사용하는 경우 (작동하지만!) 파이썬 인터프리터가 종료되기 전에 명시 적으로 QSerialPort 인스턴스를 삭제했는지 확인하십시오. IPython에서 포트를 조작한다면, 종료하기 전에 "% xdel portobject"를 수행하십시오.

멍청한 해결 방법이지만 다른 메커니즘을 사용하여 프로그램의 두 인스턴스가 실행 중이고 동일한 포트를 사용하지 않는다면 - 또는 단순히 신경 쓰지 않는다면 - 코드 줄은 포트를 열기 전에 해당 잠금 파일을 삭제합니다.

이럴, Qt는 처음부터 완전히 쓸모없는 윈도우 스타일의 유모 상태 보호를 모방해서는 안됩니다. 나는 sudo rm -rf/할 수 있고 그것은 일어난다! 직렬 포트를 사용할 수도 있습니다. 언제 그러나 나는주십시오 전력과 같은 같은 자유로운, 원시, 신 감안할 때, 나는

+0

예, 잠금 파일을 삭제하면 다시 액세스 할 수 있습니다. 불행히도 내가 왜 재부팅 후 바로 잠금 파일이 있는지 모릅니다. – dgrat

+0

이러한 잠금 파일은 어디에 있습니까? – Goddard

+0

Re : "Qt는 처음부터 보잘것없는 윈도우 스타일 보모 상태 보호를 모방해서는 안됩니다." 이러한 보호는 또한 디버깅을 어렵게 만듭니다. 예를 들어, [루트로 (그리고 부적절하게 종료하면서) 내 응용 프로그램을 실행하면 루트가 아닌 사용자로 다시 실행할 수 없지만,'echo foo >>/dev/ '이 여전히 효과가 있다는 것을 알게되었습니다.] http : /stackoverflow.com/q/37335986/1858225) –

3

클래스는 직렬 포트에 대한 잠금을 얻으려고합니다. bool QSerialPortPrivate::open(QIODevice::OpenMode mode) 아마 응용 프로그램에서 선 lockFileScopedPointer->lock(); 루트로 실행 된 응용 프로그램이 다른 사용자로 실행할 때 잠금 파일에 액세스 할 수 없습니다. strace를 실행하여 확인하십시오.

+0

문제는 부분적으로 파일 잠금 구현에 있으며 아마도 배포 문제 일 수도 있습니다. 불행히도 100 %를 재현하기가 쉽지 않습니다. – dgrat