这是我的第一个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:XXXTag_ReaderCOMs.cs:line 36
COMs.cs: 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,程序运行时不会出现故障。编辑:此错误仅在调试期间发生,而仅在标签读取器有数据流时(当标签在读取器的读取范围内时)才会发生。这表明端口设置是正确的。
异常非常特定,它只意味着一件事。端口已经打开,不能再打开。这可能是另一个过程,也可能是你自己的过程。
您可能犯的使其特定于调试会话的标准错误是使用另一个程序来查看端口发送的数据。通常的做法是,您希望将此类程序显示的数据与您所显示的数据进行比较,以查找不匹配之处。这个不能工作,你在启动你自己的程序之前启动这样的程序,它会打开端口,你的程序总是会失败。您需要一种不同类型的实用程序来做到这一点,一个过滤器驱动程序,它在串行端口驱动程序之前注入自己并监视驱动程序请求。例如SysInternals的PortMon。
只有当有数据从标签读取器流出
这个注释非常麻烦,在标签阅读器开始流式传输数据之前,您当然必须始终打开端口。这暗示了一种非常不同的bug,应该可以从完整的堆栈跟踪中看到。DataReceived事件处理程序中的代码导致再次调用Open()方法的场景。可能由于在DataReceived事件处理程序中调用Begin/Invoke()而被很好地隐藏。
最后但并非最不重要的是,确保永远不要重复调用 Close()和Open()。Close()调用实际上并不关闭串行端口,它只是启动来关闭它。内部工作线程需要退出,这需要时间。只在程序结束时调用Close()
你可以列出所有可用的格式:
List<string> portNames = SerialPort.GetPortNames().ToList();
if (portNames.FirstOrDefault(p => p.ToLower() == "COM9".ToLower()) != null){
//Connect
}
当com9可用时,您应该检查连接的参数,然后尝试连接您的端口。编辑:串口。GetPortNames只显示应用程序可用的端口。当任何其他应用程序阻塞时,例如Com9,只有其他Comports将被显示
您是否考虑过由于RFID协议处理而导致的时间问题?
我将尝试检查哪些数据流向主机并返回。我知道在一些RFID协议中,时间(几乎)是一切。