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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2018, 08:22   #1
николай19971997
Новичок
Джуниор
 
Регистрация: 20.04.2018
Сообщений: 6
По умолчанию Не могу разобраться с компонентом bcomport

Встала необходимость читать значения приходящие на ком порт компьютера. Опыта в этом очень мало. Микроконтроллер считывает значения с датчика и отсылает их в программу delphi.Контроллер отсылает по 2 байта(старший и младший) несколько раз в секунду. Эти байты приходят к программу,программа переводит их в единый тип данных word и дальше я уже должен с этим значением как-то работать,но проблема такая что программа работает нестабильно. Ниже привожу код

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, BCPort, StdCtrls;

type
  TForm1 = class(TForm)
    BComPort1: TBComPort;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure BComPort1RxChar(Sender: TObject; Count: Integer);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  x0 : byte = 0;      //один байт
  x1 : byte = 0;      //второй байт
  z  : word = 0;      //сложенное значение первого и второго байта
  Form1: TForm1;

implementation

{$R *.dfm}

//эта кнопка отрывает ком порт
procedure TForm1.Button1Click(Sender: TObject);
begin
   if (BComPort1.Open) then
   begin
   Label1.Caption := 'Порт открыт';
   end;
end;

//событие по получение значений в буфер
//count - число полученных значений
//в первой части кода мало разбираюсь.Он был взят из даташита так как есть
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;
   //вот здесь мой код обработки всех значений
   Label1.Caption := inttostr(ord(str[1]));   //вывожу в лейбл первый байт
   Label2.Caption := IntToStr(ord(str[2]));   //вывожу второй
   x0 := ord(str[1]);    //сохраняю первый байт
   x1 := ord(str[2]);    //сохраняю второй
   z := 0;
   z := MakeWord(x0,x1);   //соединяю их в ворд
   Label3.Caption := inttostr(z); //полученное значение вывожу
   Button1.Caption := inttostr(count);  //вывожу значение чтоб посмотреть сколько байт я получил
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  BComPort1.Close;
end;

end.
Я заранее проверил весь процесс в терминале и убедился что микроконтроллер посылает байты правильно,они все приходят исправно и в ожидаемом виде,значит проблема в моих кривых руках в delphi.
Нестабильность работы программы заключается в том,что в button1.caption чаще всего выводится значение 1,а не 2.То есть приходить только 1 байт,а второй теряется. Иногда показывает 2,но это редко.Ну и само собой полученные значения не выглядят правильными и сильно искажаются. Я пытался "поиграться" с временными задержками в свойствах timeouts компонента,но не видно чтоб они на что-то влияли. Ниже привожу файл с самим компонентом и моим проектом.
Кстати,значения посылаются динамически,несколько раз в секунду.
Если кто знает в чём я совершил ошибку,подскажите пожалуйста
Вложения
Тип файла: rar bcomport.rar (57.2 Кб, 29 просмотров)
Тип файла: rar super_soft.rar (180.8 Кб, 20 просмотров)
николай19971997 вне форума Ответить с цитированием
Старый 20.04.2018, 10:01   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

МК выдает последов. код в UART. А во что и чем преобразуется сигнал UART - реальный COM, USB ?
digitalis вне форума Ответить с цитированием
Старый 20.04.2018, 10:25   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
if (N<>Count) then SetLength(Str,Count);
Надо устанавливать длину в N, а не в Count. N же результат операции. И далее вы так легко сразу с двумя байтами работаете... вы ведь в курсе, что может прийти от 0 до Count (т.е. 2)?
p51x на форуме Ответить с цитированием
Старый 20.04.2018, 11:33   #4
николай19971997
Новичок
Джуниор
 
Регистрация: 20.04.2018
Сообщений: 6
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
МК выдает последов. код в UART. А во что и чем преобразуется сигнал UART - реальный COM, USB ?
Кстати да,забыл об этом упомянуть. Это виртуальный ком порт,созданный с помощью микросхемы FTDI,втыкаю в USB. Фишка в том,что если просто послать два байта по этой схеме,например по нажатию кнопки,то всё нормально считывается,а если как в этом примере,динамически,то всё работает плохо. Вообще,встала мысль,просто обрезать один байт а получать только один.Там всё равно во втором байте только 2 бита значащих.Там просто устройство выходные данные 10 битов имеет.Просто неохота 2 бита терять.
николай19971997 вне форума Ответить с цитированием
Старый 20.04.2018, 11:34   #5
николай19971997
Новичок
Джуниор
 
Регистрация: 20.04.2018
Сообщений: 6
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
if (N<>Count) then SetLength(Str,Count);
Надо устанавливать длину в N, а не в Count. N же результат операции. И далее вы так легко сразу с двумя байтами работаете... вы ведь в курсе, что может прийти от 0 до Count (т.е. 2)?
То есть вы имеете ввиду,что стоит делать проверку? если пришло 0 то вообще не обрабатывать,а если 1 то делать что-то другое? вот как.Похоже в этом и ошибка
николай19971997 вне форума Ответить с цитированием
Старый 20.04.2018, 12:40   #6
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Мне приходилось работать с FTDI, я использовал фирменную DLL-ку, и никаких проблем не возникало.
Но есть одна засада: кетайцы ломанулись подделывать эти дивайсы, и FTDI, чтобы защититься, в своих DLL-ках прикрутила фичу: обнаружив, что чип поддельный, что-то в нем крушит (вроде VID и PID). Мне не довелось бодаться с контрафактом, но ребята рассказывали: Запрос для Гугля FTDI site:https://leoniv.livejournal.com/
digitalis вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
BComPort в Delphi7 Oksymoron Помощь студентам 31 07.04.2023 09:43
как установить компонент bcomport в delphi7? Виктор dubStep Общие вопросы Delphi 4 22.02.2015 00:04
Терминал BComPort выдает иероглифы. azzzazzzelDEAN Компоненты Delphi 32 09.04.2014 16:18
Разобраться с компонентом BARNEY Фриланс 13 07.02.2014 19:26