2011-02-24 21 views
6

HI im nuevo en el puerto serie C#. Estoy escribiendo un programa C# ejecutando winXP y win7 para mantener los datos recibidos del puerto serie cuando se enviaron los datos a la máquina.Comunicación del puerto serie RS232 C# win7 .net framework 3.5 sp1

using System.IO; 
using System.IO.Ports; 
using System.Threading; 


namespace RS232RVR 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     SettingRS232(); 
    } 

    public void SettingRS232() 
    { 
     try 
     { 
      SerialPort mySerialPort = new SerialPort("COM6"); 

      mySerialPort.BaudRate = 9600; 
      mySerialPort.Parity = Parity.None; 
      mySerialPort.StopBits = StopBits.One; 
      mySerialPort.DataBits = 8; 
      mySerialPort.Handshake = Handshake.None; //send to hardware flow control. 

      mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler); 

      mySerialPort.Open(); 


      richTextBox1.Text = "on"; 

      mySerialPort.Close(); 
     } 
     catch (Exception ex) 
     { 
      richTextBox1.Text = ex.Message;  
     } 

    } 

    private void DataReceviedHandler(
        object sender, 
        SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     string indata = sp.ReadExisting(); 
     richTextBox1.Text = indata; 

    } 

} 

}

COM6 está activo en mi pc. pero mi problema es que parece que el evento de datos recibidos no se dispara cuando tiene datos provenientes del puerto serie. (He comprobado el deporte utilizando algunas de las aplicaciones de software gratuito)

¿Alguien puede ayudar?

gracias

+0

. La clase de puerto en serie de .NET deja mucho que desear. [Las funciones de comunicación de Win32] (http://msdn.microsoft.com/en-us/library/aa363194.aspx) funcionan mucho mejor. –

Respuesta

1

¿Copiaste que el código de su aplicación? ¿Es quizás solo un caso que el nombre del controlador de eventos está mal escrito? P.ej. DataReceviedHandler en realidad debería escribirse DataReceivedHandler.

+0

gracias Drew, es mi gran error por eso. pero tuve una base de cambio en tu respuesta. pero todavía no funciona. – DesMY

+0

también me refiero a este http://stackoverflow.com/questions/466474/how-do-i-use-datareceived-event-of-the-serialport-port-object-in-c – DesMY

5
 mySerialPort.Open(); 
     richTextBox1.Text = "on"; 
     mySerialPort.Close(); 

Eso no va a funcionar, cerrará el puerto serie un par de microsegundos después de abrirlo. Sí, no es probable que el controlador de eventos DataReceived se active. Solo cierre el puerto cuando cierre su programa.

 mySerialPort.Handshake = Handshake.None 

eso es un problema también, que necesitará para controlar las señales de saludo a ti mismo ahora. La gran mayoría de los dispositivos de puerto en serie no enviarán nada hasta que vean que la máquina está encendida y lista para recibir. Establezca las propiedades DtrEnabled y RtsEnabled en true.

+0

I echoo Hans 'punto principal : abre su puerto y luego lo cierra de inmediato. ¿Cómo va a recibir su aplicación algo en un puerto cerrado? –

+0

gracias Hans, agudo ... está trabajando después de que comento el cierre del puerto ... gracias y muy útil. – DesMY

1

Problema solucionado y me gustaría compartirlo. tuve fina de reclamación de la siguiente manera:

namespace RS232RVR 
{ 
    public partial class Form1 : Form 
    { 
     private delegate void SetTextDeleg(string data); 

     public Form1() 
     { 
      InitializeComponent(); 
      SettingRS232(); 
     } 

     public void SettingRS232() 
     { 
      try 
      { 
       SerialPort mySerialPort = new SerialPort("COM6"); 

       mySerialPort.BaudRate = 9600; 
       mySerialPort.Parity = Parity.None; 
       mySerialPort.StopBits = StopBits.One; 
       mySerialPort.DataBits = 8; 
       mySerialPort.Handshake = Handshake.None; 
       mySerialPort.ReadTimeout = 2000; 
       mySerialPort.WriteTimeout = 500; 

       mySerialPort.DtrEnable = true; 
       mySerialPort.RtsEnable = true; 

       mySerialPort.Open(); 
       //mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 
       mySerialPort.DataReceived += DataReceivedHandler; 

       textBox1.Text = "Serial Port is Ready."; 

      } 
      catch (Exception ex) 
      { 
       textBox1.Text = ex.Message;  
      } 

     } 

     public void DataReceivedHandler(object sender,SerialDataReceivedEventArgs e) 
     { 
      SerialPort sp = (SerialPort)sender; 
      System.Threading.Thread.Sleep(500); 
      string indata = sp.ReadExisting(); 
      this.BeginInvoke(new SetTextDeleg(DisplayToUI), new object[] { indata }); 
      //textBox1.Text += indata; 

     } 

     private void DisplayToUI(string displayData) 
     { 
      textBox1.Text += displayData.Trim(); 
      // textBox1.Text += displayData; 

     } 

    } 
} 

Si alguien tiene comentarios sobre el código que son bienvenidos, es un placer y un deseo para codificar mejor.

Cuestiones relacionadas