Я использую последовательный порт для получения данных от считывателя 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; }
}