Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#571
Hola:

¿Crear un servidor?

No suena nada fácil. Me han sugerido que le saque información de la máquina como el MAC tanto PC como el use habitualmente, si la MAC no coincide, no se ejecutará.

https://msdn.microsoft.com/es-es/library/system.net.networkinformation.physicaladdress%28v=vs.110%29.aspx

Se compara con el MAC o dos MAC o los que tenga en esos PC con el programa, si no coincide, no se ejecuta o sale un mensaje que no corresponde al PC correspondiente, por poner un ejemplo.

Saludos.
#572
Hola:

Mejor hacer una parte del programa y el resto cuando paque todo.

Saludos.
#573
Gracias, no he querido hacerlo así por el poco tiempo que me dio.

Bueno.

Lo de retrasar el reloj si lo hace, lo detecta y se borra.

En cuanto a que no se borre el propio ejecutable cuando está corriendo. Se puede hacer que al ejecutarlo, crea otro ejecutable que no hace nada, solo una ventana invisible que cierra el ejecutable principal y luego borra, a parte de localiza el nombre.zip o nombre.rar si lo tienen lo más cerca posible.

El proceso sería así.

Dentro del programa principal lo que he hecho es crear otro ejecutable de prueba, en el cual cualquier antivirus me detecta, hay que tener cuidado.

El ejecutable puedo ponerlo llamado así nombre.dll. Al ejecutar el programa principal, crea copia dll (en realidad es un .exe que le cambié la extensión a .dll) como cebo y lo copia en lo más profundo del disco duro, donde le indiques.

Entrego estos dos programas.

Programa principal.exe
nombre.dll

El nombre.dll se copia en el disco duro donde quieras, se llamará como quieras pero con el nombre.exe.

Ese nuevo archivo copiado se ejecuta, comprueba hora y fecha, si se pasó el tiempo, se ejecuta cerrar la aplicación del programa principal y el borrado.



Espero que se entienda.
#574
Hola:

Si en el valor STATUS tiene estos valores en ASCII como en este caso llamado Hola.

Mejor pasar los 4 bytes en hex. ¿Se puede guardar en el enum esos 4 bytes en STATUS?

¿Cuál es la mejor fomra de hacerlo si existe la posibilidad?

Saludos.
#575
Hola:

He hecho ejecutables a clientes en el cual al final no paga y se van, eso si, por Internet.

Mi idea, se que hay muchas y mejores de las que voy a contar, el mio es simple, no de hacer pero si de explicar.

Si hoy es día 15-01-2016 hora 15:30. Le entrego un ejecutable hecho con Visual C#, el que sea, simple como el propio Form1 con un botón que al pulsar dice Hola mundo. Si el día 29-01-2016 a la misma hora o la que sea, desde que ejecutes la aplicación haga lo siguiente.

Que borre el propio ejecutable.

Antes de eso, hace otra cosa, por ejemplo, el ejectubale se lo envio en .zip o .rar. ¿Qué hacer?
Que se ponga a buscar primero en el área local para que borre dichos archivos llamado nombre.zip o nombre.rar. Si no lo encuentra, acto seguido borra el nombre.exe.

Parece complicado a la hora de programar. Me conformo que se borre el propio ejecutable.

Se puede sugerir mejores métodos, eso si, tampoco quiero complicarme la vida. 

¿Alguna sugerencia, ejemplos?

Saludos.
#576
Muy buena la explicación paso a paso. Excelente documentación.
Buen trabajo.
#577



Estoy indignado de una cosa con este proyecto de pruebas, se me bajaron las palancas de la casa y no me fucniona el relé K2, pesnaba que era el transistor, pero no, porque me enciende el Led rojo pero no activa el relé, rompí el diodo D2 para sustituirlo, no es el diodo, probé el relé directamente y funciona, solo el relé, claro. Así que tiene que ser el optoacoplador.

Por mucho que encienda el Led D2, opté por el relé K3 del INT 3, al rato de apagarse y encender la bombilla, se vuelve a bajar las palancas de mi casa, el magnetotérmico, no el digerencial, sin chispas o estampido de algo.



