2014-01-06 8 views
1

У меня есть этот простой код, который используют QtSerialPort:Qt отправить полный байт на последовательный порт

char foo[] = {130,50,'\0'}; 
serial->write(foo); 

В результате на мой серийник {2, 50}. Я думаю, что самое большое число, которое я могу отправить, составляет 128 (char переходит от -128 до 128). Где способ отправки номера от 0 до 255? Я пытаюсь использовать unsigned char, но метод «write» не работает с ним. Аналогичная проблема возникает и с QByteArray.

Thankyou все.

ответ

1

Интерфейс QIODevice имеет символ по умолчанию для отправки, который может быть зависимым от компилятора. Подробнее см. В документации.

qint64 QIODevice :: записи (Const символ * данные, qint64 MaxSize)

Пишет в большинстве MaxSize байт данных из данных в устройстве. Возвращает количество байтов, которые были написаны на самом деле, или -1, если произошла ошибка.

Однако вы не должны беспокоиться о том, правильно ли вы берете данные с другой стороны. вы все равно можете отправить более 128 значений через подпись, но они будут отображаться как отрицательные значения, например, 0xFF будет равным -1.

Если вы берете ту же логику в обратном порядке на принимающей стороне, проблем с ней не должно быть.

Однако, похоже, это не относится к вашей проблеме, потому что вы не получаете соответствующее отрицательное значение для 130, но вы получаете его нарезанный на 7 бит. Убедитесь, что соединение имеет 8 бит данных.

Вы можете установить, что явно после открытия порта с этим кодом:

QSerialPort serialPort; 
QString serialPortName = "foo"; 
serialPort.setPortName(serialPortName); 

if (!serialPort.open(QIODevice::WriteOnly)) { 
    standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; 
    return 1; 
} 

if (!serialPort.setDataBits(QSerialPort::Data8)) { 
    standardOutput << QObject::tr("Failed to set 8 data bits for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; 
    return 1; 
} 

// Other setup code here 

char foo[] = {130,50,'\0'}; 
serialPort.write(foo); 
+0

В этом цитируемом фрагменте не указано, должны ли данные быть подписаны или нет, он полагается на способ компиляции вместо 'char', который может быть подписан или без знака. –

+0

@JoachimPileborg: хорошо поймать, исправлено, спасибо. – lpapp

+0

Мои ошибки в том, что я предположил, что серийный номер по умолчанию 8 бит. Теперь он работает нормально. – Elia

1

Убедитесь, что вы установили серийный порт для отправки 8 бит, используя QSerialPort::DataBits

Тот факт, что «130» идет как «2», означает, что самый старший бит усекается.

Смежные вопросы