我正在尝试为GPS设备编写自定义应用程序,我需要读取GPS数据。
我面临的问题是我无法打开GPS端口。我知道它是哪个COM,我知道波特率,但每当我进入IOException
方法时,我都会得Open()
。
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()
令人感到非常愤怒的是,我发现DOES正常工作的原生C ++代码示例,打开端口没有问题,我甚至可以浏览一些NMEA字符串。但这一切都是使用Web上提供的示例C ++代码完成的,而且我觉得不够熟练,无法将整个应用程序基于这种语言。我想坚持使用C#。
有没有其他方法可以在Windows CE中使用SerialPort
类在C#中打开端口?或者也许完全使用其他课程?
如果没有,是否有一个C ++编写的DLL允许相同(或类似)的功能可用于Windows CE?
编辑(更多细节):
我得到的例外就是这样。 IOException异常。 Visual Studio调试器不再告诉我。我不知道这是否是由于设备上的一些拙劣的Windows CE设置。我记得我的Windows Mobile设备上有异常字符串的问题,但是通过添加对System.SR
的引用来解决这个问题,我在这种情况下已经尝试过了。如果有一些关于Windows CE和异常消息的技巧,我也很想知道。 ;)
我还试图在没有事件的情况下使用代码,并在构造函数中指定更多参数,并且在尝试打开端口时我总是得到异常。
最后,我已经尝试在端口名称中添加:,这也没有帮助。
答案 0 :(得分:1)
我建议为构造函数提供更多选项;奇偶校验,停止位和握手模式。
SerialPort port = new SerialPort ("COM6", 9600, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.None;
答案 1 :(得分:1)
我遇到了同样的问题,重新安装了System_SR_ENU.cab和NETCFv2。之后它没有问题。
答案 2 :(得分: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();
答案 3 :(得分:0)
目前我不太确定,但是通过使用原生Win32 API,您必须使用名称COM6:
调用设备,而不仅仅是COM6
。但我不知道C#SerialPort类在这一点上的表现如何。
此外,我不认为这是使用过的参数的问题,因为它们将在以后发挥作用。所以我的第二个猜测是你添加的事件订阅可能会导致问题。所以,为了绝对肯定我会评论您订阅ErrorReceived
和DataReceived
的两行。
此外,我还有一次非常奇怪的失败。向后看,我似乎错误地写了端口名称,这些字符不是我的代码文件中用于声明端口名称的默认ANSI字符。因此,在删除并重写构造函数之后,问题突然消失了。
最后但并非最不重要的是,您在代码中显示StackTrace抛出WinIOError
。但是,您可以更新您的问题并告诉我们确切的错误代码或错误消息吗?
答案 4 :(得分:0)
CE中的端口名称必须以冒号为后缀,因此将其变为“COM6:”
答案 5 :(得分:0)
不需要冒号[Windows CE 6.0R3上的Compact Framework 3.5]。我打开我的串口只有“COMn”或“$ device \ COMn”的com端口,其中n> 9.但看起来Compact Framework的V1所需的OpenNetCf版本需要冒号。
我建议调用静态方法SerialPort.GetPortNames(),并确保硬编码为COM6的设备实际上在返回的字符串数组中可用。
答案 6 :(得分:0)
所提出的解决方案均无效。那一部分仍然是“不可开启的”。我们通过C ++编写的本机DLL解决了这个问题,它打开了端口并从中读取数据。
这个解决方案并不理想,但它是我们设法提出的最佳解决方案。
这是一个相当“漫长”的解决方案,并表明在这种特殊情况下Compact Framework出现了问题。