2016-04-20 7 views
0

Я следую этому руководству для последовательной связи в окнах (http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2503/CSerial--A-C-Class-for-Serial-Communications.htm). Я получаю следующие ошибки, код довольно датирован, поэтому я не уверен, что это проблема с версией. Я использую Visual Studio 2015 для работы на Windows, 10.ошибка C2664: 'int wsprintfW (LPWSTR, LPCWSTR, ...)': не может преобразовать аргумент 1 из 'char [15]' в 'LPWSTR'

Serial.cpp: // Serial.cpp

#include "stdafx.h" 

CSerial::CSerial() 
{ 

    memset(&m_OverlappedRead, 0, sizeof(OVERLAPPED)); 
    memset(&m_OverlappedWrite, 0, sizeof(OVERLAPPED)); 
    m_hIDComDev = NULL; 
    m_bOpened = FALSE; 

} 

CSerial::~CSerial() 
{ 

    Close(); 

} 

BOOL CSerial::Open(int nPort, int nBaud) 
{ 

    if(m_bOpened) return(TRUE); 

    char szPort[15]; 
    char szComParams[50]; 
    DCB dcb; 

    wsprintf(szPort, "COM%d", nPort); 
    m_hIDComDev = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); 
    if(m_hIDComDev == NULL) return(FALSE); 

    memset(&m_OverlappedRead, 0, sizeof(OVERLAPPED)); 
    memset(&m_OverlappedWrite, 0, sizeof(OVERLAPPED)); 

    COMMTIMEOUTS CommTimeOuts; 
    CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF; 
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0; 
    CommTimeOuts.ReadTotalTimeoutConstant = 0; 
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0; 
    CommTimeOuts.WriteTotalTimeoutConstant = 5000; 
    SetCommTimeouts(m_hIDComDev, &CommTimeOuts); 

    wsprintf(szComParams, "COM%d:%d,n,8,1", nPort, nBaud); 

    m_OverlappedRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 
    m_OverlappedWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 

    dcb.DCBlength = sizeof(DCB); 
    GetCommState(m_hIDComDev, &dcb); 
    dcb.BaudRate = nBaud; 
    dcb.ByteSize = 8; 
    unsigned char ucSet; 
    ucSet = (unsigned char) ((FC_RTSCTS & FC_DTRDSR) != 0); 
    ucSet = (unsigned char) ((FC_RTSCTS & FC_RTSCTS) != 0); 
    ucSet = (unsigned char) ((FC_RTSCTS & FC_XONXOFF) != 0); 
    if(!SetCommState(m_hIDComDev, &dcb) || 
     !SetupComm(m_hIDComDev, 10000, 10000) || 
     m_OverlappedRead.hEvent == NULL || 
     m_OverlappedWrite.hEvent == NULL){ 
     DWORD dwError = GetLastError(); 
     if(m_OverlappedRead.hEvent != NULL) CloseHandle(m_OverlappedRead.hEvent); 
     if(m_OverlappedWrite.hEvent != NULL) CloseHandle(m_OverlappedWrite.hEvent); 
     CloseHandle(m_hIDComDev); 
     return(FALSE); 
     } 

    m_bOpened = TRUE; 

    return(m_bOpened); 

} 

BOOL CSerial::Close(void) 
{ 

    if(!m_bOpened || m_hIDComDev == NULL) return(TRUE); 

    if(m_OverlappedRead.hEvent != NULL) CloseHandle(m_OverlappedRead.hEvent); 
    if(m_OverlappedWrite.hEvent != NULL) CloseHandle(m_OverlappedWrite.hEvent); 
    CloseHandle(m_hIDComDev); 
    m_bOpened = FALSE; 
    m_hIDComDev = NULL; 

    return(TRUE); 

} 

