west329 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 (изменено) · Жалоба Никак не пойму почему не хочет собиратся проэкт, уже перерыл весь 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 собирается нормально ? Изменено 4 сентября, 2008 пользователем west329_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба Попробуйте hPort=CreateFile((LPCWSTR)"COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vanner 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба Нужно добавить приставку L к строковым литералам (L"COM2") или в настройках проекта отключить использование Unicode. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 (изменено) · Жалоба Помогло. Приведу весь код, но компорт не открывается а вылетает на первой функции 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 не нашол. Изменено 4 сентября, 2008 пользователем west329_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jorikdima 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба (LPCWSTR)sysdev[0], замените на (LPCWSTR)sysdev, Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 (изменено) · Жалоба (LPCWSTR)sysdev[0], замените на (LPCWSTR)sysdev, пробовал всёравно вылетает. Исходник и ЕХЕ тут. П.С. обясните мне как обращатся тогда к другим портам КОМ2 или КОМ3 прикрепил ещё этот же проекто токо собранный в DEV C++ 1.rar e_x_e.rar Hello.rar Изменено 4 сентября, 2008 пользователем west329_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба Есть два пути. Первый, правильный (ИМХО) - перейти на 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 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба Есть два пути. Первый, правильный (ИМХО) - перейти на 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. Нашол в настройках, но отключать не хочет функция не активна ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба Нашол в настройках... Неа, не нашОл, грамотей :) То что я указал надо искать в меню Project, там последнйи пункт - Properties. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 (изменено) · Жалоба Неа, не нашОл, грамотей :) То что я указал надо искать в меню 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. Изменено 4 сентября, 2008 пользователем west329_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба Двоеточие из имени порта удалить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба Двоеточие из имени порта удалить. пробовал: (LPCWSTR)"COM1:", (LPCWSTR)"COM1", (LPCWSTR)sysdev[0], (LPCWSTR)sysdev. ответ ERROR :laughing: 1.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NullPointer 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 (изменено) · Жалоба Ну и это безобразие: (LPCWSTR)sysdev[0] не оставить без внимания, ибо этот тупой typecast был изначально ошибкой. Он не нужен. Com-порты обычно я открываю так: "\\\\.\\COM1". Изменено 4 сентября, 2008 пользователем SysRq Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба пробовал: (LPCWSTR)"COM1:", (LPCWSTR)"COM1", (LPCWSTR)sysdev[0], (LPCWSTR)sysdev. ответ ERROR :laughing: нашон на просторах нета. hCom = CreateFile( TEXT("COM1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); заработало ? незнаю только почему :08: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 4 сентября, 2008 Опубликовано 4 сентября, 2008 · Жалоба 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться