2

基本的に私はと通信する必要がありCOM serial printerます。2 つのタイマーがあり、1 つは一度に 1 枚のチケットを印刷し、もう 1 つはエラーをチェックして停止し、エラーがなくなったら印刷を再開します。

例: プリンターは印刷中ですが、一時停止ボタンを押すとエラー (バッファーで読み取られる) によってブール値が 1 になり、それらを読み取った後、エラーの内容を確認して印刷を停止することができます。

私の問題はErrorTimer_Elapsed()、タイマー経過イベントであり、おそらく ErrorCheck および SendToCom (印刷メソッド) にリンクされているメソッドにあります。問題は、プログラムがエラーを適切に検出することですが、ErrorTimer_Elapsed()エラーステータスの変化を繰り返しチェックしようとすると、次のような IO エラーが発生します。

-COMポートにアクセスできません -必要なリソースは使用中です

等々。

手伝って頂けますか?ありがとう、これがコード(約180行)です。私は3日以来、これに頭をぶつけています:( :

using System;
using System.Collections;
using System.Configuration;
using System.IO;
using System.IO.Ports;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {

        #region Variabili di istanza

        private ArrayList _filesToPrint = new ArrayList();  
        private static SerialPort _serialPort1 = new SerialPort();  
        private string _portName = ConfigurationSettings.AppSettings["COM"];    
        private string FilesPath = ConfigurationSettings.AppSettings["Path"];   
        private System.Timers.Timer PrintTimer = new System.Timers.Timer(2000);
        private System.Timers.Timer ErrorTimer = new System.Timers.Timer(3500); 
        private bool PrintTimerIsActive = true; 
        private string HsCOMerrorStrings, PrintErrors;  

        #endregion

        public Form1() 
        {
            _serialPort1.PortName = _portName; 
            _serialPort1.ReadTimeout = 1000;
            _IfFileExistsPrint();
        }

        private void _IfFileExistsPrint()
        {
            foreach (string file in Directory.GetFiles(FilesPath))
                _filesToPrint.Add(file); 

            FileSystemWatcher SysWatch = new FileSystemWatcher(FilesPath, "*.*");
            SysWatch.Created += new FileSystemEventHandler(SysWatch_Created);
            SysWatch.EnableRaisingEvents = true;

            PrintTimer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
            PrintTimer.Start();

            ErrorTimer.Elapsed += new System.Timers.ElapsedEventHandler(ErrorTimer_Elapsed);
        }

        private void SysWatch_Created(object Sender, FileSystemEventArgs w)
        {
            _filesToPrint.Add(w.FullPath);
        }


        private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (_filesToPrint.Count > 0 && PrintTimerIsActive)
            {
                PrintTimer.Stop();  
                SendFilesToCom(_filesToPrint[0].ToString());
                MessageBox.Show("Printing file :" + _filesToPrint[0].ToString());
                File.Delete(_filesToPrint[0].ToString());   
                _filesToPrint.RemoveAt(0);  
                _filesToPrint.TrimToSize(); 
                Console.Write(HsCOMerrorStrings);
                PrintTimer.Start(); 

                PrintErrors = ErrorCheck(HsCOMerrorStrings);
            }
        }

        private void ErrorTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs d)
        {
            if (!_serialPort1.IsOpen)
            {
                try
                {
                    _serialPort1.Open();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Data);
                }
            }

            try
            {
                HsCOMerrorStrings = _serialPort1.ReadExisting();
                _serialPort1.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Data);
            }
            Console.WriteLine(ErrorCheck(HsCOMerrorStrings));
        }

        private string ErrorCheck(string COMHostStatusReturn)
        {
            string ErrorsReturn = System.String.Empty;
            string[] COMCode = COMHostStatusReturn.Split(',');

            if (COMCode[1] == "1") { ErrorsReturn += "Carta Esaurita" + Environment.NewLine; }
            if (COMCode[2] == "1") { ErrorsReturn += "Stampante in Pausa" + Environment.NewLine; }
            if (COMCode[5] == "1") { ErrorsReturn += "Memoria Stampante Esaurita" + Environment.NewLine; }
            if (COMCode[9] == "1") { ErrorsReturn += "Memoria RAM corrotta" + Environment.NewLine; }
            if (COMCode[10] == "1") { ErrorsReturn += "Temperatura troppo bassa" + Environment.NewLine; }
            if (COMCode[11] == "1") { ErrorsReturn += "Temperatura troppo alta" + Environment.NewLine; }

            if (COMCode[7] == "1") { ErrorsReturn += "Partial Format Flag" + Environment.NewLine; }

            if (ErrorsReturn != System.String.Empty)    
            {

                if (PrintTimerIsActive == true)         
                {
                    PrintTimer.Stop();                  

                    if (!ErrorTimer.Enabled)             
                        ErrorTimer.Start();             

                    MessageBox.Show(ErrorsReturn);      
                }
                PrintTimerIsActive = false;             
            }
            else                                        
            {                                   
                if (PrintTimerIsActive == false)        
                {
                    ErrorTimer.Stop();                  
                    PrintTimer.Start();                 
                    PrintTimerIsActive = true;          
                }
            }

            return ErrorsReturn;
        }

        private void SendFilesToCom(string filePath)
        {
            if (!_serialPort1.IsOpen)
            {
                try
                {
                    _serialPort1.Open();
                }
                catch (Exception ex)
                {
                }
            }
            try
            {
                using (System.IO.TextReader reader = File.OpenText(filePath))
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        _serialPort1.WriteLine(line);
                    }

                    HsCOMerrorStrings = _serialPort1.ReadLine();
                    reader.Close(); 
                    _serialPort1.Close();
                }
            }
            catch (Exception ex)
            {
            }
        }
    }
}
4

0 に答える 0