El optoacoplador le pasó lo mismo del INT 3 que al INT 2, se acabó máspruebas. Dentro de un rato pongo mis experiencias en mi blog sobre este proyecto. Deja ver si venden estos optoacopladores a parte en mi local habitual. En este mismo momento me quedan unos minutos para subir un vídeo qu esubiré aquí para que vean la idea del proyecto.

Dejo claro que aún no he puesto el motor, primero uan bombilla de 100 W a 230 VAC 50 Hz en España. A lo mejor de apagar y encender la bolbilla cada dos segundos, se bajaron las palancas, aunque no entiendo, porqué se fastidian los optoacopladores.

Estoy un poco desmotivado por tonterías como estas.

Se está trabajando con Arduino UNO r3.

Se hará poco a poco un buen código de lo que pretendo hacer, como ven, no se recomienda usar delay, como este es un ejemplo, es para hacer pruebas rápidas.

Esquema:


Código de Arduino:

// include el código de la librería.
#include

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);

unsigned long inicio, fin, transcurrido;
long Veces = 0;

int LuzFondo = 10; // Pin 10 para saber que es luz de fondo.

void setup()
{
   // Formato de pantalla.
  lcd.begin(16, 2);
  lcd.print("Foro ELECTRONICA");

  /*
  delay(2000);
  lcd.setCursor(0,0);
  lcd.print("Cambio de giro  ");
  lcd.setCursor(0,1);
  lcd.print("motor lavadora. ");
  delay(2000);
  lcd.clear(); // Limpia la pantalla.
  lcd.setCursor(0,0); // En el primer carácter y primera fila.
*/

  pinMode(3,OUTPUT);
  pinMode(2,OUTPUT);
  pinMode(LuzFondo,OUTPUT);

  digitalWrite(LuzFondo, HIGH);
  //digitalWrite(2, !LOW); // !LOW es HIGH.
  //digitalWrite(3, !LOW);
  Serial.begin(115200);
}

void loop()
{
  lcd.setCursor(0,1);
  lcd.print(inicio=millis()/15000); // 15 seg. antes de empezar.

     for (int i=0; i <= 10; i++)
   {
 
  digitalWrite(2, !LOW);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 OFF");
  digitalWrite(3, !LOW);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 OFF");
  delay(2000);

  digitalWrite(2, !HIGH);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 ON ");
  delay(2000);

  digitalWrite(2, !LOW);
  lcd.setCursor(3,1); // RL 1.
  lcd.print("1 OFF");
  delay(2000);

  digitalWrite(3, !HIGH);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 ON ");
  delay(2000);

  digitalWrite(3, !LOW);
  lcd.setCursor(9,1); // RL 2.
  lcd.print("2 OFF");
  delay(2000);

Veces++;
lcd.setCursor(0,1);
lcd.print(Veces);

  }

  delay(1000000);

     // Cuando llegue aquí, tiene que pararse el motor siempre.
     // No se que instrucciones darle para que lo haga.
}


Imágen:


Vídeo:
[youtube=640,360]https://www.youtube.com/watch?v=5zZ8jc8QUD0[/youtube]

A la próxima probaré una bombilla de bajo consumo haber si esta vez no se me bajan las palancas. A parte de eso, detallar un poco más con una tabla, paso por paso lo que tiene que hacer Arduino con los relés.

Sigue las actualizaciones en el proyecto principal de crear una placa de lavadora.

Feliz año nuevo.
#578
Si les pica la curiosidad, sigo con el proyecto de la lavadora.
http://electronica-pic.blogspot.com.es/2016/01/control-reles-con-una-bombilla.html

Feliz año nuevo.
#579
Hola:



Primera prueba y me costó coger el truco, he logrado encender el Led verde del DexDrive. Por algo se empieza. ;) Lo que he hecho, solo despierta el DeDrive mostrándolo conel Led verde encendido, está preparado para recibir comandos en el cual aún no lo he programado.

En el cuadro negro, muestra letras en verde los caracteres.

Por ahora, este es el código.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO.Ports; // No olvidar.
using System.Threading;

namespace DexPlorer
{
    public partial class Form1 : Form
    {
        public enum Dex_Comandos
        {
            INIT = 0x00, STATUS = 0x01, READ = 0x02, SEEK = 0x03, WRITE = 0x04, PAGE = 0x05, LIGHT = 0x07, MAGIC_HANDSHAKE = 0x27
        }

