Я новичок в программировании. Пожалуйста, потерпите меня. Я узнал из примера терминала Qt и попытался отправить необработанные шестнадцатеричные байты. Сначала я мог без проблем отправить 0x57, 0x04, 0x02. Нравится
void MainWindow::writeData(const QByteArray &data)
{
serial->write(data);
}
void MainWindow::myFunction1()
{
QByteArray ba("\x57\x04\x02");
writeData(ba);
}
Затем, по мере продвижения, мне нужно было отправить несколько выбираемых строк данных с 0x00. Приведенный выше код не отправлял \ x00 и стирал что-либо за ним, поэтому я использовал fromRawData, чтобы остановить преобразование специального символа.
void MainWindow::myFunction2(int option)
{
QByteArray hexString;
switch (option){
case 1:
hexString.append(QByteArray::fromRawData("\x00\x01\x02",3);
break;
case 2:
hexString.append(QByteArray::fromRawData("\xFF\x00",2));
break;
}
writeData(hexString);
}
Приведенный выше код подходил для отправки обеих постоянных строк символов. Но теперь я столкнулся с реальной проблемой, мне нужно отправить непостоянные шестнадцатеричные байты. Я создал массив беззнаковых символов для хранения моей шестнадцатеричной строки и позже изменил его значение. Затем преобразовал его в массив const char. Но это отливка дала неправильный размер.
void MainWindow::myFunction3(int option)
{
unsigned char Diff[] = {0x45, 0x00, 0x01, 0x02};
...
Diff[2] = 0x08; // runtime change
const char *cDiff = (const char*)Diff; // casting
int size_Diff = sizeof(Diff); // qDebug shows 4
int size_cDiff = sizeof(cDiff); // qDebug shows 8 !!???
QByteArray hexString;
switch (option){
case 1:
hexString.append(QByteArray::fromRawData("\x00\x01\x02",3);
break;
case 2:
hexString.append(QByteArray::fromRawData("\xFF\x00",2));
break;
case 3:
hexString = QByteArray::fromRawData(cDiff, sizeof(cDiff));
break;
}
writeData(hexString);
}
В случае 3 я получил 0x45 0x00, 0x08, 0x02, 0x01, 0x00, 0x00, 0x00, всего 8 байт на моей плате MCU! Затем я изменил размер Diff [] на 10 и снова sizeof (cDiff) = 8. Последние два байта были обрезаны.
Мой первый вопрос: есть ли лучший способ отправить unsigned char с различным размером массива и диапазоном значений от 0x00 до 0xFF, определенным во время выполнения с помощью QSerialPort? Второй вопрос: почему приведенный пример дал мне неправильный размер массива?
Большое спасибо за внимание к этому DLIU