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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2014, 16:30   #1
imv14
 
Регистрация: 23.02.2014
Сообщений: 4
По умолчанию Помогите новичку. Bc_port и ардуино

Всем добрый день, в делфи не силен поэтому решил спросить? Уважаемые знатоки подскажите пожалуйста.
Есть устройство ардуино, которое посылает в ком порт по 10 байт. Как с помощью компоненты bc_port, правильно принимать байты и записывать их в массив.
Как я понял надо использовать BComPort1RxChar, принимать 10 байт, записывать их в массив, обрабатывать, затем следующие 10 байт снова перезаписывать в этот же массив? Время между отпрвкой посылки около 2 секунд.
Еще посоветуйте, с ардуино посылаю байтами (write), а не символами (print), с чем лучше работать?
imv14 вне форума Ответить с цитированием
Старый 10.04.2014, 15:55   #2
imv14
 
Регистрация: 23.02.2014
Сообщений: 4
По умолчанию

Код:
procedure TForm1.BComPort1RxChar(Sender: TObject; Count: Integer);
begin
  inc(ColByte);
  BComPort1.Read(buffer[ColByte],1);
  Memo1.Text:=Memo1.Text+' '+IntToStr(Buffer[ColByte]);

  if ColByte = 8 then
  begin
    StringGrid2.Cells[1,1]:= IntToStr(Buffer[1]);
    StringGrid2.Cells[1,2]:= IntToStr(Buffer[8]);
    StringGrid2.Cells[1,7]:= IntToStr(Buffer[3]);
    StringGrid2.Cells[1,4]:= IntToStr(Buffer[4]);
    StringGrid2.Cells[1,5]:= IntToStr(Buffer[5]);
    StringGrid2.Cells[1,3]:= IntToStr(Buffer[6]);
    StringGrid2.Cells[1,6]:= IntToStr(Buffer[7]);
    StringGrid2.Cells[1,8]:= IntToStr(Buffer[2]);
    ColByte:=0;
  end;
  
end;
Написал вот такой код приёма байт. Как только считываются 8 байт, начинаю перезаписывать массив заново. Memo для контроля. Вроде бы работает, через небольшой промежуток времени перестает обновляться информация, может как-то буфер чистить?
imv14 вне форума Ответить с цитированием
Старый 10.04.2014, 22:57   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...вообще, правильно выгребать так в буфер заданной длины:
Код:
BComPort1.Read(buffer, count);
Что до перестает обновлятся: бряки поставьте, добавьте лог, отследите после чего, может он вам некорректный символ присылает, может система засыпает, гадание одно.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 14.04.2014, 15:54   #4
imv14
 
Регистрация: 23.02.2014
Сообщений: 4
По умолчанию

Спасибо за ответ. Я так понимаю, что если я знаю сколько байт в посылке, то можно в count указать конкретное число?
Еще хотел спросить на счет асинхронного чтения из порта, скорее всего мне надо использовать его?
В bc_port есть пример для чтения строки, но ничего не понятно как оно работает, не могли бы вы подсказать, как мне его применить?
Код:
procedure TForm1.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: String;
  Stat: PAsync;
  N: Integer;
begin
  InitAsync(Stat);
  try
    BComPort1.ReadStrAsync(Str, Count, Stat);
    repeat
      // Выполнение других действий
    until BComPort1.IsAsyncCompleted(Stat);
    N := BComPort1.WaitForAsync(Stat);
    if N <> Count then SetLength(Str, Count);
  finally
    DoneAsync(Stat);
  end;
  // Действия с переменной Str
end;
imv14 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите новичку Darinat Microsoft Office Excel 16 27.01.2014 15:27
Помогите новичку Doz1metr Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 05.08.2009 02:03
Помогите новичку vorron Свободное общение 8 15.03.2008 08:56