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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2017, 16:18   #1
Gallean
 
Регистрация: 19.05.2017
Сообщений: 7
По умолчанию TComPort Асинхронная передача

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  sss: string;
  i, index: Integer;
  t: cardinal;
begin
sss:='';
for i := 0 to 138 do
  begin
    sss:= sss + '1';
  end;
 index:=0;

if self.MyPort1.Connected then
  begin
    InitAsync(Operation1);
  try
    self.MyPort1.WriteStrAsync(sss,Operation1);
     t:= GetTickCount;
    self.MyPort1.WaitForAsync(Operation1);
     t:= GetTickCount - t;
  finally
    DoneAsync(Operation1);
  end;

  memo1.Lines.Add('Т - ' + IntToStr(t));
end;
end;
Доброго времени суток, господа помогите разобраться с асинхронной передачей...
Разом в неблокирующем режиме отправляется только 128 +-5 байт.
Если попробовать записать больше - программа глохнет и ждет пока не отправятся все байты.
Если отправлять по 50 байт на минимальной скорости, то на 3 отправку - когда этот псевдобуфер в 128байт переполняется имеем опять такой же затык и ждем пока не отправятся все...

MyPort1.Buffer.OutputSize - возвращает 1024.
self.MyPort1.OutputCount - всегда возращает 0.


Ткните носом, пожалуйста, что я не так делаю. Такое ощущение, что не включается асинхронный режим.

Delphi XE7 , TComPort 4.11
Gallean вне форума Ответить с цитированием
Старый 11.09.2017, 20:26   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

А какой, простите, резон запускать асинхронную операцию и тут же ждать результатов её завершения?
Black Fregat вне форума Ответить с цитированием
Старый 12.09.2017, 00:53   #3
Валенок
Новичок
Джуниор
 
Регистрация: 12.09.2017
Сообщений: 2
По умолчанию

А вопрос читаем. Кто ждет "тут же завершения" ?
Буфер - 1к. Асинхронный ? Так прими хотя бы 0.5к, сразу выйди и работай в фоне.Так ведь не выходит каменный цветок.
Вот и интересно - где не так ? Толи размер буфера не размер, толи не того буфера, толи асинхрон не асинхрон.

Убедительная просьба - не надо произносить слово "поток"

PS
За соседним столом был.
Валенок вне форума Ответить с цитированием
Старый 12.09.2017, 03:42   #4
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

для начала строка в Delphi XE7 получается в 2 раза больше чем length(str)
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 12.09.2017, 08:47   #5
Валенок
Новичок
Джуниор
 
Регистрация: 12.09.2017
Сообщений: 2
По умолчанию

лучше начните с самого конца, т.к. цифры - приведены, а автор уже освоил сложение и вычитание
Валенок вне форума Ответить с цитированием
Старый 12.09.2017, 12:29   #6
Gallean
 
Регистрация: 19.05.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
А какой, простите, резон запускать асинхронную операцию и тут же ждать результатов её завершения?
Цитата:
Сообщение от Black Fregat Посмотреть сообщение
А какой, простите, резон запускать асинхронную операцию и тут же ждать результатов её завершения?
спасибо, вроде примерно разобрался)
WaitForAsync нужно вызывать до WriteStrAsync, т.к. в этом случае мы гарантированно дождемся завершения отправки.

Соответственно вопрос: Как не заходя в WaitForAsync проверить что все, что я положил в буфер ушло? и как корректно заставить работать MyPort1.OutputCount, чтоб узнать сколько еще лежит в Тх буфере?
Gallean вне форума Ответить с цитированием
Старый 12.09.2017, 14:01   #7
Gallean
 
Регистрация: 19.05.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Gallean Посмотреть сообщение
...Как не заходя в WaitForAsync проверить что все, что я положил в буфер ушло?...
IsAsyncCompleted(Operation1)

-)
Gallean вне форума Ответить с цитированием
Старый 12.09.2017, 19:01   #8
Gallean
 
Регистрация: 19.05.2017
Сообщений: 7
По умолчанию

Новой вопрос.
отправляем массив байт:
Код:
self.MyPort1.WriteAsync(b, 200, Operation1);
на скорости 110 Бод
Грубый расчет: 200байт * 8 бит = 1600 бит. делим на 110Бод / получаем ~14.5 сек. оно должно отправляться...
На деле время между
Код:
self.MyPort1.WriteAsync(b, 200, Operation1);
и
Код:
self.MyPort1.WaitForAsync(Operation1);
составляет ~6.1 сек...

Соответственно есть подозрение, что имеем какой-то "железный" буфер уровнем ниже как раз размером ~128 байт (см первый пост) и функция WaitForAsync возвращает результат как только последний байт впихнется в этот "железный" буфер. (200 байт - 128 байт "буфера" = 72байта * 8 бит = 576 бит. делим на 110 бод получаем примерно эти ~6 сек.

т.е. фактически через 6 секунд после отправки мне функция вернет результат в 200 отправленных байт - но на деле же они будут фактически еще отправляться ~8 секунд из "железного" буфера

Вот собственно и вопрос) как узнать время фактической отправки именно последнего байта из "железки"?

Последний раз редактировалось Gallean; 12.09.2017 в 20:28.
Gallean вне форума Ответить с цитированием
Старый 13.09.2017, 05:07   #9
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Если ты пытаешься общаться с железкой на протоколе завязанном на таймингах - это плохая затея: Windows не RealTimeOS и тайминги будут сильно плавать. Выход промежуточная железка с RTOS, да не побьют меня палками, например arduino
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 13.09.2017, 08:36   #10
Gallean
 
Регистрация: 19.05.2017
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Slym Посмотреть сообщение
Если ты пытаешься общаться с железкой на протоколе завязанном на таймингах - это плохая затея: Windows не RealTimeOS и тайминги будут сильно плавать. Выход промежуточная железка с RTOS, да не побьют меня палками, например arduino
нет, спасибо) Вопрос к тем, кто пользовал компоненту Ткомпорт)
Gallean вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Принимаем смс. TComPort. qZED Компоненты Delphi 5 03.12.2014 14:08
TComPort component ver. 2.00 irradiator Компоненты Delphi 1 30.04.2014 19:41
Общие вопросы по TComport qZED Компоненты Delphi 0 07.12.2013 09:35
TComPort NewMember Компоненты Delphi 11 31.03.2012 09:32
Асинхронная передача данных eda Microsoft Office Excel 4 17.08.2009 14:16