Jeg tror mit problem er løst:-)
Det viser sig at SerialPort i .NET 3.5 simpelt hen er så ringe at den nærmest er ubrugelig... Det viser sig åbenbart at der er flere end mig der har haft de mest mystiske problemer... bla. med data-tab.
http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvb/thread/3e64f562-e74b-4213-8019-e69f54fc0d74Nåå men for at gøre en lang historie kort, så løste problemet sig da jeg hentede OpenNETCF's comport dll... det spiller bare. Der har været et par småfejl, hvis jeg presser maskineriet ved at starte virusscan og hente data på 2 comporte samtidig, men der er tale om så lidt så jeg kan leve med det og måske endda forbedre koden, så det slet ikke sker.
** OpenNETCF kan downloades her:
http://serial.codeplex.com/ **
OpenNETCF.IO.Serial er næsten identisk med den der ligger i .NET 3.5, Så det kræver ikke de store ændringer i ens kode. Der er ændret lidt på navnene til eventhandleren, men i det store hele er metoderne identiske.
Så jeg ville da foreslå alle der har problemer med serialporten hurtigst muligt får downloadet og erstattet Microsoft's SKOD SERIEL DRIVER!!!... Ahhh så kom det ud ;-)
Her min nye test kode:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
//using System.IO.Ports;
using OpenNETCF.IO.Ports;
namespace ConsoleApplication1
{
class Program
{
static int EmptyBuffer = 0;
static int ErrorCount = 0;
internal static SerialPort sp = new SerialPort("COM5");
internal static Queue<string> inQueue = new Queue<string>();
internal static Queue<string> PacketQueue = new Queue<string>();
static void Main(string[] args)
{
Console.WriteLine("Serial test for 2000 samples/sec");
System.Threading.Thread deQ = new System.Threading.Thread(DeQue);
deQ.Start();
sp.BaudRate = 230400;
sp.ReadBufferSize = 180000;//har leget lidt med buffersize... under normal brug kommer der ikke megert mere end 4-5000 bytes i ad gangen, men det kan sagtens stige til over 10000 bytes
//sp.ReadBufferSize = 16384;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Handshake = Handshake.None;
sp.Parity = Parity.None;
sp.Encoding = Encoding.ASCII;
//sp.ReceivedBytesThreshold = 100;
sp.ReceivedEvent += new SerialReceivedEventHandler(sp_DataReceived);
sp.ErrorEvent += new SerialErrorEventHandler(sp_ErrorReceived);
sp.Open();
sp.DiscardInBuffer();
sp.WriteLine("SG");//sender kommando der starter transmission af 2000 datapakker/sec
Console.ReadLine();
System.Diagnostics.Debugger.Break();
}
static void DeQue()
{
int CycleCounter = 0;
int PacketCounter = 0;
string str2 = "";
string str1 = "";
int error = 0;
while (true)
{
int t = 0;
if (inQueue.Count > 0)
{
str1 = inQueue.Dequeue();
t++;
for (int i = 0; i <= str1.Length-1; i++) //henter resultater ud af strengene i buffer/kø
{
str2 += str1[i];
if (str1[i] == Convert.ToChar("\r"))
{
PacketQueue.Enqueue(str2);//lægger resultaterne i ny buffer/kø!
string Pnum = ("G+" + PacketCounter.ToString("d5")+".\r");
if (!(str2 == Pnum))
{
error++;
Console.WriteLine(error + " " + str2+" PacketNr: "+PacketCounter);
}
if (error > 10)
{ }
if (str2 == "G+65535.\r")
{
CycleCounter++;
Console.WriteLine("Cycle nr: " + CycleCounter+" PacketCounter: "+PacketCounter);
PacketCounter = -1;
}
PacketCounter++;
str2 = "";
}
}
}
}
}
static void sp_ErrorReceived(object sender, SerialErrorEventArgs e)
{
System.Diagnostics.Debugger.Break();
}
static void sp_DataReceived(object sender, SerialReceivedEventArgs e)
{
if (sp.BytesToRead > 3000)
{
Console.WriteLine("Bytes in buffer = " + sp.BytesToRead);
}
string str1 = sp.ReadExisting(); //Alle bytes i bufferen læses ind i en streng
EmptyBuffer++;
if (EmptyBuffer == 1)
{ Console.WriteLine("Started"); }
inQueue.Enqueue(str1); //Strengen sættes i en kø/buffer
}
}
}