Autor Tema: Ejemplo - Puerto serie y C# 2008  (Leído 60803 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #45 en: 23 de Febrero de 2010, 02:10:25 »
¿Qué excepción?

Vale, no se trabajar con las excepciones, pero depuré el código y cuando salta el error, sale para detallar la excepción y ésto me arrojó...

Código: [Seleccionar]
No se controló System.FormatException
  Message="La cadena de entrada no tiene el formato correcto."
  Source="mscorlib"
  StackTrace:
       en System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
       en System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
       en System.Convert.ToInt32(String value)
       en SoftwarePC_Beta.SoftwarePC_Beta.BtnEnviar_Click(Object sender, EventArgs e) en D:\Mis documentos\Visual Studio 2008\Projects\SoftwarePC_Beta\SoftwarePC_Beta\SoftwarePC_7450_(Beta).cs:línea 73
       en System.Windows.Forms.Control.OnClick(EventArgs e)
       en System.Windows.Forms.Button.OnClick(EventArgs e)
       en System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       en System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       en System.Windows.Forms.Control.WndProc(Message& m)
       en System.Windows.Forms.ButtonBase.WndProc(Message& m)
       en System.Windows.Forms.Button.WndProc(Message& m)
       en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       en System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       en System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       en System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       en System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       en System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       en System.Windows.Forms.Application.Run(Form mainForm)
       en SoftwarePC_Beta.Program.Main() en D:\Mis documentos\Visual Studio 2008\Projects\SoftwarePC_Beta\SoftwarePC_Beta\Program.cs:línea 18
       en System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       en System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       en System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       en System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       en System.Threading.ThreadHelper.ThreadStart()
  InnerException:


Agrego algo: En el TextBox ingreso cualquier cadena, desde simplemente "Hola" hasta "forihforhgoghroighroghorighriorrgrg" y siempre salta la excepción. Como dije en mi comentario anterior, he cambiado los tipos de datos de int, a long, etc...., vuelvo a escribir el código del error:

Código: C#
  1. private void BtnEnviar_Click(object sender, EventArgs e)
  2.        {
  3.            string ParaEnviar;
  4.            ParaEnviar = StringEnviar.Text;                        //StringEnviar es el nombre del TextBox
  5.           //Convierte el string ParaEnviar en entero
  6.            int Check;
  7.            Check = Convert.ToInt32(StringEnviar.Text);    //Aquí se da la excepción
  8.         //Check = int.Parse(StringEnviar.Text);               //Aquí TAMBIÉN se da la excepción
  9.  

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #46 en: 23 de Febrero de 2010, 13:36:00 »
Lo estás haciendo mal, estás convirtiendo una cadena de texto en enteros y eso no se puede.

Debes convertir cada caracter del string en una variable char o byte, busca la función apropiada para convertir un String a un Char Array.

string.ToCharArray()

Una vez convertido pásala a byte.

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #47 en: 23 de Febrero de 2010, 19:31:27 »
Lo estás haciendo mal, estás convirtiendo una cadena de texto en enteros y eso no se puede.

Ok, gracias por la aclaración, me estaba guiando por ésta ayuda de MSDN, allí dicen que se puede aplicar así pero bueno...
http://msdn.microsoft.com/es-es/library/1aey0kb6.aspx

Probé de ésta manera y funcionó:

Código: C#
  1. //Cambia el StringBinario en un entero
  2. UInt32 Checksum = BitConverter.ToUInt32(BinarioEnviar, 0);  //BinarioEnviar es un byte array
  3.  

Ahora, quiero analizar como es la conversión que hace, éstos son los datos que arroja:

Ingreso en el TextBox          Convierte al entero
12345                                   875770417
1234                                     875770417
1234568                                875770417
87654321                              892745528
asdf                                      1717859169
asdfghj                                  1717859169
jhgfdsa                                  1718052970

¿Al ser cada cadena diferente no debería convertir a números diferentes también?

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
    • Mexchip
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #48 en: 24 de Febrero de 2010, 02:05:26 »
¿Qué es lo que deseas hacer?

La excepción te indicó el problema, al intentar convertir una cadena a un número, puedes convertir sin problemas cadenas como "123" o "345345", porque son números enteros expresados como cadenas de texto, pero ¿a qué número entero convertirías "zzxx" o "todopic"? La función ToInt32 de la clase Convert espera un cierto formato en la cadena de texto que recibirá para convertirla, al introducir caracteres no convertibles te lanza la excepción.

Lo estás haciendo mal, estás convirtiendo una cadena de texto en enteros y eso no se puede.
Si se puede, mientras se respete cierto formato.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #49 en: 24 de Febrero de 2010, 02:30:35 »
¿Qué es lo que deseas hacer?

La idea compañero, es pasar un dato por puerto serial, pero quiero agregarle una comprobación o checksum de que el dato recibido es el mismo que el enviado. En los post más arriba, comentaba un método que pensé sobre la posibilidad de pasar el dato a un número, luego ese número se pasa al receptor y éste a su vez realiza la conversión (DatoRecibido a un número) y compara los números. Si son iguales pues el dato es correcto. Por eso mostré esas conversiones de los datos a números, pero no comprendo esa conversión.

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
    • Mexchip
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #50 en: 24 de Febrero de 2010, 05:19:32 »
Ya entendí :). Se trata de obtener el equivalente decimal de cada caracter, no lo conseguirás de la forma que estás intentando. La clase String permite obtener cada letra que contenga como un Char utilizando los operadores [], de ahí con un "cast" a int obtienes el equivalente decimal del caracter.

