COM порт Delphi

Тема в разделе "Arduino & Shields", создана пользователем seregka174, 13 мар 2013.

  1. seregka174

    seregka174 Нуб

    Хочу связать ардуино с delphi и в том и том новичек. Нашел компонент порта, написал простой терминальчик. Отправляет и принимает все чудесно но вот в чем беда: когда в порт поступают данные срабатывае процедура, процедура возвращает переменную strig с данными с порта. Размер ее всегда разный от 2 до 900 символов.Когда я вывожу их через memo.text=memo.text+strig все работает. А вот как мне складывать ее и выделять из этого потока нужные мне данные. Например приходит А31+5В52С475+D12 после слияния и выделения у меня переменные А:=315 В:=52 С:=475 Может там какие маркеры начала конца или как все провернуть не знаю
     
  2. HighDigital

    HighDigital Гик

    Я конечно в delphi не разбираюсь, но обязательно сразу все посылать в порт? может по очереди высылать и обрабатывать?
     
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    Маркеры начала и конца пакета Вы сами должны поставить при отправке.
    Например, первым байтом ставите маркер начала, затем длину пакета и сами данные, а в конце контрольную сумму - сумму всех байт пакета (берется только младший байт суммы либо сумма считается по модулю).
    Другими словами, вам нужно придумать свой протокол.
    Отсылка по очереди ничего не даст - данные могут придти как угодно в порт, ОС может свои задержки поставить или склеить 2 посылки вместе.
    Принимайте данные в виде байтов, а не строк.
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    А Дельфи тут совершенно ни при чем. Порт есть порт - байт отправили, байт приняли.
    Контролировать целостность пакета надо всегда, рано или поздно проскочит помеха и исказит данные - вот тут-то контрольная сумма и поможет забраковать и отбросить пакет.
     
  5. HighDigital

    HighDigital Гик

    Ну может вы и правы. :)
     
  6. seregka174

    seregka174 Нуб

    Нужен простенький алгоритмик: например состояния датчиков света, тепла и т.д. передать в Delphi. На мой взгляд данный алгоритм будет полезен и в обратном направлении.
     
  7. seregka174

    seregka174 Нуб

    Мож совместно что либо придумаем ?! Мне кажется это будет много кому интересно. Небольшой протокол для обмена данными с программами. Если чиркнуть скетч для Ардуино, то по основным критериям его любой сможет перевести в обратную сторону для своей удобной платформы.
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Да тут и придумывать нечего...
    Допустим, нам нужно отправить 3 байта:

    Код (Text):
    #define HEAD 0x55 // заголовок пакета
    #define DATA_LENGTH 3 // количество байт данных в пакете
     
    byte packet[DATA_LENGTH + 3]; // буфер для сборки пакета
     
    void buildPacket(byte* data)
    {
      packet[0] = HEAD;
      packet[1] = DATA_LENGTH;
      int controlSumm = 0;
      for(int i = 0; i < DATA_LENGTH; i++)
      {
        packet[2 + i] = data[i];
        controlSumm += data[i];
      }
     
      packet[2 + DATA_LENGTH] = (byte)controlSumm;
    }
    Остается только отправить пакет в порт.
     
  9. seregka174

    seregka174 Нуб

    Со сборкой пакета понятно, а вот его сборка при приеме? С отправкой в обратную сторону заголовка и контрольной суммы для проверки целостности.
     
  10. Unixon

    Unixon Оракул Модератор

    С какой такой отправкой обратно?
     
  11. Megakoteyka

    Megakoteyka Оракул Модератор

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

    Megakoteyka Оракул Модератор

    Алгоритм приема:

    1. Ждем байт. совпадающий с заголовком. Переходим на шаг 2.
    2. Принимаем байт и сохраняем его - это количество байт данных. Переходим на шаг 3.
    3. Принимаем нужное количесто байт данных, которое мы узнали на предыдущем шаге. Одновременно считаем контрольную сумму. Переходим на шаг 4.
    4. Принимаем байт - контрольную сумму и сравниваем с подсчитанной. Если совпало - обрабатываем пакет. Переходим на шаг 1.