Форум программистов  
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 11.09.2017, 17:18   #1
Gallean
 
Регистрация: 19.05.2017
Сообщений: 7
Репутация: 10
По умолчанию 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, 21:26   #2
Black Fregat
Программист
Форумчанин
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 318
Репутация: 265
По умолчанию

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

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

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

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

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

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

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

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

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

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

Новой вопрос.
отправляем массив байт:
Код:

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 в 21:28.
Gallean вне форума   Ответить с цитированием
Старый 13.09.2017, 06:07   #9
Slym
Участник клуба
 
Регистрация: 07.12.2011
Адрес: Siberia
Сообщений: 998
Репутация: 602
По умолчанию

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Принимаем смс. TComPort. qZED Компоненты Delphi 5 03.12.2014 15: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




15:10.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru