Ошибка при использовании 'synaser.pas' с Free Pascal (Lazarus) - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь прочитать серийные данные с Arduino на мою Ма c (10.12.6). Я скачал библиотеку Synapse бесплатно Pascal (Lazarus v.2.0.8) с здесь , но я столкнулся с ошибкой ...

Arduino запрограммирован с использованием Arduino IDE и отправляет случайные числа (от 0 до 255) в виде строки на последовательный порт. Я пытаюсь прочитать эти строки, используя Free Pascal, чтобы я мог построить значения.

Следуя инструкциям здесь Я скачал и использовал библиотеку Synapse следующим образом:

1) Распакуйте папку библиотеки 2) В Lazarus перейдите в «Проект» -> «Инспектор проектов» -> «Добавить файлы из файловой системы» -> выбрать «synaser.pas». 3) Добавьте следующий код в событие кнопки формы:

procedure TForm1.Button1Click(Sender: TObject);
var
  ser: TBlockSerial;
begin
  ser := TBlockSerial.Create;
  try
    ser.Connect('my-com-port'); // write here Arduino COM port number (on linux it's something like '/dev/ttyUSB0')
    Sleep(250);
    ser.config(9600, 8, 'N', SB1, False, False);
    ser.SendString('on'); // button 2 should have 'off' here
  finally
    ser.free;
  end;
end;

4) Нажмите run.

В файле synaser.pas появляется сообщение об ошибке:

Ошибка несовместимые типы: получил «ShortInt» ожидаемый «Pointer» ..

Вот часть файла synaser.pas, на которую ссылаются:

{$IFNDEF MSWINDOWS}
procedure TBlockSerial.Purge;
begin
  {$IFNDEF FPC}
  SerialCheck(ioctl(FHandle, TCFLSH, TCIOFLUSH));
  {$ELSE}
    {$IFDEF DARWIN}
    SerialCheck(fpioctl(FHandle, TCIOflush, TCIOFLUSH)); { <------ here*******}
    {$ELSE}
    SerialCheck(fpioctl(FHandle, TCFLSH, Pointer(PtrInt(TCIOFLUSH))));
    {$ENDIF}
  {$ENDIF}
  FBuffer := '';
  ExceptCheck;
end; 

Я использую Ma c, и это Кажется, ошибка связана с windows системой?

1 Ответ

1 голос
/ 28 апреля 2020

Спасибо @ tonypdmtr.

Мне пришлось изменить файл 'synaser.pas' следующим образом, чтобы он заработал. Немного хака я чувствую:

  1. Измените строку 1939 на следующее:

    SerialCheck (fpioctl (FHandle, TCIOflu sh, Pointer (PtrInt (TCIOFLU * 1027) *))));

  2. Закомментируйте строки 2201, 2202 и 2204 в одной строке. Это звучит как плохой способ сделать это, но я заставил его работать.

Изменение события кнопки на следующий код позволяет мне читать одну строку данных из Arduino с каждым нажатие кнопки:

procedure TForm1.Button1Click(Sender: TObject);
var
  ser: TBlockSerial;
begin
  ser := TBlockSerial.Create;
  try
    ser.Connect('/dev/cu.wchusbserial1420'); // write here Arduino COM port number (on linux it's something like '/dev/ttyUSB0')
    Sleep(250); 
    ser.config(9600, 8, 'N', SB1, False, False);
    Label1.Caption := ser.RecvString(100);
  finally
    ser.free;
  end;
end;

enter image description here

Я чувствую, что библиотека должна работать без изменения.

...