2017-11-28 2 views
0

QSerialPort를 사용하여 직렬 장치에 쓸 수있는 도구를 작성했습니다. 내가 다음과 같은 오류 메시지가 표시 될 때까지 일정 시간 동안 실행 :Qt5 - ASSERT : "bytesTransferred == writeChunkBuffer.size()"

ASSERT "bytesTransferred == writeChunkBuffer.size()"파일 qserialport_win.cpp, 라인 (511)

내 보내는 기능에 다음과 같습니다

/** 
* @brief Send text to device 
* @param text 
* @return Success/Fail 
*/ 
bool Serial::send(QString text) 
{ 
    if (connectionStatus && qsp.isWritable()) { 
     QByteArray buffer = text.toLatin1(); 

     if (buffer.size() != qsp.write(buffer)) 
      qDebug() << "Send does not work"; 

     qsp.flush(); 
     msleep(15); 

     return true; 
    } else { 
     return false; 
    } 
} 

내가 알고있는 경우

이 제대로 나는 장치에 플러시 (약 20 문자 임) 텍스트를 작성, 15ms의 기다렸다가 나중에 그것을 반복합니다. 내가 왜이 메시지를 받는지 이해가 안되니?

// 편집 :

얼마 후 문제가 무엇인지 알아 냈습니다. 나는 15ms를 기다리는 이유를 언급하는 것을 잊었다. 그것은 문서의 일부로서 데이터를 보낸 후 기다리는 것입니다. 데이터 전송과 관련된 가장 큰 문제점은 QSerialPort를 별도의 스레드에서 실행한다는 것입니다. 그것을 사용함으로써 나는 곤경에 빠진다. 나는 그것을 MainThread로 옮기고 Qt에 의한 신호 슬롯 디자인을 사용한다.

답변

0

API를 모른 채 당신이 사용하고 또는 그것이 어떻게 작동하는지하는 write() 방법은 모든 데이터가 제공되는 전송해야하는 이유에는 고유 이유는 없다 가 쓰기 수를 반환 특히 : 명확한 신호가되지 않을 수 한 번에 모든 것을 전송하십시오.

유일한 문제는 단정 자체입니다. 데이터가 기록 될 때까지 루프을 사용해야하며, 모두 단일 쓰기로 쓰여 있다고 가정하지 마십시오. 당신이 보내고있는 장치를 압도하려는 헛된 시도로 글을 쓰는 사이에 잠을 자면 안됩니다. 이것은 문자 그대로 단지 시간 낭비입니다.