Последовательный порт будет получать DataReceived только в состоянии перерыва - PullRequest
0 голосов
/ 09 января 2019

Я использую последовательный порт для получения данных от считывателя RFID. он будет получать и отображать dta при первой отправке, но не будет после этого ... ЗА ИСКЛЮЧЕНИЕМ, когда я ставлю точку останова на событие DataReceived. Тогда это работает каждый раз. Достигает точки останова и после F5, отображает это нормально. Пробовал таймеры и все виды вещей, но еще не заработал надежно (снаружи есть точка останова). Я не понимаю, почему и как это исправить. Вот код класса, который я использую, он больше не самый лучший, так как я в нем копался:

public class RFIDReader
{
    private System.IO.Ports.SerialPort _scannerPort;

    private Control _control;
    private string _port;
    private int _baud;
    private string _pariStr;
    private int _dataBits;
    private int _stopBits;
    private string _suffix;

    /// <summary>
    /// Starts the specified Serial Scanner.
    /// </summary>
    /// <param name="tagCheck">The beginning character to verify against, and the control to place value in</param>
    public void Start(Control tagCheck)
    {
        _control = tagCheck;

        GetScannerSettings();
        try
        {
            _scannerPort.DataReceived += DataReceivedHandler;
            _scannerPort.DtrEnable = true;
            _scannerPort.Open();
        }
        catch (Exception _e)
        {
            MessageWindow.Show("Scanner Setting Error", _e.Message, MessageWindow.ButtonStyle.Ok,
                MessageWindow.IconStyle.Error);
            Environment.Exit(1);
        }
    }

    public void Close()
    {
        try
        {
            _scannerPort.Close();
            _scannerPort.Dispose();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }

    private void GetScannerSettings()
    {
        string port = MySettings.get_Item("RFIDPort");
        string[] _sArr = MySettings.get_Item("RFIDSettings").Split(',');
        int _baud = Convert.ToInt32(_sArr[0]);
        string _pariStr = _sArr[1];
        int _dataBits = Convert.ToInt16(_sArr[2]);
        int _stopBits = Convert.ToInt16(_sArr[3]);
        string suffix = _sArr[4];
        Parity _pariSetting = ParseParity(_pariStr);
        StopBits _stopBitsSetting = ParseStopBits(_stopBits);
        _scannerPort = new SerialPort(MySettings.get_Item("RFIDPort"))
        {
            BaudRate = _baud,
            DataBits = _dataBits,
            StopBits = _stopBitsSetting,
            Parity = _pariSetting
        };
    }

    private StopBits ParseStopBits(int stopBits)
    {
        StopBits _stopBitsSetting;
        switch (stopBits)
        {
            case 0:
                _stopBitsSetting = StopBits.None;
                break;
            case 1:
                _stopBitsSetting = StopBits.One;
                break;
            case 2:
                _stopBitsSetting = StopBits.Two;
                break;
            default:
                _stopBitsSetting = StopBits.One;
                break;
        }
        return _stopBitsSetting;
    }

    /// <summary>
    ///     Parses the parity.
    /// </summary>
    /// <param name="pariStr">The pari string.</param>
    /// <returns></returns>
    private Parity ParseParity(string pariStr)
    {
        Parity _pariSetting;
        switch (pariStr)
        {
            case "e":
                _pariSetting = Parity.Even;
                break;
            case "m":
                _pariSetting = Parity.Mark;
                break;
            case "n":
                _pariSetting = Parity.None;
                break;
            case "o":
                _pariSetting = Parity.Odd;
                break;
            case "s":
                _pariSetting = Parity.Space;
                break;
            default:
                _pariSetting = Parity.None;
                break;
        }
        return _pariSetting;
    }

    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        string _b = ((SerialPort)sender).ReadExisting();
        if (_b.Contains("\n"))
        {
            _b = _b.Remove(_b.IndexOf("\n", StringComparison.Ordinal));
        }
        if (_b.Contains("\r"))
        {
            _b = _b.Remove(_b.IndexOf("\r", StringComparison.Ordinal));
        }
        SetTextCallback t = SetText;

        _control.Invoke(t, _b, _control);
        _control.Invoke(CallEmulateEnter);

    }

    private void SetText(string text, Control control)
    {
        control.Text = text;
    }

    private delegate void SetTextCallback(string text, Control control);
    public Func<bool> CallEmulateEnter { get; set; }
}
...