Con esto lo consigues:

Código: C#
  1. String cadena = txtTexto.Text;
  2.  
  3. int suma = 0;
  4. for (int c = 0; c < cadena.Length; c++)
  5. {
  6.     MessageBox.Show( cadena[ c ] + " = " + c.ToString() );
  7.     suma += (int)cadena[c];
  8. }
  9. MessageBox.Show("La suma de los caracteres convertidos a decimal es: " + suma.ToString());
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #51 en: 24 de Febrero de 2010, 05:49:38 »
Ya entendí :). Se trata de obtener el equivalente decimal de cada caracter, no lo conseguirás de la forma que estás intentando. La clase String permite obtener cada letra que contenga como un Char utilizando los operadores [], de ahí con un "cast" a int obtienes el equivalente decimal del caracter.

Con esto lo consigues:

 :mrgreen: Excelente compañero Geo, funciona perfecto, se puede hacer un CheckSum con esa función, muchas gracias!

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
    • Mexchip
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #52 en: 24 de Febrero de 2010, 14:39:59 »
:mrgreen: Excelente compañero Geo, funciona perfecto, se puede hacer un CheckSum con esa función, muchas gracias!
De nada. Ya contarás cómo avanza el proyecto :).
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado sauron

  • PIC12
  • **
  • Mensajes: 78
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #53 en: 26 de Febrero de 2010, 06:30:53 »
De nada. Ya contarás cómo avanza el proyecto :).

Bueno compañero, ya el programa envía, recibe, realiza la verificación del checksum, y guarda los datos que van y vienen en un archivo, además de un registro de los errores, también se agrega la fecha del dato......creo que ya casi está listo.

Ahora, estaba pensando en agregar otra funcionalidad: De que el usuario elija que puerto serial usar, ésto quiere decir, que al usuario elegir, se debe verificar que ese puerto no esté en uso.

Con un ListBox, obtengo y muestro al usuario la lista de puertos disponibles, pero estoy enredado en como verificar que el puerto esté abierto, me explico:

Código: C#
  1. SerialPort port = new SerialPort();
  2. .
  3. .
  4. .
  5. private void ElegirPuerto1_SelectedIndexChanged(object sender, EventArgs e)
  6.         {
  7.             string puerto = (string)ElegirPuerto1.SelectedItem;      //ElegirPuerto1 es el nombre del ListBox
  8.             this.port.PortName = puerto;                              //AQUI OCURRE UNA EXCEPCION
  9.             if (port.IsOpen)
  10.                 MessageBox.Show("Puerto Serial EN USO");
  11.             else
  12.                 this.port.Open();
  13.         }
  14.  

Luego, en this.port.PortName = puerto, ocurre una excepción cuando el puerto elegido está en uso.
Lo ideal sería colocar el if (port.IsOpen) pero como le asigno a port el puerto a verificar.

