这是我的第一个问题所以请在我提供足够或正确信息的地方纠正我。
我正在通过FTDI串口上的RS232端口将两个RFID标签读取器连接到我的程序的USB集线器。该程序在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
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,程序运行没有故障。
修改 当从标签阅读器传输数据时(当标签进入阅读器的阅读距离时),此错误仅在调试期间发生,仅 。这表示端口设置正确。
答案 0 :(得分:3)
例外情况是非常,它只是意味着一件事。端口已打开,无法再次打开。它可能是另一个过程,它可能是你自己的过程。
您可以使用特定于调试会话的标准错误是使用另一个程序来查看端口发送的数据。常见的做法是,您希望将此类程序显示的数据与您显示的数据进行比较,以查找不匹配情况。这个无法正常工作,你在开始自己的程序之前启动这个程序,它会打开端口,你的程序总会失败。您需要一种不同的实用程序来执行此操作,这是一种过滤器驱动程序,它在串行端口驱动程序之前注入自身并监视驱动程序请求。 Sysinternals的' PortMon就是一个例子。
仅当有来自标签阅读器的数据时
此评论非常麻烦,您必须始终在之前打开端口标签阅读器开始流数据。这暗示了一种非常不同的错误,应该从完整的堆栈跟踪中看到。某些情况下,DataReceived事件处理程序中的代码会导致再次调用Open()方法。由于DataReceived事件处理程序中的Begin / Invoke()调用,可能会隐藏得很好。
最后但同样重要的是,请确保从不重复调用Close()和Open()。 Close()调用实际上并不关闭串口,只有启动才能关闭它。内部工作线程需要退出,这需要时间。只在程序终止时调用Close()。
答案 1 :(得分:0)
你可以用这个列出所有可用的比赛:
List<string> portNames = SerialPort.GetPortNames().ToList();
if (portNames.FirstOrDefault(p => p.ToLower() == "COM9".ToLower()) != null){
//Connect
}
当com9可用时,您应该检查连接的参数,然后尝试连接您的端口。
编辑: SerialPort.GetPortNames仅显示应用程序的可用端口。当任何其他应用程序阻止时Com9,只显示其他Comports
答案 2 :(得分:-1)
您是否考虑过RFID协议处理导致的时序问题? 我会尝试检查哪种数据流向主机并返回。我知道在某些RFID协议中,时间(几乎)是一切。