2016-09-01 4 views
0

직렬 포트를 사용하여 하드웨어 장치와 통신하고 싶습니다. 문서에 따르면 다음과 같은 메시지가 표시됩니다. enter image description hereQSerialPort를 사용하여 직렬 포트를 통해 데이터를 전송하십시오.

통신에 QSerialPort을 사용하고 싶습니다. 여기에 내가 시도하고있는 작업은 다음과 같습니다

QByteArray bytes; 
bytes.append((char) 0x6E); 
bytes.append((char) 0x00); 
bytes.append((char) 0x00); 
bytes.append((char) 0x0B); 
bytes.append((char) 0x00); 
bytes.append((char) 0x00); 
bytes.append((char) 0x2F); 
bytes.append((char) 0x4A); 
bytes.append((char) 0x00); 
bytes.append((char) 0x00); 
bytes.append((char) 0x00); 

int transmitted = qSerialPort->write(bytes); //returns no error, transmitted = 11 

QSerialPort 인은 다음과 같이 구성합니다

qSerialPort = new QSerialPort(path); 
qSerialPort->setBaudRate(QSerialPort::Baud9600); 
qSerialPort->setDataBits(QSerialPort::Data8); 
qSerialPort->setParity(QSerialPort::NoParity); 
qSerialPort->setStopBits(QSerialPort::OneStop); 
qSerialPort->setFlowControl(QSerialPort::NoFlowControl); 
qSerialPort->open(QIODevice::ReadWrite); 

나는 HW 장치에서 올바른 응답을하지 않습니다. QSerialPort을 사용하여 16 진수 값을 직렬 포트로 보내는데 간과 한 점이 있습니까? 감사.

+0

예. 완전한 테스트 케이스 게시를 간과했다. 즉, 기기에서 데이터를 올바르게 읽었 음을 알리는 질문은 없습니다. –

+0

사이드 노트 : 패킷을 문자열로 쓸 수 있습니다 :'const char data [] = "\ x6E \ x00 \ x00 ... \ x00"; transmit = qSerialPort-> write (data, sizeof (data) -1); ' –

+0

패킷의 내용이 잘못되었을 가능성이 있습니다. 데이터 섹션으로 "\ x00"을 넣었지만 해당 섹션에 대한 적절한 CRC를 계산하지 않았습니다. 사용할 CRC에 대한 프로토콜 설명서를 참조한 다음 패킷을 보내기 전에 CRC를 계산하십시오. –

답변

0

"설정"작업을 수행하기 전에 포트를 열어야합니다. 예를 들어, baudRate 용의 Qt documantation에서 :

참고 : 설정 포트를 열기 전에 설정되면, 실제 일련 포트 설정이 QSerialPort에서 자동으로 수행된다 : open() 메서드 직후 그 포트 열기가 성공합니다.

코드 예제 :

QList<QSerialPortInfo> portsInfo = QSerialPortInfo::availablePorts(); 
foreach(const QSerialPortInfo& portInfo, portsInfo){ 
    if (portInfo.portName().trimmed().toUpper() != /*your port name*/) 
     continue; 
    _port = new QSerialPort(portInfo, this); 
    if (!_port->open(QIODevice::ReadWrite)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     delete _port; 
     _port = nullptr; 
    } 
    if (!_port->setBaudRate(/*your baudRate*/, /*your direction)*/){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
    if (!_port->setParity(/*your parity*/)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
    if (!_port->setDataBits(/*your dataBits*/)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
    if (!_port->setStopBits(/*your stopBits */)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
    if (!_port->setFlowControl(/* your flowControl*/)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
} 
+0

팁 주셔서 감사. 불행히도 포트를 여는 것은 효과가 없습니다. – Androidicus

+0

HW 장치를 변경하려고 했습니까? 또는 테스트 장치로 rs232 발신자를 사용할 수도 있습니다. 이 같은 것 : https://sourceforge.net/projects/rs232msgsender/ –

관련 문제