Finalmente la pregunta es, ¿cómo puedo hacer para que cuando el usuario, al elegir del listbox un puerto, se verifique que esté o no en uso?

Gracias compañeros.

Desconectado Mando31

  • PIC10
  • *
  • Mensajes: 32
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #54 en: 12 de Mayo de 2010, 16:35:18 »
Hola, primeramente el chksum que realizas al convertir el string a su equivalente decimal realizar una suma y enviarlo no es conveniente, no aseguras en verdad el dato, ya que en decimal es sumamente facil que se altere tu estas enviando por ejemplo HOLA y digamos que te genera un CHeksum de 65 ese numero tmb lo envias y puede sufrir una modificacion en el PC receptor puedes recibir 64 en lugar de 65 y aunque la palabra este bien el numeor con el que compraras esta mal, luego hay una infinidad de porque no usar decimal como comprovador de erores, te recomiendo más una implementacion de paridad o de imparidad, un CRC o Codigo Hamming, investigalos y ya notaras que es más seguro usar este tipo de tecnicas para comprobacion de errores, no de los más usados es el CRC, solo tendiras que realiza una conversion del string que envias a su codigo ascii de este pasarlo a binario y aplicarle aguna de las tecnicas que te menciono.

Cualquier cosa que te pueda ayudar con gusto lo hare.

Desconectado jdnichollsc

  • PIC10
  • *
  • Mensajes: 1
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #55 en: 18 de Mayo de 2010, 22:26:30 »
bueno....esta gente tiene mucho conocimiento....pero necesito sabe como hago para comunicar 2 pc por bluetooth....en la cual yo no se en q momento el otro me mande un mensaje....
hasta ahora tengo esto

Código: [Seleccionar]
BluetoothDeviceInfo[] bdi;
        string BTMAC;
        string BTName;
        OpenNETCF.Net.BluetoothAddress btaddress;
        OpenNETCF.Net.Sockets.BluetoothClient client;
        OpenNETCF.Net.BluetoothEndPoint endpoint;
        NetworkStream stream;
        OpenNETCF.Net.Sockets.BluetoothListener lis;
       
       

       


        //Looking for devices in the area
        private void discover()
        {
            //discover devices
            addtolog("Discovering Devices...");

            BluetoothClient bc = new BluetoothClient();
            bdi = bc.DiscoverDevices(5);
           
            comboBox1.DataSource = bdi;
            comboBox1.DisplayMember = "DeviceName";

            addtolog("Done, " + bdi.Length + " Device(s) found");
        }
