为什么访问com口被拒绝?代码:staticvoidMain(string[]args){Console.WriteLine("Memorymappedfilereaderstarted");使用(varfile=MemoryMappedFile.OpenExisting("AIDA64_SensorValues")){使用(varreaderz=file.CreateViewAccessor(0,0)){varbytes=newbyte[567];varencoding=Encoding.ASCII;readerz.ReadArray(0,bytes,0,bytes.Length);File.WriteAllText("C:\myFile.txt",encoding.GetString(bytes));varreaderSettings=newXmlReaderSettings{ConformanceLevel=ConformanceLevel。片段};使用(varreader=XmlReader.Create("C:\myFile.txt",readerSettings)){while(reader.Read()){使用(varfragmentReader=reader.ReadSubtree()){if(fragmentReader.Read()){reader.ReadToFollowing("值");SerialPortport=newSerialPort("COM2",9600,Parity.None,8,StopBits.One);端口.Open();port.Write(reader.ReadElementContentAsString()+",");}}}}}}Console.WriteLine("按任意键退出...");Console.ReadLine();它读取共享内存,将共享内存写入文件,然后用xml阅读器打开同一个文件并拆分xml,因为它有多个根,然后在每个新的拆分xml上获取节点值并通过串行发送它工作对于第一个拆分xml,它的节点通过串行端口发送,然后停止,同时尝试将第二个节点写入串行端口,它拒绝访问com端口消息。我有另一个应用程序,我在其中使用相同的串行代码并且工作正常(我只是累了并关闭它。)......所以很奇怪。串口只能打开一次。但是您的代码在while循环中调用了Open()。这只适用于第一次通过循环,kaboom在第二次通过。@cdhowie的解决方案也不起作用,SerialPort有一个文档警告的怪癖(又名错误)。在Dispose()或Close()调用之后,工作线程退出需要时间。时间量是未指定且不可预测的。真正的解决方案很简单,只需将Open()调用移到while循环之前。除了汉斯的回答:我在打开和关闭串口之间的一些睡眠时间也遇到了同样的问题。在我的例子中,250毫秒就足够了。也许这会帮助那里的人。编辑:我优化了我的解决方案,这就是我想出的:intmaxRetries=20;constintsleepTimeInMs=50;stringloggingMessage=string.Empty;while(maxRetries>0){try{loggingMessage="打开串口'"+mSerialPort.PortName+"'...";mSerialPort.Open();loggingMessage+="成功。";IOLogger.LogInfo(loggingMessage);}catch(UnauthorizedAccessExceptionunauthorizedAccessException){maxRetries--;loggingMessage+="失败(UnauthorizedAccessException):";IOLogger.LogError(string.Format(loggingMessage+unauthorizedAccessException.Message+"->大约{0}毫秒后重试...",sleepTimeInMs));Thread.Sleep(sleepTimeInMs);}catch(Exception异常){loggingMessage+="Failed:";IOLogger.LogError(loggingMessage+exception.Message);您可以使用sleepTimeInMs和/或maxRetries。我选择这些值是因为它们似乎足以满足任何所需的用例。汉斯的回答取代了这个;我把它留给上下文和仅供参考。完成后需要关闭端口。垃圾收集器在尝试打开另一个句柄之前没有收集第一个SerialPort对象。更改此代码:SerialPortport=newSerialPort("COM2",9600,Parity.None,8,StopBits.One);端口.Open();port.Write(reader.ReadElementContentAsString()+",");to:以上是C#学习教程:为什么访问com端口被拒绝?所有分享的内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——using(SerialPortport=newSerialPort("COM2",9600,Parity.None,8,StopBits.One))){端口.Open();port.Write(reader.ReadElementContentAsString()+",");}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
