Последовательный порт QT не работает для Cedrat SPC45 - PullRequest
0 голосов
/ 24 сентября 2019

В настоящее время я работаю над реализацией программы на C ++ с графическим интерфейсом для управления небольшим двигателем, подключенным к контроллеру SPC 45 от Bedrat , и для этой задачи я использую QT 5.13 в Windows.

Теперь мне нужно связаться с этим контроллером, поэтому я использовал QSerialPort для этого.Тем не менее, я не получаю никакой оптической обратной связи от контроллера при записи в порт, т.е. не мигает светодиод приемника.Когда я использую, например, YAT для Windows, чтобы написать что-то, светодиод мигает, так же, как когда я использую pyserial для Python в Ubuntu.

Это код.Сначала я нахожу правильный порт с помощью vendorID 1027, затем устанавливаю несколько значений, прежде чем открывать его.Первые четыре параметра, безусловно, верны, но следующие - просто предположения, потому что этот контроллер на самом деле не задокументирован.

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <iostream>

using namespace std;

int main() {

    // find the port with the attached microcontroller
    QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts();
    quint8 id = 0;

    for (auto it = ports.begin(); it != ports.end(); it++) {
        cout << "Vendor Identifier = " << it->vendorIdentifier()/*.toStdString()*/ << endl;
        cout << "Port Identifier   = " << it->portName().toStdString() << endl;

        if (it->vendorIdentifier() == 1027) {
            break;
        }
        id++;
    }

    // open the designated port with specification
    QSerialPort spc45_port(ports.takeAt(id));

    spc45_port.setBaudRate(QSerialPort::Baud57600);
    spc45_port.setDataBits(QSerialPort::Data8);
    spc45_port.setParity(QSerialPort::NoParity);
    spc45_port.setStopBits(QSerialPort::OneStop);
    spc45_port.setFlowControl(QSerialPort::HardwareControl);

    if (!spc45_port.open(QIODevice::ReadWrite)) {
        cout << "error. could not open or set settings successfully." << endl;
        return 1;
    }
    spc45_port.setDataTerminalReady(true);
    QByteArray data("V2.43E");
    cout << "bytes written: " << spc45_port.write(data) << endl;
    spc45_port.close();

Вывод, который производит программа, следующий:

Vendor Identifier = 0
Port Identifier   = COM1
Vendor Identifier = 1027
Port Identifier   = COM5
QObject::startTimer: Timers can only be used with threads started with QThread
bytes written: 6

Таким образом, программа сообщает о записи 6 байтов, хотя я не уверен, почему выводится 5-я строка.Однако визуальной обратной связи от светодиода приемника нет.Кто-нибудь знает, в чем может быть проблема в моем коде, или это нормальное поведение?В настоящее время я не могу подключить мотор к устройству, так как оно еще не готово, поэтому у меня нет другого способа сказать, работает ли этот способ связи.Спасибо!

...