2017-10-14 3 views
0

문제는 "L"전자 메일을받는 응용 프로그램에 "L"두 번째 줄의 메시지를 보낼 때 퍼티에서 "Second 라인 "나는 wchar_t가 16 비트로 코드화되어 있기 때문에 나는 모든 문자 사이에 00을 가지고 있다고 생각한다. 그러나 아직도 내가 어떻게 고칠 수 있는지 모르겠다. 나는이 모든 것들을 처음 접하기 때문에 혼란 스럽다.직렬 포트를 통해 wchar_t 메시지 보내기

내 응용 프로그램에서 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; 
} 

미리 감사드립니다.

+1

퍼티는 수신 할 수있는 바이트에 대한 표시 가능한 텍스트를 단순히 인쇄하고 utf16을 보내고 있는지 전혀 모릅니다. 이진수 0은 특수한 문자이므로 해당 문자가 없습니다. 그래서 당신은 단순히 그것을 볼 수 없으며 단지 올바르게 작동하는 것처럼 보입니다. [이 superuser.com 질문] (https://superuser.com/questions/150202/display-hex-input-for-serial)을 확인하십시오. 이진 0을 로그 파일에 표시하지 않으려면 전송하는 텍스트의 인코딩을 선택해야합니다. WideCharToMultiByte()를 CP_ACP 또는 CP_UTF8과 함께 고려하십시오. –

+0

@HansPassantM에 대해 고맙습니다 WideCharToMultiByte()에 대해 읽어보고 사용해보십시오. 나는 너의 대답을 완전히 이해한다. – COCerv

답변

0

WideCharToMultiByte()를 사용하여 LPCWSTR LogpszMessage를 사용하려고 할 때 오류가 발생하여 Microsoft 문서에 따라 wcstombs_s으로 작업 했으므로 이제는 COM 포트를 읽을 때 공백이 생기지 않습니다. 00의 16 비트 문자.

감사합니다. Hans Passant!

관련 문제