Crear una Interfaz con Visual Studio para el DexDrive

Hola:

Mi objetivo en un principio controlar un dispositivo que usa todos pines que se ha nombrado, un lector y grabador y se puede hacer copias de seguridad antiguo de Memory Card de la PlayStation 1. En resumen, guarda datos de la memoria al PC como copia de seguridad. Este aparato se llama De:LOL:rive.

dexdrive.jpg

dexdrive-para-playstation1-643-MEC9194332_4777-O.jpg


Antes que nada, por lo que he leído en Internet, funciona a 38400 baudios.

Su programa original que hay dos versiones, la más usada el 2, desde que ejecutes o abras la aplicación, se enciende el Led verde, antes se pone naranja comprobando la Memory Card. El programa se llama DeXplorer.

Lo abrí y comprobñe los cables.
dexdrive-front.jpg

dexdrive-back.jpg



Antes que nada, llevo años pensando en hacerme una interfaz propia con Visual Studio .net para controlar este dispositivo, como no tengo analizador lógico, lo he dejado. Lo compraré en el futuro cuando tenga €€€€€€.

Tiene un transformador a parte, por mucho que lo alimentes, nunca encenderá el Led verde, ni naranja que significa enviar y recibir datos.

Deduzco que los RTS, CTS, DTR, etc tiene que ver bastante, nunca los he usado en Visual Studio, nadie en la época encontré que sepan cosas de estas, solo lo típico de siempre, con el Rx, Tx y GND.

Está esos modos en modo desactivado en Visual Studio el componente serialPort1 para los que los conozcan.
retretyry-1576631.png


No sabía que se podía hacer puente para engañar. Antes de hacer puente entre ello, debo estar más informado y mejor. Así que me voy a bucar más por www.google.es estos temas que antes no me daba inforamción para entenderlo, a lo mejor hay más y sin saberlo hoy en día, ya no estamos en el 2003.

Como el dispositivo solo funciona desde que inices su interfaz original, por ahora no puedo hacer nada, ya que no conozco sus comandos internos. Eso si, la interfaz DeXplorer 2.x sabe cuando está conectado al puerto COM1, cuando tiene la Memory Card insertada, si la quitas o la pones dicha Memory Card lo indica en tiempo real en su interfaz. Por lo que se ve, detecta todo. Lo que me sorprende, que en su interior del De:LOL:rive, no incluye algún tipo de microcontrolador.

Cuando acabe mi propia interfaz para conocerlo a fondo, me meto con Arduino que controle, con LCD incluido y tarjeta micro-SD, esto más adelante claro, primero lo primero.

Les dejo una captura de la versión DeXplorer 2.0.920.
retretyry-1576757.png


Por lo que cuentan, hacer puente físicamente como esto.
retretyry-1576747.png

http://www.moxa.com/resource_file/509820091121333.pdf


Aquí parece ser que puedes controlar el De:LOL:rive, lo dejo por si acaso.
https://github.com/fbriere/linux-dexdrive/blob/master/dexattach.c
https://github.com/fbriere/linux-dexdrive/blob/master/protocol.txt

Un cordial saludo.

PD: Pedazo de palique que ni ganas tendrán de leer, jejeje. ;)
 
Antes que nada, llevo años pensando en hacerme una interfaz propia con Visual Studio .net para controlar este dispositivo, como no tengo analizador lógico, lo he dejado. Lo compraré en el futuro cuando tenga €€€€€€.

no es necesario si aun tienes el programa y un pc donde funcione

puedes usar un sniffer para puerto serie


Deduzco que los RTS, CTS, DTR, etc tiene que ver bastante, nunca los he usado en Visual Studio, nadie en la época encontré que sepan cosas de estas, solo lo típico de siempre, con el Rx, Tx y GND.

por que son lineas de control tiene que ver mas con el protocolo 232

ademas se pueden usar de entradas y salidas para inventos
con un antirebote por software una vez arme un contador de monedas
usando la linea de control de un adaptador usb-serie y sin mas electronica
 
Hola:

Como pone aquí, no me entero en Linux.
https://github.com/fbriere/linux-dexdrive/blob/master/README

Si alguien me hecha una mano, lo probaré directamente desde una Raspberry Pi 2 con Linux.

Siguiendo con lo mismo de C#. El snnifer que he probado hace tiempo, no me ha servido proque me desactiva la comunicación del dispositivo y se mete por medio el snifer- Más bien diría un buen analizador lógico.

Iba a comprar el Logic 8 por 120 $ y lo han subido a 219 $, el de 4 por casi el mismo precio de lo que costaba el de 8, el de USB 2. Se han pasado, espero que sea por la época de Navidad, para que cuando lleguen las rebajas, comprarlo.

no es necesario si aun tienes el programa y un pc donde funcione

puedes usar un sniffer para puerto serie

Llegará un momento que si lo será, la versión 1 no es compatible con el SO de 64 bits, por ahora el 2 si lo es, además, lo quiero hacer como reto personal.

Un saludo.
 
Buenas noticias.

Al menos para mi, y los que les interesen. Hay que lograr que el De:LOL:rive despierte, aunque envíes los comandos correctos lo ingnorará. Se han complicado la vida haciendo comportamientos para que no le copien el producto, en fin, al final se puede hacer. Lo que he logrado solo hace encender el Led verde, lo que indica que por fin está despierto.

retretyry-1584148.png


Primera prueba y me costó coger el truco, he logrado encender el Led verde del De:LOL:rive. 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.
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.
 
Atrás
Arriba