Windows CE和串口问题(无法打开端口)

3
我正在尝试为GPS设备编写自定义应用程序,我需要读取GPS数据。
我遇到的问题是无法打开GPS端口。我知道它是哪个COM口,也知道波特率,但是每当我到达Open()方法时,就会出现IOException
port = new SerialPort("COM6", 9600);
port.ErrorReceived += new SerialErrorReceivedEventHandler(port_ErrorReceived);
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
try
{
    port.Open();
}
catch (IOException ex)
{
    SetLabel(label1, ex.Message);
}

堆栈跟踪:

at System.IO.Ports.SerialStream.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 PortTest.Form1.button1_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.ButtonBase.WnProc(WM wm, Int32 wParam, Int32 lParam)
at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam)
at Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain)
at System.Windows.Forms.Application.Run(Form fm)
at PortTest.Program.Main()

让事情变得非常令人恼火的是,我找到的一些本地C++代码确实有效,可以打开端口,甚至可以看到一些NMEA字符串。但是这些都是使用Web上提供的示例C++代码完成的,我不觉得自己熟练到可以在这种语言中构建整个应用程序。我想坚持使用C#。
是否有其他方法可以在Windows CE中使用SerialPort类打开端口?或者完全使用其他类?如果没有,是否有一个用C++编写的DLL可用于Windows CE,以允许相同(或类似)的功能?
编辑(更多细节):我收到的异常就是IOException。 Visual Studio调试器没有告诉我更多信息。我不知道这是否是由于设备上某些失败的Windows CE设置引起的。我确实记得我的Windows Mobile设备上有一个关于异常字符串的问题,但是通过添加对System.SR的引用解决了该问题,我在这种情况下已经尝试过了。如果关于Windows CE和异常消息还有一些我不知道的诀窍,我也很想知道。 ;)
我还尝试过在不使用事件并指定更多构造函数参数的情况下使用代码,并且每次尝试打开端口时都会收到异常。
最后,我已经尝试将端口名称添加到冒号,这也没有帮助。

请不要在主题中使用标签。并检查拼写。谢谢 :) - abatishchev
我并不是特意想让它成为一个标签,只是为了标题更加清晰。但你说得对。然而,我回滚的原因是因为你在标题中写了“probles”... >.< - MBender
7个回答

1

所有建议的解决方案都没有起作用。那个部分仍然是“无法打开的”。我们通过一个使用C++编写的本地DLL来解决了这个问题,该DLL打开端口并从中读取数据。

这个解决方案几乎不是理想的,但这是我们能想到的最好的方法。

这是一个相当“长”的解决方法,并且表明在这种特殊情况下Compact Framework存在问题。


1

我曾经遇到过同样的问题,重新安装了System_SR_ENU.cab和NETCFv2。之后就没有出现问题了。


1
我建议在构造函数中提供更多选项,如奇偶校验、停止位和握手模式。
SerialPort port = new SerialPort ("COM6", 9600, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.None;

1
我曾经遇到过类似的问题,以下代码在我的情况下有效。我必须至少从另一个应用程序访问串口一次以正确初始化它。我尝试像打开普通文件一样打开串口(请注意我使用了“COM8:”而不是“COM8”作为文件名)。
//The settings object is defined elsewhere...
settings.PortName = "COM8";

//Creates the serial port.
SerialPort port = new SerialPort();
port.PortName = settings.PortName;
port.BaudRate = settings.BaudRate;        
port.Parity = settings.Parity;
port.DataBits = settings.DataBits;
port.StopBits = settings.StopBits;
port.ReadTimeout = 10000;
port.DtrEnable = true;
port.RtsEnable = true;


string vComm = settings.PortName + ":";
FileStream stream = null;
try 
{
   stream = new FileStream(vComm, FileMode.Open, FileAccess.Read);
}
catch
{
   //pass    
}
port.Open();
if(stream != null)
    stream.Dispose();

0

在Windows CE 6.0R3上的Compact Framework 3.5中并不需要冒号。我只需使用"COMn"或"$device\COMn"来打开我的串口,其中n>9。但是看起来V1版本的Compact Framework所需的OpenNetCf版本需要冒号。

我建议调用静态方法SerialPort.GetPortNames(),确保您硬编码为COM6的设备实际上在返回的字符串数组中可用。


0

目前我不太确定,但是使用本地的Win32 API时,你必须通过名称COM6:而不仅仅是COM6来调用设备。但我不知道C# SerialPort类在这一点上的行为。

此外,我认为这不是使用的参数的问题,因为它们将在稍后发挥作用。所以我的第二个猜测是,您添加的事件订阅可能会导致问题。因此,为了绝对确定,我会注释掉您订阅ErrorReceivedDataReceived的两行代码。

另外,我曾经也遇到过一个非常奇怪的故障。回头看,似乎我以错误的方式编写了端口名称,使得字符不是我代码文件中声明端口名称的默认ANSI字符。因此,在删除并重新编写构造函数之后,问题突然消失了。

最后,你在你的代码中显示StackTrace抛出了一个WinIOError。但你能否更新你的问题并告诉我们确切的错误代码或错误消息?


0

在 CE 中,端口名称必须以冒号结尾,因此将其更改为 "COM6:"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接