Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调试期间无法访问串行端口_C#_Serial Port_Rfid - Fatal编程技术网

C# 调试期间无法访问串行端口

C# 调试期间无法访问串行端口,c#,serial-port,rfid,C#,Serial Port,Rfid,这是我的第一个SO问题,请纠正我没有提供足够或正确信息的地方 我正在通过FTDI串行至USB集线器上的RS232端口将两个RFID标签阅读器连接到我的程序。该程序在VS2010之外运行得非常好,但我无法调试代码。程序在调试过程中启动良好,但一旦我将标记置于读取范围内,就会出现错误。这只在调试期间发生 错误: Error Opening Serial Port COM9 System.UnauthorizedAccessException: Access to the port 'COM9' i

这是我的第一个SO问题,请纠正我没有提供足够或正确信息的地方

我正在通过FTDI串行至USB集线器上的RS232端口将两个RFID标签阅读器连接到我的程序。该程序在VS2010之外运行得非常好,但我无法调试代码。程序在调试过程中启动良好,但一旦我将标记置于读取范围内,就会出现错误。这只在调试期间发生

错误:

Error Opening Serial Port COM9

System.UnauthorizedAccessException: Access to the port 'COM9' is denied.

   at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)

   at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)

   at System.IO.Ports.SerialPort.Open()

   at Tag_Reader.COMs.openPort(String sPortName) in C:\XXX\Tag_Reader\COMs.cs:line 36
通信系统:第36行:

 _port.PortName = sPortName;
 _port.BaudRate = 9600;
 _port.DataBits = 8;
 _port.Parity = Parity.None;
 _port.StopBits = StopBits.One;
 _port.ReadTimeout = 500;
 _port.WriteTimeout = 500;
 _port.Open();
我将感谢任何帮助!如上所述,如果我在VS.exe外部运行.exe,程序运行时不会出现故障

编辑:
此错误仅在调试期间发生,并且仅在从标签读取器传输数据时发生(当标签位于读取器的读取范围内时)。这表明端口设置正确

您可以使用以下命令列出所有可用组件:

List<string> portNames = SerialPort.GetPortNames().ToList();
                if (portNames.FirstOrDefault(p => p.ToLower() == "COM9".ToLower()) != null){
//Connect

}
List portNames=SerialPort.GetPortNames().ToList();
if(portNames.FirstOrDefault(p=>p.ToLower()==“COM9.ToLower())!=null){
//连接
}
当com9可用时,您应该检查连接参数,然后尝试连接端口

编辑:
SerialPort.GetPortNames仅显示应用程序的可用端口。当任何其他应用程序块(例如Com9)时,仅显示其他组件

异常是非常具体的,它只意味着一件事。端口已打开,无法再次打开。这可能是另一个过程,也可能是你自己的过程

对于调试会话,您可能会犯的一个标准错误是使用另一个程序查看端口发送的数据。通常情况下,您会希望将此类程序显示的数据与您显示的数据进行比较,以查找不匹配的情况。这无法工作,您在启动自己的程序之前启动这样的程序,它将打开端口,并且您的程序将始终失败。要做到这一点,您需要一种不同的实用程序,一个过滤器驱动程序,它在串行端口驱动程序之前注入自身,并监视驱动程序请求。SysInternals的PortMon就是一个例子

仅当有数据从标签读取器流式传输时,才有任何

此注释非常麻烦,在标签读取器开始流式传输数据之前,您当然必须始终打开端口。这暗示了一种非常不同的bug,应该可以从完整的堆栈跟踪中看到。DataReceived事件处理程序中的代码导致再次调用Open()方法的某些场景。由于DataReceived事件处理程序中的Begin/Invoke()调用,可能隐藏得很好


最后但并非最不重要的一点是,一定不要重复调用Close()和Open()。Close()调用实际上并没有关闭串口,它只是开始关闭串口。内部工作线程需要退出,这需要时间。仅在程序终止时调用Close()。

您是否考虑过由于RFID协议处理而导致的计时问题?

我会尝试检查什么样的数据流向主机和返回主机。我知道,在某些RFID协议中,计时(几乎)是一切。

您确定您的设备有可用的com9吗?确保com9是连接到读卡器的端口,并检查设备手册中有关波特率的信息。此错误仅在调试期间发生,以确认端口设置正确。只有当有数据从标签读取器传输时(当标签被带到读取器的阅读范围内时),才有任何问题。谢谢您的回复!不幸的是,没有其他程序使用该端口(这将使事情变得更容易…)。但是,我确实多次打开()和关闭()端口,我将查看并修复它。真正困扰我的是,这只发生在VS中的调试模式中。删除多个Open()和Close()非常有效!谢谢