экстранное поведение последовательного порта с использованием Qt

0

Я выполняю приложение с QT для связи моего компьютера с 8-битным микроконтроллером через rs-232. Я использую библиотеку QtSerialPort, и связь работает нормально, но каждый раз, когда я пишу что-то с ПК на микро, и я получаю ответ, я должен закрыть и открыть последовательный порт, или я не могу продолжать общаться. конфигурация: 10500 бит/с, 8 бит, 1 остановка, отсутствие контроля четности, отсутствие контроля потока.

Код, используемый для конфигурации и лекции/записи порта, следующий:

bool DriverS::configure(int port, int baudRate)
{
    if(port!=22)
        return false;

     serialPort->setPortName("COM22");

 if (serialPort->open(QIODevice::ReadWrite)==true){

        if (!serialPort->setBaudRate(baudRate)) {
            return false ;
        }

        if (!serialPort->setDataBits(QSerialPort::Data8)) {
            return false ;
        }

        if (!serialPort->setParity(QSerialPort::NoParity)) {
            return false;
        }

        if (!serialPort->setStopBits(QSerialPort::OneStop)) {
            return false;
        }

        if (!serialPort->setFlowControl(QSerialPort::NoFlowControl)){
            return false;
            }
    };

    return true;
}



bool DriverS::read(QByteArray & rxData, int * size)
{

    Sleep(200); 
    *size = 0;
    if (serialPort->waitForReadyRead(TIMEOUT_SERIAL)) {
        rxData = serialPort->readAll();
        *size = rxData.size() ;

    if (!this->checkCRC(rxData))
        {
            qDebug()<< "Rx Checksum Error";
            return false;
        }

    return true;
    }
    qDebug()<< "Rx Timeout";
    return false;
}

bool DriverS::write(QByteArray txData)
{

    unsigned int chk = 0;
    int ret ;

    for(int i = 0;i<txData.size();i++)
    {
        chk+=txData.at(i);
    }

    txData.append(chk);
    ret = serialPort->write(txData);
    return (txData.size()==ret);

}
  • 0
    Можете ли вы показать свой код, который несет эту проблему? Вы проверили errorString? Что это сказал? К сожалению, невозможно сказать вам, что было бы неправильно, основываясь на этой информации. Кроме того, вы просто используете последовательный порт dsub-9, или есть какой-то USB-последовательный ключ? Какая операционная система работает на вашем компьютере? Какую версию Qt вы используете? Какая версия QtSerialPort? Это 32 или 64 бит? Работает ли он только с 8-битным микроконтроллером? Какой это микроконтроллер?
  • 0
    Кристина, ты решил проблему?
Показать ещё 5 комментариев
Теги:
qt
serial-port
microcontroller
qtserialport

2 ответа

0

Я исправил свои две проблемы (несмотря на то, что я не уверен в методах).

Для проблемы num 1 (открывать и закрывать порт каждый раз, когда я хотел общаться), я просто добавил waitFoBytesWritten() в свой метод записи.

Для моей проблемы номер 2 (я только смог работать с портом22), я изменил конфигурацию, и теперь я сначала обнаруживаю, что порты доступны с помощью доступных портов(), чтобы заставить порт, который я хочу использовать. Теперь я могу подключить свое устройство к любому свободному порту, и он работает.

  • 1
    Пожалуйста, отредактируйте этот ответ, чтобы просто ответить на этот вопрос. Затем задайте новый вопрос о новой проблеме. Вот как все должно быть сделано в SO, строгом QA-формате, а не на некоторых дискуссионных форумах или в онлайн-чатах.
0

Я просто оказался в такой же ситуации. Я застрял в обычной рутине. Попробуйте открыть порт в небуферизованном режиме.

port-> open (QIODevice :: ReadWrite | QIODevice :: Без буферизации)

Это было только на одном компьютере, я нашел это, мне никогда не приходилось делать это раньше, но это могло бы вытащить тебя из ямы.

  • 0
    Спасибо, но у меня это не сработало
  • 0
    Не могли бы вы опубликовать код для точной настройки и открытия порта?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню