|
|
  |
Ошибка компиляции, Visual C++ 2008 |
|
|
|
Sep 4 2008, 08:42
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Никак не пойму почему не хочет собиратся проэкт, уже перерыл весь 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 собирается нормально ?
Сообщение отредактировал west329_ - Sep 4 2008, 08:42
|
|
|
|
|
Sep 4 2008, 08:57
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 23-10-05
Пользователь №: 10 016

|
Нужно добавить приставку L к строковым литералам (L"COM2") или в настройках проекта отключить использование Unicode.
|
|
|
|
|
Sep 4 2008, 10:43
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Помогло. Приведу весь код, но компорт не открывается а вылетает на первой функции 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 не нашол.
Сообщение отредактировал west329_ - Sep 4 2008, 10:46
|
|
|
|
|
Sep 4 2008, 10:53
|

тут может быть ваша реклама
    
Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280

|
Код (LPCWSTR)sysdev[0], замените на Код (LPCWSTR)sysdev,
|
|
|
|
|
Sep 4 2008, 11:08
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(jorikdima @ Sep 4 2008, 13:53)  Код (LPCWSTR)sysdev[0], замените на Код (LPCWSTR)sysdev, пробовал всёравно вылетает. Исходник и ЕХЕ тут. П.С. обясните мне как обращатся тогда к другим портам КОМ2 или КОМ3 прикрепил ещё этот же проекто токо собранный в DEV C++
Сообщение отредактировал west329_ - Sep 4 2008, 11:18
Прикрепленные файлы
1.rar ( 623.05 килобайт )
Кол-во скачиваний: 37
e_x_e.rar ( 10.28 килобайт )
Кол-во скачиваний: 41
Hello.rar ( 105.92 килобайт )
Кол-во скачиваний: 39
|
|
|
|
|
Sep 4 2008, 11:30
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Есть два пути. Первый, правильный (ИМХО) - перейти на 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.
|
|
|
|
|
Sep 4 2008, 11:50
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(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. Нашол в настройках, но отключать не хочет функция не активна ?
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 4 2008, 12:47
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(SysRq @ Sep 4 2008, 15:22)  Неа, не нашОл, грамотей  То что я указал надо искать в меню 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; } Ту ткните носом или в нос  . проще уже некуда Юнико выключеню программа запускается и пишет Serial port open ERROR.
Сообщение отредактировал west329_ - Sep 4 2008, 12:48
|
|
|
|
|
Sep 4 2008, 13:11
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(sergeeff @ Sep 4 2008, 16:00)  Двоеточие из имени порта удалить. пробовал: (LPCWSTR)"COM1:", (LPCWSTR)"COM1", (LPCWSTR)sysdev[0], (LPCWSTR)sysdev. ответ ERROR
Прикрепленные файлы
1.rar ( 9.59 килобайт )
Кол-во скачиваний: 35
|
|
|
|
|
Sep 4 2008, 13:17
|

Чайник, 1 литр
   
Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168

|
Ну и это безобразие: Код (LPCWSTR)sysdev[0] не оставить без внимания, ибо этот тупой typecast был изначально ошибкой. Он не нужен. Com-порты обычно я открываю так: "\\\\.\\COM1".
Сообщение отредактировал SysRq - Sep 4 2008, 13:18
|
|
|
|
|
Sep 4 2008, 13:31
|

Местный
  
Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423

|
Цитата(west329_ @ Sep 4 2008, 16:11)  пробовал: (LPCWSTR)"COM1:", (LPCWSTR)"COM1", (LPCWSTR)sysdev[0], (LPCWSTR)sysdev. ответ ERROR  нашон на просторах нета. Код hCom = CreateFile( TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); заработало ? незнаю только почему
|
|
|
|
|
Sep 4 2008, 13:58
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
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; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|