ich habe eine kleine GUI in C# erstellt. Mit dieser Gui werden/sollen Daten vom Mikrocontroller ausgelesen werden.
Es handelt sich um serielle Daten. Im Programm nutze ich die Bibliothek Syste.IO.Ports.
private void btn_Init_Click(object sender, EventArgs e)
{
mySerialPort = new SerialPort("COM5");
mySerialPort.BaudRate = 115200;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;
mySerialPort.ReadTimeout = 100;
//mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
fifo_peekonly = new ConcurrentQueue<byte>();
fifo_queue = new BlockingCollection<byte>(fifo_peekonly);
mySerialPort.DataReceived += (sender, e) =>
{
byte[] buffer = new byte[mySerialPort.BytesToRead];
if (!mySerialPort.IsOpen)
{
throw new System.InvalidOperationException("Serial port is closed.");
}
mySerialPort.Read(buffer, 0, mySerialPort.BytesToRead);
foreach (var b in buffer)
fifo_queue.Add(b);
};
Thread thr = new Thread(new ThreadStart(mythread));
thr.Start();
}
public byte GetByteFromDevice()
{
byte b;
b = fifo_queue.Take();
return b;
}
public void mythread()
{
while(true)
{
if(recvByteCnt == 0)
{
recvLength = GetByteFromDevice();
recvByte = recvLength;
}
else
{
recvByte = GetByteFromDevice();
}
recvBuffer[recvByteCnt] = recvByte;
if (recvByteCnt ≥ recvLength)
{
recvFlag = 1;
recvByteCnt = 0;
Debug.Write("Complete\n");
}
else
{
if (recvByteCnt == 0)
{
Debug.Write("Start timeout\n");
}
recvByteCnt++;
}
//Debug.Write(recvByte.ToString() + "\n");
}
}
Nun fehlt quasi noch eine TimeOut Mechanismus. Dieser soll im thread nach der if Bedingung "if (recvByteCnt == 0)" eingesetzt werden.
Wie würde man solch eine Funktionalität realisieren?