1

我为我的英语道歉。

我正在构建一个C#与串行端口一起使用的应用程序。我使用DataReceived事件来捕获向外部发送硬件的数据,在事件处理程序中DataReceived我使用该方法ReadExisting 来捕获外部硬件发送的数据。

当我用 32 位计算机测试应用程序时,一切都很顺利,但是当我用 64 位计算机测试它时,大约每 200 或 400 毫秒 DataReceived触发一次事件并且该方法返回的数据ReadExisting很多,问号(? ????????????)

注意:para la comunicacion del hadware externo con el pc, yo utilizo conversor de puerto serial a usb == [Conversor] http://www.twistedtienda.com/images/prod/usbrs232-1.jpg

这是我用来创建 com 端口的方法:

private void CrearPuerto()
{
    if (srpComunicacion == null)
    {
   srpComunicacion = new System.IO.Ports.SerialPort();
   srpComunicacion.BaudRate = Globales.BaudiosPuertoCom;
   srpComunicacion.Parity = System.IO.Ports.Parity.None;
   srpComunicacion.DiscardNull = false;
   srpComunicacion.StopBits = System.IO.Ports.StopBits.One;
   srpComunicacion.DataBits = 8;
   srpComunicacion.DtrEnable = false;
   srpComunicacion.ParityReplace = 63;
   srpComunicacion.ReadBufferSize = 4096;
   srpComunicacion.ReadTimeout = 3000;
   srpComunicacion.ReceivedBytesThreshold = 4;
   srpComunicacion.RtsEnable = false;
   srpComunicacion.WriteBufferSize = 2048;
   srpComunicacion.WriteTimeout = -1;
   srpComunicacion.Handshake = System.IO.Ports.Handshake.None;
   srpComunicacion.DataReceived +=(a,b)=>{
                System.IO.Ports.SerialPort srp = ((System.IO.Ports.SerialPort)a);
                if ( System.Threading.Monitor.TryEnter(srp,1000) )
                {
                    try
                    {
                        DatosImpresion d = new GenerarTurno().GenerarTurno1(((System.IO.Ports.SerialPort)a).ReadExisting(), true);
                        if (d != null && Globales.MostrarNotificacion[Globales.MostrarNotificacion.Length - 1])
                            notifyIcon1.ShowBalloonTip(10000, "Informacion del Turno Generado", "Turno " + d.Turno + " del Grupo " + d.Grupo + "\r\nRango : " + d.RangoIni + " - " + d.RangoFin + "\r\nTurnos en Espera : " + d.TurnoEspera + "\r\nTaquillas Principales : " + d.Taquillas, ToolTipIcon.Info);
                    }
                    catch (Exception ex)
                    {
                        try
                        {
                            bool errorDeRed = ex.ErrorDeRedToString();
                            if (ex.GetType().Name.ToLower().Equals("exception") || errorDeRed)
                            {
                                PrintDocument pr = new PrintDocument();
                                pr.PrinterSettings.PrinterName = Globales.RutaImpresora;
                                if (pr.PrinterSettings.IsValid)
                                {
                                    RawPrinterHelper.SendStringToPrinter(Globales.RutaImpresora, (errorDeRed ? string.Format(Globales.ErrorRed, DateTime.Now.ToLongDateString(), DateTime.Now.ToShortTimeString()) : ex.Message));
                                    pr.Print();
                                }
                            }
                        }
                        catch (Exception exc) { ex = new Exception(ex.ToString(), exc); }
                        Herramientas.Genericas.AdminErrores.GenerarLogErrores("srpComunicacion_DataReceived -- " + ex.ToString());
                    }
                    finally
                    {
                        System.Threading.Monitor.Exit(srp);
                    }
                }
                if (++recolectar >= 10)
                {
                    recolectar = 0;
                    ClsGenerica.ForzarRecolector();
                    Application.DoEvents();
                }
            };
        }
4

0 回答 0