Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2010, 09:39   #1
Georgios
Пользователь
 
Аватар для Georgios
 
Регистрация: 18.01.2009
Сообщений: 57
По умолчанию Работа с COM-портом

Доброго времени суток!

Подскажите новичку, как осуществить корректное считывание данных.

В общем, есть плата, которая присылает вот такую строчку:

Код:
 999999 999999 999999 999999
начинается с пробела и в конце знак перехода 13 (это конец пакета)

Все вместе - 29 символов

Подскажите, как сделать так, чтобы постоянно получать именно эти 29 символов и работать потом с полной строчкой...
Дело в том, что иногда приходит не 29, а 36 или 21 символ, тогда теряются данные, т.к. я такие строчки исключаю.

Заранее благодарен!
Georgios вне форума Ответить с цитированием
Старый 27.09.2010, 10:02   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...проверял-ли сторонними утилитами, что всегда приходит именно 29
...не видно также вашего кода
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 27.09.2010, 10:11   #3
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Так может оно так и шлет само? В терминалке или другом софте наблюдали за поведением?

UPD: Упс, raxp опередил )
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 27.09.2010, 10:15   #4
Georgios
Пользователь
 
Аватар для Georgios
 
Регистрация: 18.01.2009
Сообщений: 57
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...проверял-ли сторонними утилитами, что всегда приходит именно 29
...не видно также вашего кода
по описанию должно приходить 29, а какие утилиты могут в этом помочь? =)

вот примерный код, это поток:

Код:
 while (not Terminated) do
    begin
      Application.ProcessMessages;
      sleep(50);

      try
        ClearCommError(hPort, dwError, @ComStat);
      finally;
      end;

      dwRead := ComStat.cbInQue;
      if (dwRead > 0) then
        begin
          try
            if ReadFile(hPort, Buff, dwRead, dwRead, nil) then
              begin

              end;
          finally
          end;
        end
потом просто проверяю переменную dwRead, она ни всегда рава 29
Georgios вне форума Ответить с цитированием
Старый 27.09.2010, 10:17   #5
Georgios
Пользователь
 
Аватар для Georgios
 
Регистрация: 18.01.2009
Сообщений: 57
По умолчанию

Цитата:
Сообщение от Tronix Посмотреть сообщение
Так может оно так и шлет само? В терминалке или другом софте наблюдали за поведением?
Возможно... Но если так, то может как-то после приемки слияние строк сделать??? Только как?
Georgios вне форума Ответить с цитированием
Старый 27.09.2010, 11:31   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

1- sleep вас не смущает ?
2- что значит ваше "возможно", так проверяли или нет?
3-
Цитата:
по описанию должно приходить 29
ну и что, что по описанию ...на заборах тоже много чего пишут, но мучают смутные сомнения, что это ваш sleep бяку ставит.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 27.09.2010, 11:40   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Подскажите новичку, как осуществить корректное считывание данных.
У вас есть формальная последовальность пакета:
Цитата:
начинается с пробела и в конце знак перехода 13 (это конец пакета)
Вот его и ждите.
p51x вне форума Ответить с цитированием
Старый 27.09.2010, 11:49   #8
Georgios
Пользователь
 
Аватар для Georgios
 
Регистрация: 18.01.2009
Сообщений: 57
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
1- sleep вас не смущает ?
2- что значит ваше "возможно", так проверяли или нет?
3- ну и что, что по описанию ...на заборах тоже много чего пишут, но мучают смутные сомнения, что это ваш sleep бяку ставит.
1. пробовал убрать задержку, тогда вообще от 2 до 9 только приходит
2. нашел, скачал программу... проверил - ДА, не всегда 29

А можно ли как-нибудь сделать так:
допустим нормальная строка - 12345K, где К - конец данных
Ниже считаны данные 5 раз:

1. 12345К
2. 123
3. 45К123
4. 45К
5. 12345К

Вообще возможно ли как-нибудь сложив строки и получить нормальную?

Или данные все же не будут нормальными?

Цитата:
Сообщение от p51x Посмотреть сообщение
Вот его и ждите.
т.е. Вы имеете в виду, дождаться символа 13, а потом от него начинать действия?

Последний раз редактировалось Stilet; 27.09.2010 в 12:42.
Georgios вне форума Ответить с цитированием
Старый 27.09.2010, 13:04   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

1- посмотрите как реализовано чтение в любом компоненте, тот же bcomport
2- не видно ваших настроек COM порта, размера буфера, таймаутов и т.п.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 27.09.2010, 13:55   #10
Georgios
Пользователь
 
Аватар для Georgios
 
Регистрация: 18.01.2009
Сообщений: 57
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
1- посмотрите как реализовано чтение в любом компоненте, тот же bcomport
2- не видно ваших настроек COM порта, размера буфера, таймаутов и т.п.
ого, а можно подробнее ))) про размеры буфера и про таймауты?
я так понимаю, что размер буфера - это настройка того, сколько мне нужно считать?

вот открытие и настройка порта

Код:
hPort := CreateFile('Com3', GENERIC_READ or GENERIC_WRITE, 0, nil,OPEN_EXISTING, 0, 0);
  if hPort = INVALID_HANDLE_VALUE then
    raise Exception.Create('Ошибка открытия порта');

  if not GetCommState(hPort, Dcb) then
    raise Exception.Create('Ошибка установки параметров порта');

  Dcb.BaudRate := 115200;
  Dcb.Parity := ODDPARITY;
  Dcb.ByteSize := 8;
  Dcb.StopBits := ONESTOPBIT;

  if not SetCommState(hPort, Dcb) then
    raise Exception.Create('Error setting port state');

  if not PurgeComm(hPort, PURGE_TXCLEAR or PURGE_RXCLEAR) then
    raise Exception.Create('Error purging port');
Georgios вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с com-портом larry Visual C++ 6 12.08.2010 16:21
Работа c COM-портом doniyor Общие вопросы Delphi 12 27.07.2009 11:16
Работа с COM-портом jovanny Помощь студентам 2 03.05.2009 18:06
Работа с COM портом hoba Общие вопросы Delphi 3 20.11.2008 03:39