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