串行端口仅在中断状态下将接收数据接收

时间:2019-01-09 20:19:33

标签: c# serial-port rfid

我正在使用串行端口从RFID读取器接收数据。它会在第一次发送dta时接收并显示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; }
}

0 个答案:

没有答案
相关问题