        public enum Dex_Respuestas
        {
            POUT = 0x20, ERROR = 0x21, NOCARD = 0x22, CARD = 0x23, CARD_NEW = 0x25, SEEK_OK = 0x27, WRITE_OK = 0x28, WRITE_SAME = 0x29, WAIT = 0x2A, ID = 0x40, DATA = 0x41
        }

        byte[] TRAMAS = { 0x10, 0x29, 0x23, 0xbe, 0x84, 0xe1, 0x6c, 0xd6, 0xae, 0x52, 0x90, 0x49, 0xf1, 0xf1, 0xbb, 0xe9, 0xeb };

        // Utilizaremos un string como buffer de recepción.
        string Recibidos;

        // Buffer para almacenar leer datos de la DexDrive.
        byte[] Leer_Datos = null;

        // Contiene una versión de firmware de un dispositivo detectado.
        string Firmware_Version = null;

        public Form1()
        {
            InitializeComponent();

            // Puerto abierto desde que arranca la aplicación.
            if (!serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Open();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }

            //Dexdrive won't respond if RTS is not toggled on/off
            serialPort1.RtsEnable = false;
            Thread.Sleep(300);
            serialPort1.RtsEnable = true;
            Thread.Sleep(300);

            //DTR line is used for additional power
            serialPort1.DtrEnable = true;

            // Comprobar si DexDrive está conectado al puerto.
            // La detección puede fallar primera o segunda vez, por lo que el comando es enviado 5 veces.
            for (int i = 0; i < 5; i++)
            {
                serialPort1.DiscardInBuffer();
                serialPort1.Write("XXXXX");
                Thread.Sleep(20);
            }

            // Compruebe cadena "IAI".
            Leer_Datos = Leer_datos_del_puerto();
            if ((Leer_Datos[0] != 0x49) || (Leer_Datos[1] != 0x41) || (Leer_Datos[2] != 0x49)) return;

            // Despierta DexDrive arriba (patear desde el modo POUT).
            //Envia_dato_al_puerto((byte)Dex_Comandos.INIT, new byte[] { 0x10, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0xAA, 0xBB, 0xCC, 0xDD }, 50);
            Envia_dato_al_puerto((byte)Dex_Comandos.INIT, new byte[] { 0x10, 0x29, 0x23, 0xbe, 0x84, 0xe1, 0x6c, 0xd6, 0xae, 0x52, 0x90, 0x49, 0xf1, 0xf1, 0xbb, 0xe9, 0xeb }, 50);

            // Compruebe cadena "PSX".
            Leer_Datos = Leer_datos_del_puerto();
            if ((Leer_Datos[5] != 0x50) || (Leer_Datos[6] != 0x53) || (Leer_Datos[7] != 0x58)) return; // "Dispositivo detectado no es un PS1 DexDrive."

            // Obtener la versión del firmware.
            Firmware_Version = (Leer_Datos[8] >> 6).ToString() + "." + ((Leer_Datos[8] >> 2) & 0xF).ToString() + (Leer_Datos[8] & 0x3).ToString();

            // Enviar señal de handshake magia 10 veces.
            for (int i = 0; i < 10; i++) Envia_dato_al_puerto((byte)Dex_Comandos.MAGIC_HANDSHAKE, null, 0);
            Thread.Sleep(50);

            // Enciende la luz de estado.
            Envia_dato_al_puerto((byte)Dex_Comandos.LIGHT, new byte[] { 1 }, 50);

            // Todo ha ido bien, DexDrive está listo para recibir comandos.
            //return null;

            Recibidos = Encoding.ASCII.GetString(Leer_Datos);

            // Recibidos = Encoding.Default.GetString(Leer_Datos);

            // Para ver lo que envía desde el DexDrive hacia esta interfaz de C#.
            // Asignar el valor de la trama al richTextBox.
            richTextBox1.Text = Recibidos;

            //    // Para ver lo que envía desde el DexDrive hacia esta interfaz de C#.
            //    // Asignar el valor de la trama al richTextBox.
            richTextBox1.Text = Recibidos;

            // Selecciona la posición final para leer los mensajes entrantes.
            richTextBox1.SelectionStart = richTextBox1.Text.Length;

            //serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
        }

