Отправка байтов с использованием QTcpSocket

У меня есть встроенное устройство, с которым я пытаюсь связаться через TCP по беспроводному соединению. Ниже представлена ​​структура данных, которые ожидает устройство:

char[] = { 0x55, 0x55, 0x55, 0x55 //header block
    //start data here
    0x01, 0x00, 0x00, 0x00 //example data
    //end data block
    0xAA, 0xAA, 0xAA, 0xAA //footer
    };

Я пытаюсь использовать QTcpSocket для записи этих данных. QTcpSocket позволит мне записывать данные char или QByteArray, но когда я пытаюсь сохранить эти данные в любом из этих форматов, происходит сбой. Единственный способ, которым я могу успешно сохранить данные, - это массив беззнаковых символов.

Пример того, что я имею в виду:

char message[12] = {
    0x55, 0x55, 0x55, 0x55,
    0x01, 0x00, 0x00, 0x00,
    0xAA, 0xAA, 0xAA, 0xAA};

Однако этот блок сообщений дает мне ошибку

C4309: 'initializing' : truncation of constant value.

И при печати этих данных получается так:

U U U U
r

где буква r больше похожа на край квадрата, чем на настоящую букву

Эта конкретная проблема устраняется путем изменения массива с char на unsigned char.

unsigned char message[12] = {
    0x55, 0x55, 0x55, 0x55,
    0x01, 0x00, 0x00, 0x00,
    0xAA, 0xAA, 0xAA, 0xAA};

который при печати затем выходит с данными:

85 85 85 85
1 0 0 0
170 170 170 170

Это соответствует формату, который ожидает устройство, с которым я разговариваю. Однако, если я помещу данные в этот формат, QTcpSocket это не понравится, и он ответит:

C2664: 'qint64 QIODevice::write(const QByteArray &)': cannot convert argument 1
from 'unsigned char[20]' to 'const char *'

Есть ли способ отправить данные, которые я хочу, с помощью QTcpSocket, или мне нужно выяснить, как написать это сообщение с помощью сокетов Windows?


person user3830784    schedule 15.01.2015    source источник


Ответы (1)


Вы можете просто привести к char * :

qint64 ret = socket.write((char *)message, 12);
person Nejat    schedule 15.01.2015
comment
Есть ли аналогичное простое преобразование для чтения данных в том же формате из QTcpSocket? (например, я отправил сообщение в примере, устройство отправляет его обратно, чтобы убедиться, что оно получено правильно, как мне прочитать его, чтобы узнать, что это то же самое, что я отправил?) - person user3830784; 15.01.2015
comment
Аналогичным образом вы можете использовать socket.read((char *)message, 12);, что может быть сделано в слоте, подключенном к сигналу readyRead QTcpSocket. См. пример использования QTcpSocket асинхронно: обработка во время работы waitforconnected"> stackoverflow.com/questions/27787130/ - person Nejat; 15.01.2015