Проблемы с Windows CE и последовательным портом (не удается открыть порт) - PullRequest
2 голосов
/ 25 ноября 2010

Я пытаюсь написать собственное приложение для устройства 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()

Что приводит в бешенство то, что примеры нативных кодов C ++, которые, как я обнаружил, работают, открывают порт без проблем, и я даже могу взглянуть на некоторые строки NMEA.Но все это было сделано с использованием примеров кодов C ++, представленных в Интернете, и я не чувствую себя достаточно опытным, чтобы основывать все свое приложение на этом языке.Я хотел бы придерживаться C #.

Есть ли другие способы открыть порт в C #, используя класс SerialPort в Windows CE?Или, возможно, полностью использовать другие классы?
Если нет, то, возможно, есть ли написанная на C ++ DLL, которая обеспечивает такую ​​же (или похожую) функциональность, доступную для Windows CE?получить это просто так.IOException.Отладчик Visual Studio мне больше ничего не говорит.Я не знаю, связано ли это с некоторыми неудачными настройками Windows CE на устройстве.Я действительно помню проблему со строками исключений на моем устройстве Windows Mobile, но она была решена путем добавления ссылки на System.SR, которую я уже пытался в этом случае.Если есть какой-то трюк, который мне не хватает в отношении Windows CE и сообщений об исключениях, я бы тоже хотел знать.;)

Я также пытался использовать код без событий и путем указания большего количества параметров в конструкторе, и я всегда получал исключение при попытке открыть порт.

НаконецЯ уже пытался добавить : к имени порта, что также не помогло.

Ответы [ 7 ]

1 голос
/ 18 марта 2012

У меня была такая же проблема, переустановил System_SR_ENU.cab и NETCFv2.Это работало без проблем впоследствии.

1 голос
/ 02 мая 2013

У меня была похожая проблема, и следующий код работал в моем случае. Мне нужно было получить доступ к последовательному порту из другого приложения хотя бы один раз, чтобы правильно его инициализировать. Я попытался открыть последовательный порт как обычный файл (обратите внимание, что я использовал «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();
1 голос
/ 26 ноября 2010

Я бы предложил предоставить больше опций конструктору; паритет, стоп-биты и режим рукопожатия.

SerialPort port = new SerialPort ("COM6", 9600, Parity.None, 8, StopBits.One);
port.Handshake = Handshake.None;
0 голосов
/ 24 августа 2011

Ни одно из предложенных решений не сработало. Эта одна часть осталась «недоступной». Мы обошли проблему через написанную на C ++ собственную DLL, которая открывает порт и читает с него данные.

Это решение вряд ли идеально, но это лучшее, что нам удалось придумать.

Это довольно "длинный" обход и предполагает, что в данном случае что-то не так с Compact Framework.

0 голосов
/ 10 января 2011

Не соответствует действительности двоеточие [Compact Framework 3.5 в Windows CE 6.0R3]. Я открываю свои последовательные порты просто с помощью «COMn» или «$ device \ COMn» для com-портов, где n> 9. Но похоже, что для версии OpenNetCf, которая была необходима для V1 Compact Framework, требовалось двоеточие.

Я предлагаю вызвать статический метод SerialPort.GetPortNames () и убедиться, что устройство, которое вы жестко запрограммировали как COM6, действительно доступно в возвращаемом строковом массиве.

0 голосов
/ 26 ноября 2010

Имя порта в CE должно быть дополнено двоеточием, поэтому измените его на «COM6:»

0 голосов
/ 26 ноября 2010

В настоящее время я не совсем уверен, но с помощью родного Win32 API вам пришлось вызывать устройство по имени COM6:, а не только COM6.Но я не знаю, как класс C # SerialPort ведет себя именно в этой точке.

Кроме того, я не думаю, что это проблема используемых параметров, потому что они появятся позже.Поэтому мое второе предположение заключается в том, что добавленные вами подписки на события могут привести к проблеме.Поэтому, чтобы быть абсолютно уверенным, я бы прокомментировал две строки, где вы подписались на ErrorReceived и DataReceived.

Также у меня был один раз и довольно странный сбой.Оглядываясь назад, мне показалось, что я неправильно написал имя порта, что символы не являются стандартными символами ANSI в моем кодовом файле для объявления имени порта.Поэтому после удаления и перезаписи конструктора проблема внезапно исчезла.

Последнее, но не менее важное, вы показали в своем коде, что StackTrace выдает WinIOError.Но не могли бы вы обновить свой вопрос и сообщить нам точный код ошибки или сообщение об ошибке?

...