2014-04-21 4 views
3

다음 코드를 사용하여 arduino와 통신 할 직렬 포트를 엽니 다.arduino-ide가 연결을 열기 전에 QSerialPort를 사용하여 arduino와 통신 할 수 없습니다.

const qint32 baud = Global::getInstance().getSettings().value("Hardware/baudRate", 115200).toInt(); 
    const QString portName = Global::getInstance().getSettings().value("Hardware/port", "COM3").toString(); 
    port.setPortName(portName); 

    if(!port.open(QIODevice::ReadWrite)) 
    { 
    qFatal("Unable to open serial port"); 
    exit(1); 
    } 
    if(!port.setParity(QSerialPort::NoParity) || 
    !port.setStopBits(QSerialPort::OneStop) || 
    !port.setDataBits(QSerialPort::Data8) || 
    !port.setFlowControl(QSerialPort::NoFlowControl) || 
    !port.setBaudRate(baud)) 
    { 
    qFatal("Unable to configure serial port"); 
    exit(1); 
    } 
    if(port.error() != QSerialPort::NoError) 
    { 
    qFatal("some error occurred!"); 
    exit(1); 
    } 

는 그 후 나는 다음과 같은 코드를 사용하여 연결에서 읽으려고 :

bool Light::waitForReady() 
{ 
    char data[1]; 
    data[0] = -1; 
    if(port.waitForReadyRead(10000)) 
    { 
    const int numRead = port.read(&data[0], 1); 
    if(numRead == 1) 
    { 
     return data[0] == (char)RDY; 
    } 
    else 
    { 
     qWarning("Read error, read %d bytes", numRead); 
    } 
    } 
    else 
    { 
    qWarning("Read timeout"); 
    return false; 
    } 
    return false; 
} 

읽기 않습니다 하지 작업 시간 초과 10 초 동안 대기 한 후. 그러나 내 QT 코드를 실행하기 전에 arduino-ide 내부에서 직렬 모니터를 열고 닫으면 작동합니다. 내 생각 엔 ardunio-ide는 포트에 뭔가 빠졌지 만, 필자는 arduino-ide와 똑같은 설정을 사용하여 직렬 포트를 열 수 있다고 말할 수 있습니다.

는 아두 이노에서 실행되는 코드입니다 :

void setup() 
{ 
    Serial.begin(115200); 
    Serial.write(RDY); 
} 

This 사람은 비슷한 문제가 있었다 그는 퍼티와 QSerialPort의 직렬 포트 설정을 비교 하였다. 그는 fDtrControl, fOutXfIutX 설정이 다릅니다. 나는 fDtrControl을 바꾸려고했지만 효과가 없었다. QT를 사용하여 fOutXfIutX을 설정하는 방법을 모르겠습니다.

어떤 아이디어가이 버그의 원인 일 수 있습니까?

편집 : 솔루션 : port.setDataTerminalReady(true)

+0

안녕하세요. 어떤 QtSerialPort 버전을 사용하고 있습니까? Qt 4.8.5 및 사용자 정의 빌드 또는 5.2.1 바이너리 패키지와 함께 있습니까? 또한, 5.3 베타 또는 마스터 코드를 사용하는 경우, 열기 전에 포트를 설정할 수 있기 때문에 더 쉬울 것입니다. – lpapp

+0

@LaszloPapp Qt 5.2.0 (바이너리 패키지)과 함께 제공되는 QtSerialPort를 사용 중입니다. –

+1

오류 테스트 로직이 잘못되었습니다. 'if (! a &&! b &&! c)'대신'if (! a ||! b ||! c)'여야합니다. –

답변

4

누락 된 나는 QT를 사용하여 fOutX 및 fIutX을 설정하는 방법을 모르겠어요.

제 대답은 here입니다.

또한 Putty (또는 arduino-terminal) 구성 (패리티, 흐름 제어, 전송 속도)이 QSerialPort 구성과 동일하다는 것을 확신하십시오. 또한 터미널 예제 (QtSerialPort 예제에서)를 시도해 볼 수 있습니다. 대신 퍼티 (또는 귀하의 arduino - 터미널).

UPD :

당신은 추가 할 수 있습니다

setDataTerminalReady(true); 

setRequestToSend(true); 

포트의 개봉 후.

+0

OP가 의견에 쓴 내용을 읽지 않으셨습니까? OP는 이미 그가 예제를 시도했다 언급했다. 그런데 터미널 예제는 테스트를위한 최악의 예제입니다. 그것을 명심하십시오. 또한 응답이 다른 곳에서 만족 스럽다고 생각되면 복제 된 질문에 대해 충분한 평판을 얻으십시오. 응답은 중복을 처리하는 올바른 방법이 아닙니다. 중복 플래그 지정 시스템을 사용하려면 약간의 평판 만받습니다. – lpapp

+0

> OP가 이미 언급 했으므로 예제를 시도했습니다. 어디서? > 터미널 예제는 테스트를위한 최악의 예제입니다. Laszlo, 추측을 그만 두십시오. – user3074135

+0

이것은 "추측"이 아니라 간단한 예제를 작성한 공헌자와 팀을 구성하는 다른 사람과 같은 방식으로 생각하는 다소 "권위있는"대답입니다. 가장 간단한 명령 줄 예제를 작성하여 문제를 테스트하는 데 가장 생산성이 높습니다. 터미널 예제는 모든 위젯 세계 유산을 가진 왼쪽 위에 있습니다. 비대 해져서 변화가있을 때 지속적으로 테스트되지 않은 상태입니다. 아무도 정말 신경 쓰지 않습니다. 파이프 라인에는 QML 예제가 있지만 기다려야합니다. 그렇다면 cli 예제는 최소한의 것입니다. – lpapp