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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2019, 21:44   #1
ptihka
 
Регистрация: 23.10.2013
Сообщений: 5
По умолчанию Как отследить конец передачи с COM Port

Создаю устройство на AVR , оно должно общатся по ком порту с компьютером , для синхронизации данных точнее времени.
В делфи использую компанент TBComPort ver.2.10
по прерыванию буфера принемаю данные с МК
Код:
procedure TForm1.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  S: String;
begin  
  BComPort1.ReadStr(S,Count );
  Label2.Caption:=Label2.Caption+ s;



end;
все бы хорошо , и даже можно сказать работает , но не могу отследить конец передачи , чтобы сравнить и сделать какие то выводы-операции на ответ . Помгоите , кто чем может , буду благодарен!!!
ptihka вне форума Ответить с цитированием
Старый 11.12.2019, 10:21   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Хороший партизан! Много сказано - и ни о чём.
Протокол передачи определен? Пакеты бинарные или ASCII ? От этого зависит.
Обычные приемы определения конца передачи:
- Для ASCII - <ВК>или/и<ПС>
- Для бинарных : по счетчику в заголовке пакета
- по тайм-ауту.
Погугли на тему Modbus.

Последний раз редактировалось digitalis; 11.12.2019 в 10:25.
digitalis вне форума Ответить с цитированием
Старый 11.12.2019, 15:43   #3
ptihka
 
Регистрация: 23.10.2013
Сообщений: 5
По умолчанию

Не обессудте, програмист с меня ткой себе, можно даже сказать почти ни какой, знания по делфи заканчиваются на скачивании чьих то примеров и объединения их в мою кучу. Передача с АВР идет в ASCII с 10/13 в конце, пробовал отследить по этим данным , но как то не выходит , как я понимаю когда забираю из буфера там может быть несколько символов , в зависимости от факторов передачи. Поскольку по отслеживанию по #13 иногда срабатывает иногда нет. вот по тайм-ауту это интересно можно проверять по таймеру идет передача или нет , за это спасибо буду пробовать. Должно получится , поскольку не постоянный обмен а нужно просто получить ответ от МК и сделать вывод в приложении.
ptihka вне форума Ответить с цитированием
Старый 11.12.2019, 18:30   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Любопытно: а на стороне ПК прием через что идёт? Через СОМ-порт с преобразованными уровнями? Если да, и если линия связи не ограничена двумя парами, то можно использовать полный RS232 со служебными сигналами RTS - CTS.
А если через преобразователь UART-USB - тогда в зависимости от типа преобразователя.
По тайм-аутам тоже есть засада: Windows - не реалтаймовская ОС, и кто знает, чем и сколько времени она бывает занята.
Более конкретно сказать не могу, у меня МК болтал дуплексно с ПК через FT232, а там производитель м.-сх. давал DLL-ку, которая заведовала связью.

Последний раз редактировалось digitalis; 11.12.2019 в 18:35.
digitalis вне форума Ответить с цитированием
Старый 11.12.2019, 19:15   #5
ptihka
 
Регистрация: 23.10.2013
Сообщений: 5
По умолчанию

Я работаю с баскомом тут нет библиотек , весь процес написан в основном на ассемблере по прерыванию, можно сказать лично , так что на уровне МК мне все известно что и как. Работаю конечно со свистком ТТL уровня , заморочится с служебными сигналами можно но оно того не стоит. Сейчас у меня можно сказать все работает . Связь с МК стабильная , ни каких потерь все хорошо , с компа отпраляю данные типа:"22.11.23+chexum" и если на сторне МК чексумма совпала устанавливаю время, и отправляю ответ типа"Установлено" , и вот при ответе от МК приходят байты по несколько штук , бывает 1 бывает 3 байта , почему так не знаю. Отсюда вывод я немогу узнать когда пришло все слово чтобы сравнить ответ от МК. И в делфи буфер этих байтов склеевается в одно слово.
ptihka вне форума Ответить с цитированием
Старый 12.12.2019, 10:00   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

А что, время ответа должно фиксироваться с точностью до миллисекунд ?
Цитата:
заморочится с служебными сигналами можно но оно того не стоит
Ну нет - так нет.
digitalis вне форума Ответить с цитированием
Старый 12.12.2019, 10:27   #7
ptihka
 
Регистрация: 23.10.2013
Сообщений: 5
По умолчанию

Да нет не должно , поэтому и говорю что по таймеру можно проверять пришло что нибудь или нет , да и ответ то приходит всего либо да либо нет , и время не важно вплоть до пары-тройки секунд. Просто в МК я отслеживаю все по байтово и конец передачи тоже , а тут не знаю как , придется через 'костыль' . Просто думал можно и тут как то отследить конец передачи не сложно.
ptihka вне форума Ответить с цитированием
Старый 12.12.2019, 11:02   #8
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Я штатными средствами работы с СОМ-портом не пользовался, потому не вправе врать чего-нибудь, но раз обмен идет в ASCII, то по #13 можно отслеживать, очищая после этого приемный буфер через PurgeComm .
http://delartidea.blogspot.com/2018/...-rs-232-4.html
digitalis вне форума Ответить с цитированием
Старый 14.12.2019, 01:59   #9
ptihka
 
Регистрация: 23.10.2013
Сообщений: 5
По умолчанию

В этом и дело что по #13 не получается почему то отследить.
ptihka вне форума Ответить с цитированием
Старый 03.03.2020, 12:21   #10
Сергей Грин
 
Регистрация: 30.08.2013
Сообщений: 3
По умолчанию

Доброго, всем!
Не знаю актуально, нет.Времени много прошло, пусть будет. У меня на bcomport была такая же проблема. Решается введением в прошивке AVR, маркеров начала и конца пакета. И отлавливаем маркеры.

BComPort1.ReadStr(S, Count);
SL := SL+trim(S);
// MemoTerminal.Text:=MemoTerminal.Tex t+s;
if pos('>',SL) > 0 then
begin
s2:=copy(SL,pos('<',SL)+1,128); //copy packet
delete(SL,1,pos('>',SL));
///////////// start thread
STRThread:=TSTRThread.Create(False) ;
STRThread.Priority:=tpNormal;
STRThread.FreeOnTerminate:=true;
Сергей Грин вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поочерёдная вставка в дек. Есть заполненный дек d1. Необходимо заполнить дек d2 так: d1[0] - в конец, d[n-1] - в начало, d1[2] - в конец и тд. Как реализовать? _D4rki_ Помощь студентам 2 09.07.2017 09:21
Com port и С++ Илья1910 Visual C++ 1 25.08.2016 08:01
com port kollfer Общие вопросы Delphi 3 12.04.2012 17:34
Как отследить начало и конец процесса? utro35 Общие вопросы Delphi 7 08.01.2012 13:26
как отследить приход данных на Com- port shurik_7866 Общие вопросы Delphi 1 03.04.2008 18:27