Отправка сообщения wchar_t через последовательный порт

проблема, с которой я столкнулся, заключается в том, что при отправке сообщения L «Вторая строка» моему приложению для чтения последовательного порта я получаю «Вторую строку», но при замазке я получил «Вторую строку», я думаю, это потому, что wchar_t является закодирован в 16-битном формате, поэтому между каждой буквой стоит 00. Но до сих пор не знаю, как это исправить, я новичок во всех этих вещах, поэтому это немного сбивает с толку.

Я не уверен, нужно ли мне устанавливать размер байта равным 16 в моем приложении?

Я хочу отправить это LPCWSTR LogpszMessage, потому что я отправляю некоторые сообщения журнала из приложения. Это еще один код, работающий здесь, должен работать там.

конфигурация шпатлевки составляет 8 бит, и это то, что я отправляю;

#include "stdafx.h"

#include <windows.h>
#include <stdio.h>

typedef _Null_terminated_ CONST WCHAR *LPCWSTR, *PCWSTR;

int main()
{

    LPCWSTR LogpszMessage = L"Second line";
    char bytes_to_send[] = "test1 y test2";

    // Declare variables and structures
    HANDLE hSerial;
    DCB dcbSerialParams = { 0 };
    COMMTIMEOUTS timeouts = { 0 };

    // Open the highest available serial port number
    fprintf(stderr, "Opening serial port...");
    hSerial = CreateFile(
        L"\\\\.\\COM24", GENERIC_READ | GENERIC_WRITE, 0, NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hSerial == INVALID_HANDLE_VALUE)
    {
        fprintf(stderr, "Error\n");
        return 1;
    }
    else fprintf(stderr, "OK\n");

    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (GetCommState(hSerial, &dcbSerialParams) == 0)
    {
        fprintf(stderr, "Error getting device state\n");
        CloseHandle(hSerial);
        return 1;
    }

    dcbSerialParams.BaudRate = CBR_115200;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
    if (SetCommState(hSerial, &dcbSerialParams) == 0)
    {
        fprintf(stderr, "Error setting device parameters\n");
        CloseHandle(hSerial);
        return 1;
    }

    // Set COM port timeout settings
    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier = 10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;
    if (SetCommTimeouts(hSerial, &timeouts) == 0)
    {
        fprintf(stderr, "Error setting timeouts\n");
        CloseHandle(hSerial);
        return 1;
    }

    // Send specified text (remaining command line arguments)
    DWORD bytes_written, total_bytes_written = 0;
    fprintf(stderr, "Sending bytes...");
    /*if (!WriteFile(hSerial, bytes_to_send, sizeof(bytes_to_send), &bytes_written, NULL))
    {
        fprintf(stderr, "Error\n");
        CloseHandle(hSerial);
        return 1;
    }*/

    if (!WriteFile(hSerial, LogpszMessage, wcslen(LogpszMessage) * sizeof(wchar_t), &bytes_written, NULL))
    {
        fprintf(stderr, "Error\n");
        CloseHandle(hSerial);
        return 1;
    }
    fprintf(stderr, "%d bytes written\n", bytes_written);

    // Close serial port
    fprintf(stderr, "Closing serial port...");
    if (CloseHandle(hSerial) == 0)
    {
        fprintf(stderr, "Error\n");
        return 1;
    }
    fprintf(stderr, "OK\n");
    getchar();

    // exit normally
    return 0;
}

Заранее спасибо.


person COCerv    schedule 14.10.2017    source источник
comment
Putty просто печатает отображаемый текст для байтов, которые он получает, и не знает, что вы отправляете utf16. Двоичный ноль особенный, для него нет эквивалентного символа. Таким образом, вы просто не можете его увидеть, и он просто выглядит так, как будто он работает правильно. Проверьте этот вопрос на superuser.com. Если вы не хотите, чтобы эти двоичные нули отображались в файле журнала, вам нужно забегать вперед, выбрав кодировку для передаваемого текста. Рассмотрим WideCharToMultiByte () с CP_ACP или CP_UTF8.   -  person Hans Passant    schedule 14.10.2017
comment
Спасибо, @HansPassantM, позвольте мне прочитать о WideCharToMultiByte () и попробовать. Я полностью понимаю ваш ответ.   -  person COCerv    schedule 14.10.2017


Ответы (1)


Я не мог сделать это с WideCharToMultiByte (), выдает ошибку при попытке использовать LPCWSTR LogpszMessage, поэтому я выполнил работу с wcstombs_s, следуя документации Microsoft, и это сработало, теперь при чтении COM-порта нет пробелов, вызванных 00 из 16-битных символов.

Спасибо, Ханс Пассан!

person COCerv    schedule 16.10.2017