Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка компиляции
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
west329_
Никак не пойму почему не хочет собиратся проэкт, уже перерыл весь MSDN.
Код
// 1.cpp : Defines the entry point for the console application.
//

#include <stdafx.h>
#include "targetver.h"

#include <iostream>

#include <windows.h>

//#include <winbase.h>

//-----------------------
using namespace std;  // for <iostream>

char quit;

static char* sysdev[] = {
    "COM1:",
    "COM2:",
    "COM3:",
    "COM4:",
    NULL
};



HANDLE  hPort;
//------------------------


//SerialPort system_port;


int _tmain(int argc, _TCHAR* argv[])
{

    
    

//------------------------------------------------------------------------------  
      // Open the serial port.//lpszPortName

    
    hPort=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);



    
    cout << "configurator V.0.0.1a" << endl;


    quit = '\0';
    
    while(quit != 'q')
    {
        cin >> quit;
    }

    return 0;
}



ошибка
Цитата
------ Build started: Project: 1, Configuration: Debug Win32 ------
Compiling...
1.cpp
e:\documents and settings\kornilov\мои документы\visual studio 2008\projects\mainwork\1\1\1.cpp(56) : error C2664: 'CreateFileW' : cannot convert parameter 1 from 'const char [5]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Build log was saved at "file://e:\Documents and Settings\KoRniloV\Мои документы\Visual Studio 2008\Projects\mainWORK\1\1\Debug\BuildLog.htm"
1 - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========



что самое интересное пробовал тотже самое на другом компиляторе DEV-C++4.9 собирается нормально ?
jorikdima
Попробуйте

