Ich habe eine einfache serielle Port -Winform auf .NET Framework v4.7.1. z.B. Plugin device1 App -Lesen Daten von Device1 , dann Plugin develement2 App -Lesen Daten von Device1 - und wird von jetzt an immer frühere Daten lesen! z.B. Plugin device3 App -Lead Daten von Device2 , Plugin device4 App -Lesedaten Daten von Device3 ...
Wenn dieses Problem auftritt, sollte ich meine App neu starten, dann würde es ok.private readonly SerialPort _serialPort = new SerialPort();
//...
private byte[] SendAndGetBytes()
{
//These clear method does not help
_serialPort.DiscardInBuffer();
_serialPort.DiscardOutBuffer();
_serialPort.ReadExisting();
var imeiRequestBody = new byte[] { 0x05 };
if (!WriteData(imeiRequestBody))
{
return null;
}
var incomingBytes = ReadData(5000);
if (incomingBytes == null)
{
return null;
}
return incomingBytes;
}
public bool WriteData(byte[] bytes)
{
if (!_serialPort.IsOpen)
{
return false;
}
try
{
var str = ByteArrayToHexString(bytes);
_serialPort.Write(bytes, 0, bytes.Length);
return true;
}
catch (Exception e)
{
_logger.Error(e);
}
return false;
}
public byte[] ReadData(int timeoutTicks)
{
var beginTick = Environment.TickCount;
try
{
if (!_serialPort.IsOpen)
{
return null;
}
do
{
if (_serialPort.BytesToRead == 0)
{
Thread.Sleep(100);
continue;
}
Thread.Sleep(10);
var length = _serialPort.BytesToRead;
var bytes = new byte[length];
for (int i = 0; i < length; i++)
{
bytes = Convert.ToByte(_serialPort.ReadByte());
}
var str = ByteArrayToHexString(bytes);
_logger.Info("Read from serial port. Name: {0}, baudrate: {1}.\nString content:\n{2}",
_serialPort.PortName, _serialPort.BaudRate, str);
return bytes;
}
while (Environment.TickCount - beginTick < timeoutTicks && _serialPort.IsOpen);
return null;
}
catch (Exception e)
{
_logger.Error(e);
return null;
}
}
private string ByteArrayToHexString(byte[] data)
{
var sb = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sb.Append(data.ToString("X").PadLeft(2, '0'));
}
return sb.ToString();
}
< /code>
Ich habe oben drei klare Puffermethoden hinzugefügt, aber sie helfen nicht. Die Geräteinformationen werden von _logger protokolliert. < /P>
Über Plugin, z. I Plugin Device1 In COM23 lesen Sie Daten, indem Sie auf eine Schaltfläche auf dem Gerät klicken (es sendet IMEI -Info nach einem Protokoll), das Gerät entfernen1 und Plugin Device2 in COM23. Der CRC -Scheck ist erforderlich, aber einfach in dieser Frage weglassen. Ich würde dies in der nächsten Version meiner App hinzufügen.
Serienanschluss erhielt immer wieder "vorherige" Bytes [geschlossen] ⇐ C#
-
- Similar Topics
- Replies
- Views
- Last post