Я следую этому руководству для последовательной связи в окнах (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
Вы используете Юникод. Вам нужно использовать 'wchar_t'. Вы можете прочитать [Поддержка Unicode] (https://msdn.microsoft.com/en-us/library/2dax2h36.aspx?f=255&MSPPError=-2147217396) –
Возможный дубликат [C++ visual studio error C2664] (http: //stackoverflow.com/questions/36333429/c-visual-studio-error-c2664) –