private void addtolog(string msg)
        {
            txtmessage.Text = txtmessage.Text + msg + "\r\n";
            Application.DoEvents(); // update display
        }

        //DISCOVER
        private void button1_Click(object sender, EventArgs e)
        {
            AXWS.URL = abc1;
            AXWS.Ctlcontrols.play();
            txtmessage.Visible = true;
            comboBox1.Visible = true;
            discover();
        }

        //TEXT BOX
        private void textBox2_TextChanged(object sender, EventArgs e)
        {
        }

        //COMBO BOX
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            BTMAC = bdi[comboBox1.SelectedIndex].DeviceID.ToString();
            BTName = bdi[comboBox1.SelectedIndex].DeviceName.ToString();

            Application.DoEvents(); // update display
        }

        //CONNECT BUTTON
       
        private void button2_Click(object sender, EventArgs e)
        {
            AXWS.URL = ab;
            AXWS.Ctlcontrols.play();
            BTMAC = bdi[comboBox1.SelectedIndex].DeviceID.ToString();
            BTName = bdi[comboBox1.SelectedIndex].DeviceName.ToString();
           

            if (OBEXOpenStream(BTMAC))
            {

                if (OBEXConnect())
                {
                    addtolog("Connected To: "+BTMAC);
                    //stream = client.GetStream();                   
                    //receiver();
                }
                else
                {
                    txtmessage.Text = txtmessage.Text + "Unable to connect\r\n";
                }

                OBEXCloseStream();
            }
            else
            {
                addtolog("Failed to connect to OBEX Server");
                AXWS.Ctlcontrols.play();
                AXWS.URL = abc2;
            }
        }

        private void addtolog2(string msg)
        {
            textBox1.Text = textBox1.Text + msg + "    ";
           
            Application.DoEvents(); // update display
        }
        //SEND BUTTON
        private string mens;
        public int cont=0;
        public string funcion;
        private string fil="";
        private void button3_Click(object sender, EventArgs e)
        {
            if (textBox2.Text != "")
            {
                cont = cont + 1;
                int art = 0; int brt = 0; int xrt = 0;//a, x y b
                funcion = "(" + Convert.ToString(art) + Convert.ToString(xrt) + "+" + Convert.ToString(brt) + ")%104";
                string a = textBox2.Text;
                string envio="";
                for (int m = 0; m< textBox2.TextLength; m++)
                {
                    string b = a.Substring(m,(textBox2.Text.Length+1)-(textBox2.Text.Length));     
                    char sHex1 = Convert.ToChar(b);                   
                    for (int x = 0; x < 104; x++)
                    {
                       
                        string sHex = Cript[x];
                        byte newByte = byte.Parse(sHex, System.Globalization.NumberStyles.AllowHexSpecifier);
                        int i = Convert.ToInt32(newByte.ToString());
                        Char schar = Convert.ToChar(i);

                        if (schar == sHex1)
                        {
                            envio= envio+ " "+ Cript[x];
                            x = 105;
                           
                        }
                    }

                }
                textBox1.Text += envio +"\n";
                mens = envio;
               
                string min=Convert.ToString(DateTime.Now.Minute);
                FileStream ab = File.Create(Application.StartupPath + "\\Mensajes\\" + cont.ToString() + ".txt");
                fil = Convert.ToString(cont) + ".txt";
                string todo = funcion + " " + min + " " + envio;
                byte[] by = Encoding.Default.GetBytes(todo);
                foreach(byte b in by)
                {
                    ab.WriteByte(b);
                }
                ab.Flush();
                ab.Close();
                string strConexion, strOrden;
                OleDbDataAdapter dtaMor = new OleDbDataAdapter();
                DataTable dTable = new DataTable();
                DataSet dtsC = new DataSet();
                string conex = Application.StartupPath + "\\mensajes.mdb";
                strConexion = "Provider = Microsoft.jet.OLEDB.4.0; Data Source =" + conex;
                strOrden = "INSERT INTO Mensajes (Id,Encriptado, Descencriptado) Values ('"+ cont+"','" + mens + "', '" + textBox2.Text + "')";
                dtaMor = new OleDbDataAdapter(strOrden, strConexion);
                dtaMor.Fill(dtsC);
                dataGridView1.DataSource = dtsC.Tables["'+Mensajes+'"];
                if (dtsC.HasChanges())
                {
                    dtaMor.Update(dtsC);
                   
                }
            }
            else
                MessageBox.Show("NO HA INGRESADO UN MENSAJE TODAVÍA");
           

            if (txtmessage.Visible == true)
            {
                //Send a file
                addtolog("Sending File...");

                if (OBEXOpenStream(BTMAC))
                {
                    if (OBEXConnect())
                    {
                        //send client request, start put
                        string tName = "HelloWorld.txt";
                        string tType = "";
                        // string tFileContent = "Hi this is a test!!";
                        string tFileContent = OpenFile();

                        int result = OBEXRequest("PUT", tName, tType, tFileContent);//mensaje, minuto, funcion

                        switch (result)
                        {
                            case 160: // 0xa0
                                addtolog("OK");
                                break;

                            case 197: // 0xc5
                                addtolog("Method not allowed");
                                break;

                            case 192: // 0xc0
                                addtolog("Bad Request");
                                break;

                            default:
                                addtolog("Other Error");
                                break;
                        }
                    }

                    OBEXCloseStream();
                }
                else
                {
                    addtolog("Failed to connect to OBEX Server");
                }
            }
        }

        /*************************************************************************************/
        private bool OBEXOpenStream(string BTMAC)
        {
            // serial port UUID
            Guid spguid = OpenNETCF.Net.Bluetooth.BluetoothService.ObexObjectPush;
            btaddress = OpenNETCF.Net.BluetoothAddress.Parse(BTMAC);
            client = new OpenNETCF.Net.Sockets.BluetoothClient();
           
            // define endpoint
            endpoint = new OpenNETCF.Net.BluetoothEndPoint(btaddress, spguid);
            lis = new OpenNETCF.Net.Sockets.BluetoothListener(endpoint);
            try
            {
                //open socket
                client.Connect(endpoint);
            }
            catch (System.Exception e)
            {
                //unable to connect (server not listening on spguid)
                return false;
            }

            //connect socket
            stream = client.GetStream();
            return true;
        }

        private void OBEXCloseStream()
        {
            stream.Close();
            client.Close();
        }

        private bool OBEXConnect()
        {
            //send client request
            byte[] ConnectPacket = new byte[7];

            ConnectPacket[0] = 0x80; // Connect
            ConnectPacket[1] = 0x00; // Packetlength Hi Byte
            ConnectPacket[2] = 0x07; // Packetlength Lo Byte
            ConnectPacket[3] = 0x10; // Obex v1
            ConnectPacket[4] = 0x00; // no flags
            ConnectPacket[5] = 0x20; // 8k max packet size Hi Byte
            ConnectPacket[6] = 0x00; // 8k max packet size Lo Byte

            stream.Write(ConnectPacket, 0, ConnectPacket.Length);

            //listen for server response
            byte[] ReceiveBufferA = new byte[3];
            stream.Read(ReceiveBufferA, 0, 3);

            if (ReceiveBufferA[0] == 160) // 0xa0
            {

                //success, decode rest of packet
                int plength = (0xff * ReceiveBufferA[1]) + ReceiveBufferA[2]; //length of packet is...

                //listen for rest of packet
                byte[] ReceiveBufferB = new byte[plength - 3];
                stream.Read(ReceiveBufferB, 0, plength - 3);
                //serialPort1.Read(ReceiveBufferB, 0, plength - 3);
                int obver = ReceiveBufferB[0]; //server obex version (16 = v1.0)
                int cflags = ReceiveBufferB[1]; //connect flags
                int maxpack = (0xff * ReceiveBufferB[2]) + ReceiveBufferB[3]; //max packet size

                return true;
            }
            else
            {
                return false;
            }
        }

        private int OBEXRequest(string tReqType, string tName, string tType, string tFileContent)
        {
            //send client request

            int i;
            int offset;
            int packetsize;
            byte reqtype = 0x82;

            int tTypeLen = 0x03;
            int typeheadsize;
            int typesizeHi = 0x00;
            int typesizeLo = 0x03;


            if (tReqType == "GET")
            {
                reqtype = 0x83; // 131 GET-Final
            }

            if (tReqType == "PUT")
            {
                reqtype = 0x82; // 130 PUT-Final
            }

            packetsize = 3;

            //Name Header
            int tNameLength = tName.Length;
            int nameheadsize = (3 + (tNameLength * 2) + 2);
            int namesizeHi = (nameheadsize & 0xff00) / 0xff;
            int namesizeLo = nameheadsize & 0x00ff;
            packetsize = packetsize + nameheadsize;

            if (tType != "")
            {
                //Type Header
                tTypeLen = tType.Length;
                typeheadsize = 3 + tTypeLen + 1;
                typesizeHi = (typeheadsize & 0xff00) / 0xff;
                typesizeLo = typeheadsize & 0x00ff;
                packetsize = packetsize + typeheadsize;
            }

            //Body
            int fileLen = tFileContent.Length;
            int fileheadsize = 3 + fileLen;
            int filesizeHi = (fileheadsize & 0xff00) / 0xff; ;
            int filesizeLo = fileheadsize & 0x00ff; ;

            packetsize = packetsize + fileheadsize;

            int packetsizeHi = (packetsize & 0xff00) / 0xff;
            int packetsizeLo = packetsize & 0x00ff;

            byte[] tSendByte = new byte[packetsize];

            //PUT-final Header
            tSendByte[0] = reqtype; // Request type e.g. PUT-final 130
            tSendByte[1] = Convert.ToByte(packetsizeHi); // Packetlength Hi
            tSendByte[2] = Convert.ToByte(packetsizeLo); // Packetlength Lo

            offset = 2;

            //Name Header
            tSendByte[offset + 1] = 0x01; // HI for Name header
            tSendByte[offset + 2] = Convert.ToByte(namesizeHi); // Length of Name header (2 bytes per char)
            tSendByte[offset + 3] = Convert.ToByte(namesizeLo); // Length of Name header (2 bytes per char)

            // Name+\n\n in unicode
            byte[] tNameU = System.Text.Encoding.BigEndianUnicode.GetBytes(tName);
            tNameU.CopyTo(tSendByte, offset + 4);

            offset = offset + 3 + (tNameLength * 2);
            tSendByte[offset + 1] = 0x00; // null term
            tSendByte[offset + 2] = 0x00; // null term

            offset = offset + 2;

            if (tType != "")
            {
                //Type Header
                tSendByte[offset + 1] = 0x42; // HI for Type Header 66
                tSendByte[offset + 2] = Convert.ToByte(typesizeHi); // Length of Type Header
                tSendByte[offset + 3] = Convert.ToByte(typesizeLo); // Length of Type Header

                for (i = 0; i <= (tTypeLen - 1); i++)
                {
                    tSendByte[offset + 4 + i] = Convert.ToByte(Convert.ToChar(tType.Substring(i, 1)));
                }
                tSendByte[offset + 3 + tTypeLen + 1] = 0x00; // null terminator

                offset = offset + 3 + tTypeLen + 1;
            }

            //Body
            tSendByte[offset + 1] = 0x49; //HI End of Body 73
            tSendByte[offset + 2] = Convert.ToByte(filesizeHi); //
            tSendByte[offset + 3] = Convert.ToByte(filesizeLo); //1k payload + 3 for HI header

            for (i = 0; i <= (fileLen - 1); i++)
            {
                tSendByte[offset + 4 + i] = Convert.ToByte(Convert.ToChar(tFileContent.Substring(i, 1)));
            }
            //tSendByte[offset+4+fileLen] = 0x00; // null terminator

            offset = offset + 3 + fileLen;

            stream.Write(tSendByte, 0, tSendByte.Length);

            //listen for server response

            //TODO: can hang here forever waiting response...

            bool x = stream.DataAvailable; // changed bluetoothclient - public NetworkStream GetStream()

            byte[] tArray4 = new byte[3];
            stream.Read(tArray4, 0, 3);

            x = stream.DataAvailable;

            if (tArray4[0] == 160) // 0xa0
            {
                int plength = (tArray4[1] * 256) + tArray4[2] - 3;
                byte[] tArray5 = new byte[plength];
                if (plength > 0)
                {
                    stream.Read(tArray5, 0, plength);
                    //TODO: data in returned packet to deal with
                }
                return 160;
            }

            if (tArray4[0] == 197) // 0xc5 Method not allowed
            {
                return 197;
            }

            if (tArray4[0] == 192) // 0xc0 Bad Request
            {
                return 192;
            }

            return 0;
        }

        /************************************************************************************/


        public String OpenFile()
        {
            StreamReader sr = new StreamReader(Application.StartupPath+"\\Mensajes\\"+fil);
            String line = sr.ReadLine();
            return line;
        }

