Проблема кодировки символов с помощью QextSerialPort (Qt / C ++) - PullRequest
1 голос
/ 30 марта 2011

Я разрабатываю программу Qt / C ++ в QtCreator, которая читает и записывает данные с / на последовательный порт, используя QextSerialPort.Моя программа отправляет команды контроллеру Rhino Mark IV и должна прочитать ответ этих команд (на случай, если они произведут какой-либо ответ).Моя платформа разработки и развертывания - Windows XP Professional.

Когда Mark IV отправляет ответ на команду, и моя программа считывает этот ответ из буфера последовательного порта, данные не кодируются должным образом;моя программа, кажется, не получает простые данные ASCII.Например, , когда Mark IV отправляет ASCII "0" (десятичное 48), за которым следует возврат каретки (десятичное 13), мой буфер (char *) получает -80 и 13. Символы не кодируются должным образом, новозврат каретки действительно. Я попытался использовать read (char *data, qint64 maxSize) и readAll ().

Я наблюдал за трафиком последовательного порта с использованием двух мониторов, которые интерпретируют данные ASCII и отображаютсоответствующие символы и данные, отправленные обоими способами, кажутся правильно закодированными (они на самом деле отображаются правильно).Учитывая, что QByteArray не интерпретирует какую-либо кодировку символов и что я пытался использовать как read (char *data, qint64 maxSize), так и readAll (), я отказался от того, что проблема может быть вызвана Qt.Однако я не уверен, что проблема вызвана QextSerialPort, потому что моя программа отправляет (записывает) данные должным образом, но не читает правильные байты.

Я также пытался вручную общаться с контроллером Mark IVиспользуя HyperTerminal, и связь также происходит правильно.Я установил соединение с помощью HyperTerminal со следующими параметрами:

  • Скорость передачи: 9600
  • Биты данных: 8
  • Биты четности: 0
  • Стоповые биты: 1
  • Управление потоком: аппаратное обеспечение

Моя программа настраивает последовательный порт, используя те же параметры.HyperTerminal работает, моя программа - нет.

Я начал использовать QextSerialPort 1.1 с qextserialport.sourceforge.net , а затем попытался использовать последний исходный код из QextSerialPort в коде Google и проблема остается.

Что вызывает неправильную кодировку символов?

Что мне нужно сделать, чтобы решить эту проблему?

Ответы [ 2 ]

1 голос
/ 30 марта 2011

48 против -80 пахнет как подписанный символ против несоответствия без знака мне. Попробуйте с явным unsigned char * вместо char *.

0 голосов
/ 13 апреля 2011

Наконец, я понял, что неправильно настраивал последовательный порт, , как предложил судья Мейгарден .Я не нашел эту информацию в руководстве к устройству, но в руководстве к программному продукту, разработанному для этого устройства.

Правильный способ настройки последовательного порта для подключения к контроллеру Mark IV - это установить

  • Скорость передачи: 9600
  • Биты данных: 7
  • Четность: четная
  • Стоповые биты: 2 бита
  • Управление потоком: Оборудование

Однако мне все еще интересно, почему HyperTerminal правильно отображал символы даже при неправильной конфигурации.

...