Мы используем FTDI последовательный порт CHIP в нашем оборудовании. Теперь у нас есть рабочий код в Linux, и мы перешли на Windows 7. У нас странные проблемы.
Эта проблема:
Мы не можем записать данные в последовательный порт без запуска другого консольного приложения, которое делает это:
serial.setPortName("COM3");
if (serial.open(QIODevice::ReadWrite)) {
bool success = serial.setBaudRate(QSerialPort::Baud9600) &
serial.setStopBits(QSerialPort::OneStop) &
serial.setDataBits(QSerialPort::Data8) &
serial.setParity(QSerialPort::NoParity) &
serial.setFlowControl(QSerialPort::NoFlowControl);
qDebug() << "Connected to usb device: " << (success ? "OK" : "FAIL");
while(true) {
if(serial.waitForReadyRead(-1)) {
QByteArray out = serial.readAll();
for(int i=0; i< out.length(); i++) {
qDebug() << (int) out[i];
}
}
}
serial.close();
Так что это просто цикл с прочитать все. Аппаратные средства ничего не отправляют, поэтому чтение — это просто бесконечный цикл. После закрытия и запуска нашей программы записи она работает правильно.
char* input;
input = new char[size+3];
QByteArray bytearr;
for(int i=0;i<size+2;i++) {
input[i] = (char) package[i];
bytearr.append((unsigned char) package[i]);
}QString serialPortName = "COM3";
QSerialPort serialPort;
serialPort.setPortName(serialPortName);
serialPort.open(QIODevice::ReadWrite);
serialPort.write(bytearr);
serialPort.flush();
serialPort.close();
После запуска read все работает, но без read all ничего не получится. Что мы делаем не так?
Благодарю.
У нас была похожая проблема в нашем приложении с платой с чипом FTDI. Мы попытались записать байты со скоростью 19200 бод / с, хотя в реальном времени они имели скорость около 1200 бод / с (с помощью осциллографа). Проблема заключалась в закрытии последовательного порта сразу после записи байта. Помогло только ожидание с использованием QThread :: msleep (5) перед закрытием порта. Кажется, что устройство сбрасывается или что-то во время закрытой операции, и последние байты отправляются с ложной скоростью передачи и другими параметрами.
Я обнаружил, что SW последовательного порта QT требует, чтобы вы работали с событиями QT.
Помещение qApp-> processEvents () в цикл до того, как чтение заставило меня работать.
(QT 4.8.5 в Windows-7)