[英]“The port COMx does not exist” - Exception thrown on Open() of SerialPort
[英]SerialPort port.open “The port 'COM2' does not exist.”
我遇到了SerialPort.Open();
一个大问题SerialPort.Open();
我正在与USB虚拟COM端口(cdc)进行通信,它被列为COM2。
它在TeraTerm / hyperTerminal等中工作正常。 但是当我尝试在C#中打开端口时,它给了我异常The port 'COM2' does not exist
。
我使用SerialPort.GetPortNames()
函数获取端口名称,并且在调试时它看起来很好。
我试图将名称设置为硬编码,但没有运气。
现在真的很奇怪,它在某些PC上工作正常,而在其他PC上则失败了。 在某些PC上它会一直失败,而在其他PC上它会失败10%的时间。
更奇怪的是它取决于所使用的USB端口,一些端口工作正常,其他端口失败(在同一台PC上!)。
请问有人帮帮我吗?
我之前使用过虚拟串口。 通常,它们不能作为“COMX:”访问某些Windows API调用,您必须完全指定它们。 这可能就是这种情况。 尝试使用串行设备的Windows设备命名空间路径。 例如:“\\\\。\\ COM2”
我发现调试有用的另一件事是在给定的串口上打开Hyperterm。
最后一件事:为了在没有所有硬件的系统上调试逻辑,我找到了这个名为com0com的精彩程序。 它是一个GPL Sourceforge项目,可在您的系统上创建绑定的虚拟COM端口对。 无论写入哪一个都可以从另一个读取,反之亦然。 你可以编写一个模拟器并给它一个端口,或者只打开它上面的Hyperterm。 然后将另一个给你的程序。 无需电缆或其他硬件进行测试。
如果驱动程序为“COM2”返回意外的“文件类型”,则可能导致此错误。
尝试p /调用GetFileType ,我相信你会看到模式。 它必须是FILE_TYPE_CHAR
或FILE_TYPE_UNKNOWN
,否则SerialPort
将抛出该异常。
class Program
{
static void Main(string[] args)
{
string portName = @"COM2";
IntPtr handle = CreateFile(portName, 0, 0, IntPtr.Zero, 3, 0x80, IntPtr.Zero);
if (handle == (IntPtr)(-1))
{
Console.WriteLine("Could not open " + portName + ": " + new Win32Exception().Message);
Console.ReadKey();
return;
}
FileType type = GetFileType(handle);
Console.WriteLine("File " + portName + " reports its type as: " + type);
Console.ReadKey();
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr SecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll")]
static extern FileType GetFileType(IntPtr hFile);
enum FileType : uint
{
UNKNOWN = 0x0000,
DISK = 0x0001,
CHAR = 0x0002,
PIPE = 0x0003,
REMOTE = 0x8000,
}
}
另请参阅MSDN论坛上的此主题 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.