L'ordinateur est connecté à un appareil de mesure via un COM1 physique. J'ai une forme simple où j'ouvre un port série, dire à l'appareil que je suis vivant et parfois l'appareil envoie des données. (toutes les quelques minutes)Ouverture de l'application SerialPort C#
Thread _readThread = new Thread(Read);
SerialPort _serialPort = new SerialPort("COM1", 9600);
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.Handshake = Handshake.None;
_serialPort.DtrEnable = true;
_serialPort.Open();
_readThread.Start();
_serialPort.Write("#listening");
La fonction de lecture (qui fonctionne):
public void Read()
{
string message = _serialPort.ReadLine();
}
Après environ une minute l'application se bloque (même pendant le débogage). Il signale une exception ObjectDisposedException (pour le flux sous-jacent?). Le message indique que le SafeHandle a été fermé. Stack strace est ci-dessous:
à Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult (SafeFileHandle hFile, NativeOverlapped lpOverlapped, Int32 & lpNumberOfBytesTransferred, Boolean bWait) à System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent() à System.Threading.ThreadHelper.ThreadStart_Context (état d'objet) à System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, rappel ContextCallback, état d'objet) à System.Threading.ThreadHelper.ThreadStart() *
Toutes les idées? Le problème est rapporté largement mais implique généralement que le périphérique soit physiquement détaché du PC.
Je sais que la classe SerialPort a quelques problèmes avec Mono. Utilisez-vous Mono ou MS .NET? – Skurmedel
MS .NET Framework 3.5 SP1 –
Probablement pas une solution, mais vous appelez Write before Open. – Skurmedel