        // Enviar comando DexDrive en el puerto COM se abrió con un retraso.
        private void Envia_dato_al_puerto(byte Comando, byte[] Dato, int Delay)
        {
            // Borrar todo en el búfer de entrada.
            serialPort1.DiscardInBuffer();

            // Cada comando debe comenzar con la cadena "IAI".
            serialPort1.Write("IAI" + (char)Comando);
            if (Dato != null) serialPort1.Write(Dato, 0, Dato.Length);

            // Espere un tiempo establecido (para la respuesta DexDrive).
            if (Delay > 0) Thread.Sleep(Delay);
        }

        // Captura la respuesta de un DexDrive.
        private byte[] Leer_datos_del_puerto()
        {
            // Buffer para la lectura de datos.
            byte[] Flujo_de_entrada = new byte[256];

            // Leer datos de DexDrive.
            if (serialPort1.BytesToRead != 0) serialPort1.Read(Flujo_de_entrada, 0, 256);

            return Flujo_de_entrada;
        }
    }
}


Sigo con ello intentar enviar comandos a ver si se deja, como formatear, leer, borrar, algo.

Felices fiesta.
#580
Hola:

Quiero saber cual es la forma de guardar datos fijos de un byte y otros de varios bytes. Estos datos son enviados al puerto serie. No se envían todos al mismo tiempo, sino cuando de la orden cuando quiera.

Por ejemplo, tengo datos guardados en enumeraciones como puedes ver abajo.

       
Código (csharp) [Seleccionar]
enum DexCommands { INIT = 0x00, STATUS = 0x01, READ = 0x02, WRITE = 0x04, LIGHT = 0x07, MAGIC_HANDSHAKE = 0x27 };



También se puede almacenar de esta forma en varibales const.

Código (csharp) [Seleccionar]
        const byte INIT = 0x00;
        const byte STATUS = 0x01;
        const byte READ = 0x02;
        const byte SEEK = 0x03;
        const byte WRITE = 0x04;
        const byte PAGE = 0x05;
        const byte LIGHT = 0x07;
        const byte MAGIC_HANDSHAKE = 0x27;


Otro ejemplo para tratar de byte para enviar por el puerto serie.

Código (csharp) [Seleccionar]
        byte[] INIT = { 0x00 };
        byte[] STATUS = { 0x01 };
        byte[] READ = { 0x02 };
        byte[] SEEK = { 0x03 };
        byte[] WRITE = { 0x04 };
        byte[] PAGE = { 0x05 };
        byte[] LIGHT = { 0x07 };
        byte[] MAGIC_HANDSHAKE = { 0x27 };



1. Quiero saber cuál forma es mejor y por qué.

Si quiero enviar el byte STATUS que es 0x01 puedo hacerlo así, si no estoy equivocado. Eso si, llamándole directamente 0x01.

Código (csharp) [Seleccionar]
byte[] mBuffer = new byte[1];
    mBuffer[0] = 0x01;
    serialPort1.Write(mBuffer, 0, mBuffer.Length);


Ya que lo tengo guardado en enum, lo llamaré así:

Código (csharp) [Seleccionar]
            serialPort1.Open(); // Abrir puerto.
            serialPort1.Write((byte)Dex_Comandos.STATUS);
            serialPort1.Close(); // Cerrar puerto.


2. Este código no funciona. ¿Cómo es la mejor manera para usar datos, variables o enumeraciones en este caso?

Teniendo esta trama de byte de forma fija, por ejemmplo, quiero mandar el comandos STATUS que es de un solo byte por el puerto serie. ¿Cómo lo hago?

3. Tengo esta trama de byte abajo. ¿Cómo puedo enviarla?

       
Código (csharp) [Seleccionar]
byte[] TRAMAS = { 0x10, 0x29, 0x23, 0xbe, 0x84, 0xe1, 0x6c, 0xd6, 0xae, 0x52, 0x90, 0x49, 0xf1, 0xf1, 0xbb, 0xe9, 0xeb };

Felices fiestas 2015.