На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> Работа с GPS под CF 1.1, COM порт, GPS, чтение данных, КПК, Pocket PC, Framework 1.1
    Это не вопрос. Это пост для тех, кто захочет написать что-нибудь с GPS. Думаю, я достаточно его оформил, чтобы в поиске было легче найти =)

    Нашел решение - помоги другому.

    Итак, нам надо "припаять" GPS к программе. У нас есть КПК с GPS модулем на COM порту, подключенном, к примеру, на COM8. Действия:

    1) Качаем сырцы для чтения данных с COM порта OpenNETCF.IO.Serial.
    http://www.opennetcf.com/sharedsource/serial.ocf
    или прямой линк для ленивцев - http://www.opennetcf.com/downloads/download.aspx?s=OpenNETCF.IO.Serial

    2) Распаковываем скачанный архив в "куда-нибудь".
    Достаем оттуда файлы:
    СommAPI.cs
    DCB.cs
    Port.cs
    PortCapabilities.cs
    PortSettings.cs
    И копируем в папку проекта.

    3) Добавляем эти файлы (в среде MS VS) в проект (Project->Add Existing Item)

    4) В using ваших файлов проекта добавляем
    ExpandedWrap disabled
      using System.Threading;


    5) Пользуемся. А вот тут поподробнее:

    ExpandedWrap disabled
          public class Form1 : System.Windows.Forms.Form
          {
              // COM port variables
              public static Int32 COM_PORT = 8;
              public static Int32 COM_RATE = 115200;
              public static Int32 COM_THRESHOLD = 1;
              public static Int32 COM_BUFFER = 1024;
              public static Port COM_port;
              private DetailedPortSettings COM_portSettings;
              public static string COM_SERBUF = "";
              byte[] COM_PORT_BUFFER = new byte[4096];
              public static int COM_PORT_SLEEP = 20;
              // ...
       
      public Form1()
              {
                  InitializeComponent();
                  // initialize COM port
                  // порт просто инициализируется, но не подключается и данные с него в программу не поступают
                  COM_portSettings = new HandshakeNone();
                  COM_port = new Port("COM8:", COM_portSettings);
                  COM_port.RThreshold = COM_THRESHOLD;
                  COM_port.InputLen = COM_BUFFER;
                  COM_port.SThreshold = COM_THRESHOLD;
                  COM_port.DataReceived += new Port.CommEvent(COM_port_DataReceived);
                  COM_port.OnError += new Port.CommErrorEvent(COM_port_OnError);
              }
       
      //обработчик ошибок
      private void COM_port_OnError(string Description)
              {
                  this.Invoke(new EventHandler(COM_DoSerialError));
              }
       
      //обработчик ошибок
              private void COM_DoSerialError(object s, EventArgs e)
              {
              }
       
      //функция, которая включает СОМ
              private void COM_Connect()
              {
                  try
                  {
                      if (COM_port.IsOpen)
                      {
                          COM_port.Close();
                          Thread.Sleep(COM_PORT_SLEEP);
                      }
                      if (COM_PORT <= 9)
                          COM_port.PortName = "COM" + COM_PORT + ":";
                      else
                          COM_port.PortName = "\\\\.\\COM" + COM_PORT;
                      switch (COM_RATE)
                      {
                          case 300: COM_port.Settings.BaudRate = BaudRates.CBR_300; break;
                          case 600: COM_port.Settings.BaudRate = BaudRates.CBR_600; break;
                          case 1200: COM_port.Settings.BaudRate = BaudRates.CBR_1200; break;
                          case 2400: COM_port.Settings.BaudRate = BaudRates.CBR_2400; break;
                          case 4800: COM_port.Settings.BaudRate = BaudRates.CBR_4800; break;
                          case 9600: COM_port.Settings.BaudRate = BaudRates.CBR_9600; break;
                          case 14400: COM_port.Settings.BaudRate = BaudRates.CBR_14400; break;
                          case 19200: COM_port.Settings.BaudRate = BaudRates.CBR_19200; break;
                          case 38400: COM_port.Settings.BaudRate = BaudRates.CBR_38400; break;
                          case 56000: COM_port.Settings.BaudRate = BaudRates.CBR_56000; break;
                          case 57600: COM_port.Settings.BaudRate = BaudRates.CBR_57600; break;
                          case 115200: COM_port.Settings.BaudRate = BaudRates.CBR_115200; break;
                      }
                      COM_Log("Opening port " + COM_port.PortName);
                      COM_port.Open();
                      Thread.Sleep(COM_PORT_SLEEP);
                      COM_Log("OK");
                  }
                  catch (System.Exception ex)
                  {
                      COM_Log("ERROR: " + ex.Message);
                      MessageBox.Show("An error occured when trying to open COM port:\r\n" + ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
                  }
              }
       
       
      функция-обработчик при поступлении данных с порта
              private void COM_port_DataReceived()
              {
                  this.Invoke(new EventHandler(COM_DoSerialUpdate));
              }
       
      //чтение данных с порта
              private void COM_DoSerialUpdate(object s, EventArgs e)
              {
                  if (!COM_port.IsOpen) return;
       
                  Thread.Sleep(COM_PORT_SLEEP);
       
                  COM_PORT_BUFFER = COM_port.Input;
                  Encoding enc = Encoding.ASCII;
                  string line = enc.GetString(COM_PORT_BUFFER, 0, COM_PORT_BUFFER.Length);
                  //
                  //берем данные из переменной line
                  //
                  }
                  else
                  {
                      //leave
                  }
                  
              }
       
      конпка на форме для запуска СОМ порта
              private void button6_Click(object sender, EventArgs e)
              {
                  COM_Connect();
              }


    Надеюсь, достаточно ясно для тех, кому это понадобится.
    Если что-то не понятно - вопрос тут. На эту тему я подписан.

    Добавлено
    Удачи с COM портом! С GPS данными, надеюсь, разберетесь сами.
    А если не разберетесь - в этом же архиве есть папочка GPS. Там есть файлик а в нем есть функция nmea(). Ищите ее, разбирайте и используйте!
    Мой текущий проект http://baphomethpge.blogspot.com

    Разве не прелесть? =)))
    ExpandedWrap disabled
      >>> bool b; if (b.ToString().Length==4) MessageBox.Show("True!");
      >>> if (0 < -this.Position.Y) {...}

    ExpandedWrap disabled
      >>>for i:= 100 to round(d) do scaleMap:=scaleMap-0.003;
      p.s. линки не пашут...
      http://www.opennetcf.com/sharedsource/serial.ocf
      http://www.opennetcf.com/downloads/downloa...NETCF.IO.Serial
        Пробуй искать прямо через www.opennetcf.com
        И вообще лучше писать все же под CF 2.0
        Мой текущий проект http://baphomethpge.blogspot.com

        Разве не прелесть? =)))
        ExpandedWrap disabled
          >>> bool b; if (b.ToString().Length==4) MessageBox.Show("True!");
          >>> if (0 < -this.Position.Y) {...}

        ExpandedWrap disabled
          >>>for i:= 100 to round(d) do scaleMap:=scaleMap-0.003;
          Цитата Slukad @
          Это не вопрос. Это пост для тех, кто захочет написать что-нибудь с GPS. Думаю, я достаточно его оформил, чтобы в поиске было легче найти =)

          Оформил-то просто зашибись, только к GPS это имеет примерно такое же отношение, как и к балету... Для GPS первичнее NMEA, а не "как считать данные с COM-порта" :wacko:
          Среднестатистический житель Петербурга различает до двух с половиной тысяч оттенков серого
          ლ(ಠ益ಠლ) ( ͡- ͜ʖ ͡-) ( ͡° ͜ʖ ͡°) (╯°□°)╯ ¯\_(ツ)_/¯༼ ຈل͜ຈ༽
            Да ладно Вам. Человек то постарялся. и ответил на те вопросы, которые лично для него стали самой большой проблемой.
            ... А сегодня что для завтра сделал я?

            Brainbench Transcript ID#: 7848137
              Тема называется
              Работа с GPS под CF 1.1, COM порт, GPS, чтение данных, КПК, Pocket PC, Framework 1.1

              Это, ИМХО, подразумевает в первую очередь подключение GPS.

              Но ты прав - нужна NMEA. Заглянем в архив, на который я дал ссылку и увидим, что там есть папка GPS, где есть код для работы именно с GPS данными. Включая парсинг сырой инфы прямо с COM порта =)

              Кто теперь не прав, а? А? =)))

              Добавлено
              P.S. Ссылки пашут
              Мой текущий проект http://baphomethpge.blogspot.com

              Разве не прелесть? =)))
              ExpandedWrap disabled
                >>> bool b; if (b.ToString().Length==4) MessageBox.Show("True!");
                >>> if (0 < -this.Position.Y) {...}

              ExpandedWrap disabled
                >>>for i:= 100 to round(d) do scaleMap:=scaleMap-0.003;
                Slukad , Огромное спасибо!!!!
                Это просто безценная инфа и примеры.
                Всё работает.

                пысы
                Даже не представляете скока я промучился на разных языках пока ненашел эту ветку
                тут хоть и есть несколько опечаток но после исправления все ЗАРАБОТАЛО!!!)))
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script Execution time: 0,1036 ]   [ 15 queries used ]   [ Generated: 17.10.19, 20:25 GMT ]