tengo la aplicacion como un trabajo de criptografia...pero quiero saber como recibir un txt o string....en tiempo de ejecucion sin saber en q momento me mandara el mensaje el otro pc.....si algo me piden....y les paso el trabajo hecho en visual c# 2010....por si no lo entienden ahi...jejejej  :D

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #56 en: 19 de Mayo de 2010, 11:06:39 »
Este tema es sobre el puerto serie y no se usa para la comunicación bluetooth que estás publicando.

Es mejor que abras un nuevo tema en este subforo.

Desconectado Lucy

  • PIC10
  • *
  • Mensajes: 1
Como interactuar visual C# con el pic 18f2550
« Respuesta #57 en: 06 de Junio de 2010, 10:56:18 »
Hola por favor me pueden ayudar estoy haciendo un programa en el que deseo enviar una letra de encendido y otra de apagado por el serial port del pc  que vaya al pic 18f2550 y se prenda y apague un led, esto mediante visual C# desde el pc y con Micro C programar para el pic.

He estado buscando informacion pero no tengo claro aun por favor ayudenme como abrir y cerrar el portico serial del pc y como enviar la informacion.

Gracias de antemano. Estaré esperando su ayuda.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Como interactuar visual C# con el pic 18f2550
« Respuesta #58 en: 06 de Junio de 2010, 13:04:38 »
Hola por favor me pueden ayudar estoy haciendo un programa en el que deseo enviar una letra de encendido y otra de apagado por el serial port del pc  que vaya al pic 18f2550 y se prenda y apague un led, esto mediante visual C# desde el pc y con Micro C programar para el pic.