BOOL CSerial::WriteCommByte(unsigned char ucByte) 
{ 
    BOOL bWriteStat; 
    DWORD dwBytesWritten; 

    bWriteStat = WriteFile(m_hIDComDev, (LPSTR) &ucByte, 1, &dwBytesWritten, &m_OverlappedWrite); 
    if(!bWriteStat && (GetLastError() == ERROR_IO_PENDING)){ 
     if(WaitForSingleObject(m_OverlappedWrite.hEvent, 1000)) dwBytesWritten = 0; 
     else{ 
      GetOverlappedResult(m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE); 
      m_OverlappedWrite.Offset += dwBytesWritten; 
      } 
     } 

    return(TRUE); 

} 

int CSerial::SendData(const char *buffer, int size) 
{ 

    if(!m_bOpened || m_hIDComDev == NULL) return(0); 

    DWORD dwBytesWritten = 0; 
    int i; 
    for(i=0; i<size; i++){ 
     WriteCommByte(buffer[i]); 
     dwBytesWritten++; 
     } 

    return((int) dwBytesWritten); 

} 

int CSerial::ReadDataWaiting(void) 
{ 

    if(!m_bOpened || m_hIDComDev == NULL) return(0); 

    DWORD dwErrorFlags; 
    COMSTAT ComStat; 

    ClearCommError(m_hIDComDev, &dwErrorFlags, &ComStat); 

    return((int) ComStat.cbInQue); 

} 

int CSerial::ReadData(void *buffer, int limit) 
{ 

    if(!m_bOpened || m_hIDComDev == NULL) return(0); 

    BOOL bReadStatus; 
    DWORD dwBytesRead, dwErrorFlags; 
    COMSTAT ComStat; 

    ClearCommError(m_hIDComDev, &dwErrorFlags, &ComStat); 
    if(!ComStat.cbInQue) return(0); 

    dwBytesRead = (DWORD) ComStat.cbInQue; 
    if(limit < (int) dwBytesRead) dwBytesRead = (DWORD) limit; 

    bReadStatus = ReadFile(m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead); 
    if(!bReadStatus){ 
     if(GetLastError() == ERROR_IO_PENDING){ 
      WaitForSingleObject(m_OverlappedRead.hEvent, 2000); 
      return((int) dwBytesRead); 
      } 
     return(0); 
     } 

    return((int) dwBytesRead); 

} 

Ошибки:

1>c:\..\consoleapplication2\serial.cpp(31): error C2664: 'int wsprintfW(LPWSTR,LPCWSTR,...)': cannot convert argument 1 from 'char [15]' to 'LPWSTR' 
1>c:\..\consoleapplication2\serial.cpp(31): note: Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>c:\..\consoleapplication2\serial.cpp(32): error C2664: 'HANDLE CreateFileW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE)': cannot convert argument 1 from 'char [15]' to 'LPCWSTR' 
1>c:\..\consoleapplication2\serial.cpp(32): note: Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>c:\..\consoleapplication2\serial.cpp(46): error C2664: 'int wsprintfW(LPWSTR,LPCWSTR,...)': cannot convert argument 1 from 'char [50]' to 'LPWSTR' 
1>c:\..\consoleapplication2\serial.cpp(46): note: Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
+1

Вы используете Юникод. Вам нужно использовать 'wchar_t'. Вы можете прочитать [Поддержка Unicode] (https://msdn.microsoft.com/en-us/library/2dax2h36.aspx?f=255&MSPPError=-2147217396) –

+0

Возможный дубликат [C++ visual studio error C2664] (http: //stackoverflow.com/questions/36333429/c-visual-studio-error-c2664) –

ответ

3

Ваше сообщение об ошибке:

error C2664: 'HANDLE CreateFileW(LPCWS 
          ^~~~~ 

указывает, что вы используете сборку UNICODE (W указывает, что макрос CreateFile задает d с функцией CreateFileW), так что вы должны использовать широкий буквальную здесь (и в следующем wsprintf):

wsprintf(szPort, L"COM%d", nPort); 
       ^~~~~~ ! 

и wchar_t массив:

wchar_t szPort[15]; // or under winapi you would use WCHAR 
wchar_t szComParams[50]; 
Смежные вопросы