Windows CE and serial port problems (can't open port)
I'm trying to write a custom application for a GPS device, and I need to read the GPS data.
The problem I'm facing is that I cannot open the GPS port. I know which COM it is, and I know the baud rate, but I get an IOException
whenever I get to the Open()
method.
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);
}
Stack trace:
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()
What makes matters quite infuriating is that a sample native C++ codes that I found DOES work, opens the port without problems, and I could even glance at some of the NMEA strings. But this was all done using sample C++ codes provided around the Web, and I don't feel proficient enough to base my entire application in this language. I'd like to stick to C#.
Are there any other ways to open a port in C# using the SerialPort
class in Windows CE? Or perhaps using other classes entirely?
EDIT (for more details):
The exception I get is just that. IOException. The Visual Studio debugger tells me nothing more. I don't know if this is due to some botched Windows CE setting on the device. I DO remember a problem with exception strings on my Windows Mobile device, but that was solved by adding a reference to System.SR
, which I already tried in this case. If there's some trick I'm missing with regards to Windows CE and exception messages, I'd love to know too. ;)
I've also tried to use the code without events and by specifying more parameters in the constructor, and I'd always get the exception when trying to open the port.
Finally, I've already tried adding a : to the port name, which also didn't help.
I'd suggest providing more options to the constructor; parity, stop bits and handshake mode.
SerialPort port = new SerialPort ("COM6", 9600, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.None;
None of the suggested solutions worked. That one part remained "unopenable". We got around the issue through a C++ written native DLL which opens the port and read data from it.
This solution is hardly ideal, but it's the best we managed to come up with.
This is a rather "long" walkaround, and suggests that something is wrong with Compact Framework in this particular case.
I had the same problem, reinstalled System_SR_ENU.cab and NETCFv2. It worked without problems afterwards.
I had a similar problem and the following code worked in my case. I had to access the serial port from another application at least once in order to initialize it properly. I tried to open the serial port as a normal file(notice that I used "COM8:" instead of "COM8" for the file).
//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();
Currently i'm not quite sure, but by using the native Win32 API you had to call the device by the name COM6:
and not only COM6
. But i don't know how the C# SerialPort class behaves in this point exactly.
Additionally i don't think that it is a problem of the used parameters, cause they will come later into play. So my second guess would be that your added event subscriptions could maybe lead to a problem. So just to be absolutely sure i would comment the two lines where you subscribe to ErrorReceived
and DataReceived
.
Also i had one time also a quite bizarre failure. Looking backwards it seemed that i wrote the port name in that way wrong, that the characters are not the default ANSI chars in my code file for declaring the port name. So after deleting and rewriting the constructor the problem was suddenly gone.
Last but not least you showed in your code that the StackTrace throwed an WinIOError
. But could you maybe update your question and tell us the exact error code or error message?
The port name in CE must be suffixed with a colon, so chane it to "COM6:"
Not true that a colon is required [Compact Framework 3.5 on Windows CE 6.0R3]. I open my serial ports with just "COMn" or "$device\COMn" for com ports where n > 9. But it looks like the OpenNetCf version that was needed for V1 of Compact Framework needed the colon.
I suggest calling the static method SerialPort.GetPortNames() and making sure that the device you have hard-coded as COM6 is in fact available in the returned string array.
精彩评论