Код
hPort=CreateFile((LPCWSTR)"COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
vanner
Нужно добавить приставку L к строковым литералам (L"COM2") или в настройках проекта отключить использование Unicode.
west329_
Помогло.
Приведу весь код, но компорт не открывается а вылетает на первой функции CreateFile.
Может опять таки есть какието нюансы ?

Опятьже этот код работает номально под DEV-C++, аж до последней функции ReadFile, с ней я ещё не разобрался а так вкинул для опытов, но мне больше нравится visual выт и пытаюсь на него перейти.



Код
// 1.cpp : Defines the entry point for the console application.
//

#include <stdafx.h>
#include "targetver.h"

#include <iostream>

#include <windows.h>

//#include <winbase.h>

//-----------------------
using namespace std;  // for <iostream>


char quit;

static char* sysdev[] = {
    "COM1:",
    "COM2:",
    "COM3:",
    "COM4:",
    NULL
};



HANDLE  hCom;
DCB ComDCM;
//------------------------


//SerialPort system_port;


int _tmain(int argc, _TCHAR* argv[])
{

//CreateFile
//------------------------------------------------------------------------------  
         hCom = CreateFile(     (LPCWSTR)sysdev[0],
                                GENERIC_READ | GENERIC_WRITE,
                                0,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                NULL);
  
   if(hCom==INVALID_HANDLE_VALUE)
    {
    cout << "Serial port open ERROR" << endl;
    CloseHandle(hCom);
    return !0;
   }
   else
    cout << "Serial port open OK" << endl;
    
    //MsgBox(NULL,"Нормально открыт последовательный порт","Error",MB_OK);
  
  
        memset(&ComDCM,0,sizeof(ComDCM));
        
        ComDCM.DCBlength = sizeof(DCB);






//GetCommState        
//------------------------------------------------------------------------------        
        if ( !GetCommState(hCom, &ComDCM) )
           {
            cout << "Serial port read param ERROR" << endl;                        
            CloseHandle(hCom);
            return !0;
           }
        else
            cout << "Serial port read param OK" << endl;        
        
    //cout << "--- GetCommState ---" << endl;
    //cout << "BaudRate" << &ComDCM.BaudRate << endl;
    //cout << &ComDCM.ByteSize << endl;
    //cout << &ComDCM.Parity << endl;        
        
        
        
        
        
        
        
        
        ComDCM.BaudRate = DWORD(115200);
        ComDCM.ByteSize = 8;
        ComDCM.Parity = NOPARITY;
        ComDCM.StopBits = ONESTOPBIT;
        ComDCM.fAbortOnError = TRUE;
        ComDCM.fDtrControl = DTR_CONTROL_DISABLE;
        ComDCM.fRtsControl = RTS_CONTROL_DISABLE;
        ComDCM.fBinary = TRUE;
        ComDCM.fParity = FALSE;
        ComDCM.fInX = ComDCM.fOutX = FALSE;
        ComDCM.XonChar = 0;
        ComDCM.XoffChar = char(0xff);
        ComDCM.fErrorChar = FALSE;
        ComDCM.fNull = TRUE;       //игнорирование 0 байтов
        //ComDCM.fNull = FALSE;
        ComDCM.fOutxCtsFlow = FALSE;
        ComDCM.fOutxDsrFlow = FALSE;
        ComDCM.XonLim = 128;
        ComDCM.XoffLim = 128;





//SetCommState  
//------------------------------------------------------------------------------  
   if( !SetCommState(hCom, &ComDCM) )
   {
       cout << "Serial port write param ERROR" << endl;                        
       CloseHandle(hCom);
       return !0;
   }
   else
       cout << "Serial port write param OK" << endl;





//GetCommTimeouts  
//------------------------------------------------------------------------------

    COMMTIMEOUTS cto = {0};
                                                                                
      
    if( !GetCommTimeouts(hCom, &cto) )      
        {
         cout << "Serial port read timeouts ERROR" << endl;                        
         CloseHandle(hCom);
         return !0;
        }
    else
       cout << "Serial port read timeouts OK" << endl;
    
    
    //cout << "--- cto ---" << endl;
    //cout << &cto.ReadIntervalTimeout << endl;
    //cout << &cto.ReadTotalTimeoutConstant << endl;
    //cout << &cto.ReadTotalTimeoutMultiplier << endl;
    
    
    cto.ReadIntervalTimeout         = 10;
    cto.ReadTotalTimeoutConstant    = 10;
    cto.ReadTotalTimeoutMultiplier  = 10;


//SetCommTimeouts
//------------------------------------------------------------------------------
    if( !SetCommTimeouts(hCom, &cto) )
        {
         cout << "Serial port write timeouts ERROR" << endl;                        
         CloseHandle(hCom);
         return !0;
        }
    else
       cout << "Serial port write timeouts OK" << endl;
  
//WriteFile  
//------------------------------------------------------------------------------  

   char buffer[30];
   memset(buffer,0,sizeof(buffer));
   strcpy(buffer,"SAVE TO COM1");
  
   //test
    cout << &buffer[0] << endl;
   //
  
  
   DWORD sentBytes;

   if( !WriteFile(hCom, buffer, sizeof(buffer), &sentBytes, NULL) )      
      {
       cout << "Serial port write byte ERROR" << endl;                        
       CloseHandle(hCom);
       return !0;
   }
   else
       cout << "Serial port write byte OK" << endl;





//------------------------------------------------------------------------------
   char rxBUF[30];
   DWORD reciveBytes;

  while (reciveBytes > 0)
  ReadFile(hCom, &rxBUF, 1, &reciveBytes, NULL);


   //WriteFile(hCom, rxBUF, sizeof(rxBUF), &sentBytes, NULL);





//------------------------------------------------------------------------------

   char quit;  

    quit = '\0';
    while (quit != 'q')
    {    
        
  
        cout << "Press q to quit " << endl;
        cin >> quit;
    }
  
  
    CloseHandle(hCom);
    return 0;
}


п.с. to vanner не подскажите где точно это выключить, в настройках ничего похожего на Unicode не нашол.
jorikdima
Код
(LPCWSTR)sysdev[0],


замените на
Код
(LPCWSTR)sysdev,
west329_
Цитата(jorikdima @ Sep 4 2008, 13:53) *
Код
(LPCWSTR)sysdev[0],


замените на
Код
(LPCWSTR)sysdev,


пробовал всёравно вылетает.

Исходник и ЕХЕ тут.

П.С. обясните мне как обращатся тогда к другим портам КОМ2 или КОМ3
прикрепил ещё этот же проекто токо собранный в DEV C++
SysRq
Есть два пути.

Первый, правильный (ИМХО) - перейти на unicode. Для этого:
1. Вместо char использовать _TCHAR
Код
_TCHAR buff[_MAX_PATH]

2. Все строковые константы объявлять с помощью макроса _T()
Код
_T("LPT write mode: %d")

3. Использовать IO функции с поддержкой unicode
Код
_tprintf()

Либо писать сразу только для unicode, забив на попытки оставить обратную совместимость (сразу использовать wchar_t, wprintf, L"text string" и т.д.).

Второй, "чтобы заработало" - отключить unicode. Для этого:
1. В опциях проекта, в Configuration Properties, справа в разделе Project Defaults выставить Character Set как Multi-byte.
west329_
Цитата(SysRq @ Sep 4 2008, 14:30) *
Есть два пути.

Первый, правильный (ИМХО) - перейти на unicode. Для этого:
1. Вместо char использовать _TCHAR
Код
_TCHAR buff[_MAX_PATH]

2. Все строковые константы объявлять с помощью макроса _T()
Код
_T("LPT write mode: %d")

3. Использовать IO функции с поддержкой unicode
Код
_tprintf()

Либо писать сразу только для unicode, забив на попытки оставить обратную совместимость (сразу использовать wchar_t, wprintf, L"text string" и т.д.).

Второй, "чтобы заработало" - отключить unicode. Для этого:
1. В опциях проекта, в Configuration Properties, справа в разделе Project Defaults выставить Character Set как Multi-byte.



Нашол в настройках, но отключать не хочет функция не активна ?
SysRq
Цитата(west329_ @ Sep 4 2008, 15:50) *
Нашол в настройках...

Неа, не нашОл, грамотей smile.gif То что я указал надо искать в меню Project, там последнйи пункт - Properties.
west329_
Цитата(SysRq @ Sep 4 2008, 15:22) *
Неа, не нашОл, грамотей smile.gif То что я указал надо искать в меню Project, там последнйи пункт - Properties.


Извеняйте с визуалом работаю неделю. Нашол выключил.
Порубал весь проект до следующего вида.

Код
#include "stdafx.h"
#include <windows.h>
#include <iostream>

using namespace std;  // for <iostream>


static char* sysdev[] = {
    "COM1:",
    "COM2:",
    "COM3:",
    "COM4:",
    NULL
};

HANDLE  hCom;

int _tmain(int argc, _TCHAR* argv[])
{
    hCom = CreateFile(     (LPCWSTR)sysdev[0],
                                GENERIC_READ | GENERIC_WRITE,
                                0,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                NULL);

    if(hCom==INVALID_HANDLE_VALUE)
        {
            cout << "Serial port open ERROR" << endl;
            //CloseHandle(hCom);
            //return !0;
        }
   else
            cout << "Serial port open OK" << endl;

while(1);


    return 0;
}


Ту ткните носом или в нос smile.gif. проще уже некуда Юнико выключеню программа запускается и пишет Serial port open ERROR. help.gif help.gif help.gif
sergeeff
Двоеточие из имени порта удалить.
west329_
Цитата(sergeeff @ Sep 4 2008, 16:00) *
Двоеточие из имени порта удалить.


пробовал:

(LPCWSTR)"COM1:",
(LPCWSTR)"COM1",
(LPCWSTR)sysdev[0],
(LPCWSTR)sysdev.

ответ ERROR laughing.gif
SysRq
Ну и это безобразие:
Код
(LPCWSTR)sysdev[0]
не оставить без внимания, ибо этот тупой typecast был изначально ошибкой. Он не нужен.

Com-порты обычно я открываю так: "\\\\.\\COM1".
west329_
Цитата(west329_ @ Sep 4 2008, 16:11) *
пробовал:

(LPCWSTR)"COM1:",
(LPCWSTR)"COM1",
(LPCWSTR)sysdev[0],
(LPCWSTR)sysdev.

ответ ERROR laughing.gif




нашон на просторах нета.
Код
    hCom = CreateFile(     TEXT("COM1:"),
                                GENERIC_READ | GENERIC_WRITE,
                                0,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                NULL);


заработало ? незнаю только почему 08.gif
sergeeff
static wchar_t *sysdev[] = {
L"COM1:",
L"COM2:",
L"COM3:",
L"COM4:",
NULL
};



HANDLE hCom;
//---------
int _tmain(int argc, _TCHAR* argv[])
{
//------------------------------------------------------------------------------
// Open the serial port.//lpszPortName

hCom = CreateFile( sysdev[0],
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if(hCom==INVALID_HANDLE_VALUE)
{
cout << "Serial port open ERROR" << endl;
//CloseHandle(hCom);
//return !0;
}
else
cout << "Serial port open OK" << endl;

while(1);


return 0;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.