2013-06-06 2 views
2

Я пытаюсь использовать класс QSerialPort для чтения и записи в последовательный порт. Прямо сейчас я использую виртуальные команды, реализованные драйвером eltima. Я могу успешно послать байт, как это:QSerialPort чтение значного значения

QSerialPortInfo info = QSerialPortInfo("COM30"); 

QSerialPort serial; 

serial.setPort(info); 

serial.setBaudRate(57600); 

serial.open(QIODevice::ReadWrite); 

char arr[] = {0xAA, 0xBB, 0xCC, 0xDD}; 

serial.write(arr, 4); 

Я пытаюсь чтения, как это (я хочу прочитать только один байт, этот код вызывается по таймеру, если данные готовы для чтения):

virtual uint8_t getByte(void) 
{ 
    char arr[2] = {0}; 

    int8_t err = qPort.read(arr, 1); 

    DEBUG_ASSERT(err != -1); 

    if(! isNewByte()) 
    { 
     onReceiveFinished(); 
    } 

    return arr[0]; 
} 

Если я отправляю на виртуальный порт (то есть в свою программу) любое значение менее 128, я получаю его правильно (как показывает отладчик). Однако, если я попытаюсь отправить 128 или больше, я получаю значение 128 o_o (если я отправлю 153 - я получаю 25. Не -25 или 103). Это кажется чем-то действительно странным для меня. Может ли кто-нибудь увидеть, где ошибка?

ответ

0

Моя ошибка была действительно глупой. QSerialPort по умолчанию имеет 7 баз данных (что кажется не очень практичным, на самом деле), поэтому каждый полученный байт отключил MSB (например, вычитание 128).

По-прежнему, как ни странно, отправка работала нормально.

0

Нет. Вы неправильно делаете setBaudRate(). Это необходимо сделать после открытия порта.