He estado buscando informacion pero no tengo claro aun por favor ayudenme como abrir y cerrar el portico serial del pc y como enviar la informacion.

Gracias de antemano. Estaré esperando su ayuda.

Hola, lee el primer mensaje de este tema.  ;-)

Sobre mikroC puedes publicar tus avances en el subforo de C para micros pic y respecto a tus avances se te proporcionará ayuda.

Desconectado bib22jason

  • PIC10
  • *
  • Mensajes: 2
Re: Ejemplo - Puerto serie y C# 2008
« Respuesta #59 en: 29 de Julio de 2010, 17:01:33 »
Hola!!!

Soy nuevo en foro, tengo algunas dudas sobre como trabajar en el puerto serial, gracias a ustedes puedo comprender un poco sobre esto.

mi problematica es la siguiente: Recibo datos a la Pc por el puerto serial (esto ya no es problema) , se guardan en un string (tampoco es problema), este string lo meto en un text file y termine.

esta es la rutina que debe seguir mi programa, pero el problema es que cuando supuestamente debe guardar la segunda cadena en el text file el programa se cierra y ya no hace nada, les pongo el codigo con el qu estoy trabajando. les agradeceria q me ayudaran con este problema. (disculpen el desorden de la escrtura)


public Form1()
        {
            InitializeComponent();
        }
        int bandera = 1;   //  igual y esto no es necesario, pero lo puse para indagar en mi problema de que se cierra el programa

        StreamWriter ARCHI = new StreamWriter(@"c:\\archivos1\\paso.txt", true);    // abre archivo

        private void Form1_Load(object sender, EventArgs e) // se abre el puerto automaticamente cuando ejecuto el programa
        {
            if (bandera == 1)
            {
                serialPort1.Open();
            }

            recibido.Clear(); // limpia el puerto
        }



        string numeros; // guardo los datos recibidos aqui

        List<byte> recibido = new List<byte>();
        private void button1_Click(object sender, EventArgs e)  // estas lineas son las que usa para el que envio del dato necesario para poder comenzar a recibir datos
        {
            byte[] miBuffer = new byte[1];

            miBuffer[0] = 0xDA; // Letra "simbolo raro" del ASCII.

            this.serialPort1.Write(miBuffer, 0, miBuffer.Length);
            //Abrir puerto COM1
           
        }

        DateTime x = DateTime.Now; // necesito colocar la hora despues de imprimirlo en el text file

        string hora; // el string para la hora
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
           
            ////Datos en el buffer
            int bytes = serialPort1.BytesToRead;
            if (bytes<16) // recibo 16 datos, si recibo menos no hace nada
            {
                return;
            }
            byte[] buffer = new byte[bytes];



            serialPort1.Read(buffer, 0, bytes);

            foreach (byte elem in buffer) // guardo los datos recibidos
            {
                recibido.Add(elem);
            }
           
           
            for (int i = 0; i < bytes; i=i+2) // con este for lo que hago es darle un orden a los datos recibidos y se meten dentro de la variable numeros
            {
                int aux = 0;
                string auxs;
                aux = recibido * 256 + recibido[i + 1];
                auxs = aux.ToString();
                numeros = numeros + "" + auxs + ";";
            }
       
           
            hora = "" + x; // guardo la hora en este string
           
            ARCHI.WriteLine(numeros + "   " + hora); // escribe en el archivo de texto los datos recibidos y la hora
            numeros = ""; // limpia el string
            hora = ""; // limpia el string
           
            recibido.Clear(); // limpia el bufer
            ARCHI.Close(); // cierra archivo... aqui es donde tengo dudas dado que al comienzo de estas llaves (mayor gerarquia de recepcion de datos) habia colocado la linea para abrir el  ARCHI y cerrarlo a qui al final para poder seguir escribiendo en el, pero no importando como le haga, solo lo hace una vez y el ejecutable se cierra. si me hicieran el favor de revisar estas lineas y  decirme donde esta mi error.
           
        }


 

anything