ich habe nun den Empfang der Daten in einer separaten Task realisiert.
Auch das Versenden von Daten läuft in einem anderen Task.
Nun ist es so wenn ich Daten versende, dann läuft das mit dem Empfangen von Daten schief.
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?