Pourquoi l'accès au port COM est-il refusé?
le code:
static void Main(string[] args)
{
Console.WriteLine("Memory mapped file reader started");
using (var file = MemoryMappedFile.OpenExisting("AIDA64_SensorValues"))
{
using (var readerz = file.CreateViewAccessor(0, 0))
{
var bytes = new byte[567];
var encoding = Encoding.ASCII;
readerz.ReadArray<byte>(0, bytes, 0, bytes.Length);
File.WriteAllText("C:\\myFile.txt", encoding.GetString(bytes));
var readerSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
using (var reader = XmlReader.Create("C:\\myFile.txt", readerSettings))
{
while (reader.Read())
{
using (var fragmentReader = reader.ReadSubtree())
{
if (fragmentReader.Read())
{
reader.ReadToFollowing("value");
SerialPort port = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
port.Open();
port.Write(reader.ReadElementContentAsString() + ",");
}
}
}
}
}
}
Console.WriteLine("Press any key to exit ...");
Console.ReadLine();
}
il lit la mémoire partagée, écrit que la mémoire partagée dans un fichier, puis le même fichier est ouvert avec lecteur xml et se divise xml car il a de multiples causes, puis obtient la valeur d'un noeud sur chaque nouveau split xml et l'envoi de plus de série. il fonctionne sur la première division xml et son nœud est envoyé sur numéro de série, puis il s'arrête avec un accès est refusé à port com message sur la tentative pour l'écriture de la deuxième noeud de série.
j'ai une application que j'ai faite avec le même numéro de série, et il fonctionne très bien(j'ai juste fatigué il a ensuite fermé.)... de sorte que son étrange.
source d'informationauteur Csharpz
Vous devez vous connecter pour publier un commentaire.
Vous pouvez ouvrir un port série qu'une seule fois. Mais ton code a l'Ouvrir() appeler à l'intérieur de la boucle while. Qui ne fonctionne que pour le premier passage dans la boucle, kaboom sur la 2ème passe. @cdhowie la solution ne fonctionne pas non plus, SerialPort a un caprice (aka bug) que la documentation met en garde sur les. Il a besoin de temps pour laisser un thread de travail à la sortie après l'Dispose() ou Close() de l'appel. Le temps est indéterminé et imprévisible.
La vraie solution est simple, il suffit de déplacer le Open() appel avant la boucle while.
En plus de Hans réponse:
J'ai eu le même problème et joué un peu avec quelques temps de sommeil entre l'ouverture et la fermeture du port série. Dans mon cas, 250 ms ont été suffisante.
Peut-être que cela aidera quelqu'un là-bas.
EDIT:
J'ai optimisé ma solution et c'est ce que je suis venu avec:
Vous pouvez jouer avec le
sleepTimeInMs
et/ou lamaxRetries
.J'ai choisi ces valeurs parce qu'ils semblaient être suffisant dans les cas d'utilisation.
Hans répondre remplace celui-ci; je suis partant pour un contexte et à des fins d'information seulement.
Vous devez fermer le port lorsque vous avez terminé avec elle. Le garbage collector n'est pas la collecte de la première
SerialPort
de l'objet avant que vous essayez d'ouvrir une autre poignée. Modifier ce code::