Autor
|
Tema: No funciona con la versión VS 202 (Leído 7,437 veces)
|
Meta
|
Buenas gente: Usando C++ nativo de la época del Visual Studio 2017 el programa funciona de maravilla. Probando ahora la versión del Visual Studio 2022, a pesar que es el mismo código, me da error por todas partes. El código es C++ nativo, nada de C++ del .net. Código C++:#include <iostream> #include <fstream> #include <Windows.h> #include "SerialClass.h" using namespace std; int main() { // Título de la ventana SetConsoleTitle("Control Led Arduino - Visual Studio C++ 2022"); // Puerto serie. Serial* Puerto = new Serial("COM4"); // Comandos para Arduino. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie. char Luz_OFF[] = "Luz_OFF"; char lectura[50] = "\0"; // Guardan datos de entrada del puerto. int opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola. while (Puerto->IsConnected()) { cout << endl; // Retorno. cout << "Introduzca la opcion deseada: " << endl; cout << "Pulse 1 para encender el Led, pulse 2 para apagar." << endl << endl; // Muestra texto en pantalla. cin >> opc; // Aquí introduces un número, el 1 o el 2. switch (opc) // Espera recibir un 1 o un 2. { case 1: // Encener luz. cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON". break; case 2: // Apagar luz. cout << "Enviando: " << Luz_OFF << endl; Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1); break; default: // Si haz pulsado otro número distinto del 1 y 2, muestra cout << "Puse del 1 al 2."; // este mensaje. } Sleep(500); int n = Puerto->ReadData(lectura, 49); // Recibe datos del puerto serie. if (n > 0) { lectura[n + 1] = '\0'; // Limpia de basura la variable. cout << "Recibido: " << lectura << endl; // Muestra en pantalla dato recibido. cout << "-------------------" << endl; } cin.ignore(256, '\n'); // Limpiar buffer del teclado. } }
Estoy siguiendo la guía del enlace de abajo a partir de la página 54. Ver tutorial. Saludos.
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Usando C++ nativo de la época del Visual Studio 2017 el programa funciona de maravilla. Probando ahora la versión del Visual Studio 2022, a pesar que es el mismo código, me da error por todas partes. ¿Errores al compilar o al ejecutar?
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
Meta
|
No deja compilar, muestra estos errores. Viene de la librería esta. SerialClass.cpp:#include "SerialClass.h" Serial::Serial(char *portName) { //We're not yet connected this->connected = false; //Try to connect to the given port throuh CreateFile this->hSerial = CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //Check if the connection was successfull if(this->hSerial==INVALID_HANDLE_VALUE) { //If not success full display an Error if(GetLastError()==ERROR_FILE_NOT_FOUND){ //Print Error if neccessary printf("ERROR: Handle was not attached. Reason: %s not available.\n", portName); } else { printf("ERROR!!!"); } } else { //If connected we try to set the comm parameters DCB dcbSerialParams = {0}; //Try to get the current if (!GetCommState(this->hSerial, &dcbSerialParams)) { //If impossible, show an error printf("failed to get current serial parameters!"); } else { //Define serial connection parameters for the arduino board dcbSerialParams.BaudRate=CBR_115200; dcbSerialParams.ByteSize=8; dcbSerialParams.StopBits=ONESTOPBIT; dcbSerialParams.Parity=NOPARITY; //Set the parameters and check for their proper application if(!SetCommState(hSerial, &dcbSerialParams)) { printf("ALERT: Could not set Serial Port parameters"); } else { //If everything went fine we're connected this->connected = true; //We wait 2s as the arduino board will be reseting Sleep(ARDUINO_WAIT_TIME); } } } } Serial::~Serial() { //Check if we are connected before trying to disconnect if(this->connected) { //We're no longer connected this->connected = false; //Close the serial handler CloseHandle(this->hSerial); } } int Serial::ReadData(char *buffer, unsigned int nbChar) { //Number of bytes we'll have read DWORD bytesRead; //Number of bytes we'll really ask to read unsigned int toRead; //Use the ClearCommError function to get status info on the Serial port ClearCommError(this->hSerial, &this->errors, &this->status); //Check if there is something to read if(this->status.cbInQue>0) { //If there is we check if there is enough data to read the required number //of characters, if not we'll read only the available characters to prevent //locking of the application. if(this->status.cbInQue>nbChar) { toRead = nbChar; } else { toRead = this->status.cbInQue; } //Try to read the require number of chars, and return the number of read bytes on success if(ReadFile(this->hSerial, buffer, toRead, &bytesRead, NULL) && bytesRead != 0) { return bytesRead; } } //If nothing has been read, or that an error was detected return -1 return -1; } bool Serial::WriteData(char *buffer, unsigned int nbChar) { DWORD bytesSend; //Try to write the buffer on the Serial port if(!WriteFile(this->hSerial, (void *)buffer, nbChar, &bytesSend, 0)) { //In case it don't work get comm error and return false ClearCommError(this->hSerial, &this->errors, &this->status); return false; } else return true; } bool Serial::IsConnected() { //Simply return the connection status return this->connected; }
Antes funcionaba todo. Ya no funciona ni modo 32 bits, ni 64 bits. Saludos.
|
|
|
En línea
|
|
|
|
|
Meta
|
Holaaaaaaa: Y la clase. Que deje de funcionar los programas que hacer en C++ nativo es lo que me pone de mala leche. En los .net estas cosas ocurren cuando pasan unos 10 años o más.
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Me compila perfectamente con esta version tanto en x86 como x64, sera un problema de tu proyecto o el codigo que se compila no es el que crees.
********************************************************************** ** Visual Studio 2022 Developer Command Prompt v17.4.4 ** Copyright (c) 2022 Microsoft Corporation **********************************************************************
cl Microsoft (R) C/C++ Optimizing Compiler Version 19.34.31937 for x86 Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
RayR
Desconectado
Mensajes: 243
|
Dado el tipo de error, lo que deberías postear es el contenido de SerialClass.h. Es casi seguro que ahí esté el problema. O cambia el parámetro de Serial::Serial a const char*, que de cualquier forma, independientemente de que compile o no, es lo correcto si quieres aceptar cadenas literales.
|
|
« Última modificación: 22 Enero 2023, 21:09 pm por RayR »
|
En línea
|
|
|
|
Meta
|
No me puedo creer que te funcione. Si te refieres a esto, da más errores aún. Serial::Serial(const char *portName)
Ya que hablas del proyecto... El .h es este. #ifndef SERIALCLASS_H_INCLUDED #define SERIALCLASS_H_INCLUDED #define ARDUINO_WAIT_TIME 2000 #include <windows.h> #include <stdio.h> #include <stdlib.h> class Serial { private: //Serial comm handler HANDLE hSerial; //Connection status bool connected; //Get various information about the connection COMSTAT status; //Keep track of last error DWORD errors; public: //Initialize Serial communication with the given COM port Serial(char *portName); //Close the connection //NOTA: for some reason you can't connect again before exiting //the program and running it again ~Serial(); //Read data in a buffer, if nbChar is greater than the //maximum number of bytes available, it will return only the //bytes available. The function return -1 when nothing could //be read, the number of bytes actually read. int ReadData(char *buffer, unsigned int nbChar); //Writes data from a buffer through the Serial connection //return true on success. bool WriteData(char *buffer, unsigned int nbChar); //Check if we are actually connected bool IsConnected(); }; #endif // SERIALCLASS_H_INCLUDED
|
|
« Última modificación: 22 Enero 2023, 22:23 pm por Meta »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
No me puedo creer que te funcione. Y yo no puedo creer que te de ese error teniendo solo un constructor ... hay algo que no corresponde con lo que decis/mostras. Crea un proyecto nuevo con los mismos archivos fuente QUE PEGASTE ACA EN EL FORO (no los que tenes en el disco) y proba de nuevo (eso es lo que hice). Si te refieres a esto, da más errores aún. Si lo cambias en el .h y el .cpp no da ningun error. Ya que hablas del proyecto... Eso no muestra nada, el proyecto podria tener por ejemplo (entiendo que no es el caso y por eso no mencione lo de const) esta opcion habilitada: https://learn.microsoft.com/en-us/cpp/build/reference/zc-strictstrings-disable-string-literal-type-conversion?view=msvc-160Hay cientos de opciones ... y una de ellas es el standard a usar ... ¿Elegiste ISO C++ 20 por casualidad? Si es asi hace lo que te dijo RayR. La proxima vez fijate en el output del compilador: Build started... 1>------ Build started: Project: arduino, Configuration: Debug Win32 ------ 1>SerialClass.cpp 1>meta.cpp 1>C:\src\arduino\meta.cpp(13,36): error C2665: 'Serial::Serial': no overloaded function could convert all the argument types 1>C:\src\arduino\SerialClass.h(41,1): message : could be 'Serial::Serial(const Serial &)' 1>C:\src\arduino\meta.cpp(13,36): message : 'Serial::Serial(const Serial &)': cannot convert argument 1 from 'const char [5]' to 'const Serial &' 1>C:\src\arduino\meta.cpp(13,37): message : Reason: cannot convert from 'const char [5]' to 'const Serial' 1>C:\src\arduino\meta.cpp(13,37): message : No constructor could take the source type, or constructor overload resolution was ambiguous 1>C:\src\arduino\SerialClass.h(24,9): message : or 'Serial::Serial(char *)' 1>C:\src\arduino\meta.cpp(13,36): message : 'Serial::Serial(char *)': cannot convert argument 1 from 'const char [5]' to 'char *' 1>C:\src\arduino\meta.cpp(13,37): message : Conversion from string literal loses const qualifier (see /Zc:strictStrings) 1>C:\src\arduino\meta.cpp(13,36): message : while trying to match the argument list '(const char [5])'
|
|
« Última modificación: 22 Enero 2023, 22:34 pm por Eternal Idol »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
Meta
|
Uso el que me viene predeterminado. Puedes seleccionar el 14, 17 y 20. Hasta ahí llegaron. No he tocado nada, me imagino que toco el que viene por defecto. En cuanto al const. Me imagino que será en la .h public: //Initialize Serial communication with the given COM port Serial(const char *portName);
Edito: Ya compila, por fin. Todo por no incluir el const en cpp y h. Muchísimas gracias a todos.
|
|
« Última modificación: 22 Enero 2023, 22:56 pm por Meta »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Manual Winaircrack Version 2.6, alguen tendra el manual o sabra como funciona?
Hacking Wireless
|
MigMar
|
3
|
11,675
|
27 Octubre 2010, 18:30 pm
por arjuma
|
|
|
Que Version de Sql Server 2005 funciona sin Problemas en Xp SP3
Bases de Datos
|
ositocaro
|
6
|
9,832
|
18 Agosto 2011, 06:58 am
por llAudioslavell
|
|
|
La última versión de Microsoft Security Essentials ya no funciona en Windows XP
Noticias
|
wolfbcn
|
3
|
2,758
|
9 Abril 2014, 19:48 pm
por DavisxDark
|
|
|
¿No te funciona Internet? La última versión de Avast puede tener la culpa
Noticias
|
wolfbcn
|
0
|
3,347
|
3 Septiembre 2018, 14:37 pm
por wolfbcn
|
|
|
Google Chrome version 69 no funciona en windows 10 ver 1803
« 1 2 »
Software
|
warcry.
|
19
|
5,926
|
17 Septiembre 2018, 14:26 pm
por EdePC
|
|