C # последовательная связь с U-Blox GPS - PullRequest
4 голосов
/ 12 ноября 2008

У меня есть GPS от u-blox.com с USB-соединением и драйвером. Драйвер устанавливает виртуальный COM-порт, который появляется при подключении USB. С помощью гипертерминала я могу наблюдать за потоком данных с GPS.

Тогда мне нужны данные в моей программе, не так просто ...

Я реализовал некоторые методы, используя класс serialPort для чтения с GPS, но безуспешно. Ранее я запрограммировал несколько устройств чтения и записи последовательных устройств на C #, но это останавливает меня.

Например, простой код в simpleSerial не даст вам ничего, если вы не отключите и не подключите USB.

Попробовал прочитать его с помощью matlab, который прекрасно работает, но, поскольку остальная часть моей программы, которая нуждается в данных GPS, находится в c #, это не совсем решает проблему.

Есть ли какие-то вещи высокого уровня в C #, происходящие в классе serialPort, которые я могу обойти? Или есть какие-то известные проблемы с чтением USB-последовательных портов, которые, как я полагаю, работают как мой GPS?

Ответы [ 9 ]

1 голос
/ 27 августа 2009

Получено от поддержки u-blox.

Следующая шестнадцатеричная команда принудительно сбросит сторожевой таймер на модуле GPS.

B5 62 06 04 04 00 00 00 00 00 0E 64

это команда низкого уровня для ARM7 uP в GPS Работает со всеми GPS-приемниками u-blox.

byte[] data = new byte[]{0xB5, 0x62, 0x06, 0x04, 0x04, 0x00,
                         0x00, 0x00, 0x00, 0x00, 0x0E, 0x64}; 
sp.Write(data, 0, data.Length);

Это работает для меня.

1 голос
/ 13 ноября 2008

Я успешно использовал класс SerialPort в .Net 2, также с gps на виртуальном компорте. Кажется, ваш драйвер виртуального компорта немного отключен. Если вы не можете найти более новый драйвер, я бы посоветовал вам вызвать функции WinAPI для чтения последовательного порта.

Взгляните на этот код, например: http://www.codeproject.com/KB/system/SerialPortComm.aspx

1 голос
/ 13 ноября 2008

Если вы можете общаться с GPS с помощью HyperTerminal, то в принципе нет причин, по которым вы не сможете этого делать в C #. Вы уверены, что правильно настроили последовательный порт, в частности скорость передачи, биты данных, стоп-биты, четность и настройки управления потоком?

Вы можете использовать инструмент SysInternals PortMon , чтобы посмотреть на низкоуровневый ввод-вывод и сравнить, как HyperTerminal и ваша программа C # конфигурируют последовательный порт. Может быть, это даст некоторую полезную информацию.

0 голосов
/ 22 августа 2010

Попробуйте использовать рукопожатия / контроль потока. Они также полезны при использовании USB-последовательного адаптера.

0 голосов
/ 18 марта 2009

У UT-Blox GPS возникла та же проблема, но ее удалось решить, включив свойства DTR и RTS. Теперь я могу читать предложения NMEA просто отлично. Одна проблема, которую я обнаружил, заключается в том, что мне все еще приходится время от времени снимать и подключать GPS к порту USB. Надеюсь, это поможет.

0 голосов
/ 27 февраля 2009

Я использовал следующий код для связи через USB с Arduino, он отправляет и получает байт от Arduino. Это просто и не говорит с GPS, но, надеюсь, это как-то поможет!

    public static byte ReadByte()
    {
        byte byteRead = new byte();
        SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
        port.Open();
        int byteValue = port.ReadByte();
        port.Close();

        byteRead = Convert.ToByte(byteValue);

        return byteRead;
    }

    public static void SendByte(byte packet)
    {
        SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
        port.Open();
        byte[] writeByte = new byte[1];
        writeByte[0] = packet;
        port.Write(writeByte, 0, 1);
        port.Close();
    }
0 голосов
/ 27 февраля 2009

Проблема заключается в том, что существует ошибка в драйверах последовательного порта USB или в реализации Microsoft их классов SerialPort. У меня были точно такие же проблемы с адаптерами USB-Serial, использующими микросхемы, изготовленные Prolific (и, следовательно, драйверы от Prolific).

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

Обходной путь - использовать другой класс последовательного доступа. До .Net 2.0 я написал класс SerialStream и по какой-то причине он, кажется, прекрасно работает с теми же адаптерами USB-Serial, с которыми класс SerialPort не будет работать.

Вы можете взять мой класс по адресу http://www.6bit.com/download/SerialStream.zip. Я предоставлял этот же код некоторым коллегам-программистам GPS на протяжении многих лет, и они также добились успеха.

0 голосов
/ 02 декабря 2008

Не уверен, что это та же проблема, с которой вы столкнулись.

Я заметил, что если RX_FLAG используется с API SetCommMask, то GetOverlappedResult, похоже, не возвращается после первого WaitCommEvent. Похоже, что API ждет, пока что-то произойдет, пока маска ком не будет сброшена (по крайней мере, это то, что я наблюдал). Тем не менее, все еще есть некоторые данные, полученные, если вы идете и читаете порт, после которого устройство больше не отвечает. В этом случае вам потребуется отключить и снова подключить устройство, чтобы оно снова отвечало.

Однако, если вместо этого используется RX_CHAR, GetOverLappedResult возвращается с правильным состоянием, и устройство работает как обычно.

Надеюсь, эта информация поможет.

0 голосов
/ 13 ноября 2008

Я столкнулся с подобной проблемой в приложении, которое писал, и проблема заключалась в том, что я пытался нам SerialPort.WriteLine, который отправляет \r\n для завершения строки, когда мне действительно нужно было просто отправить \n. Когда я переключился на SerialPort.Write с добавленным \n в конце, все работало как в HyperTerminal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...