Соединие прибра с ардуино

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
Добрый день!
Есть прибор Е7-20 и ардуино нано. Необходимо соединить прибор с ардуино и данные, которые он измеряет записывать на карту памяти. Купил конвертер, перепаял на нём маму на папу, соединил родным для Е7-20 кабелем. При помощи SoftwareSerial организовал программный Serial.

скетч:
#include <SoftwareSerial.h>
#define BUF_SIZE 22

SoftwareSerial mySerial(10, 11); // RX, TX

//массив полученных данных
byte buf[BUF_SIZE];

void setup()
{
    Serial.begin(9600);      
    mySerial.begin(9600);  
}
void loop()
{
    if(mySerial.available())
    {
        mySerial.readBytes(buf, BUF_SIZE);
        for(int i = 0; i < BUF_SIZE; i++)
        {
            Serial.print(buf[i]);
            Serial.print(":");
        }
        Serial.print("END\n");
    }  
}
Ардуоино подключена к компьютеру. Данные получает такие, независимо от того, что измеряет прибор
Код:
255:255:255:255:255:255:255:255:255:255:255:255:255:255:255:255:255:255:255:255:255:255:END
Если подключить Е7-20 к компьютеру, родная программа показывает правильно, значит кабель и порт исправны. В инструкции есть описание протокола
Протокол обмена прибора с компьютером
Прибор непрерывно находится в режиме передачи. Формат передаваемого кадра: 0xAA,
Offset, Level, Frequency, Flags, Mode, Limit, ImParam, SecParam, SecParam_Value,
ImParam_Value, onChange, CS, где;
0xAA – байт синхронизации;
Offset – младший и старший байт значения смещения;
Level – байт значения уровня измерительного сигнала;
Frequency – младший, старший байт значения частоты и байт множителя 10 частоты;
Flags – байт флагов:
4-й бит – автовыбор схемы замещения;
3-й бит – допуск;
2-й бит – параллельная/последовательная схема замещения;
1-й бит – автоматический режим переключения поддиапазонов;
Mode – режим работы прибора: 0х1 – режим измерения;
Limit – предел измерения;
ImParam – измеряемый параметр:
0х0 – Ср;
0х1 – Lp;
0x2 – Rp;
0x3 – Gp;
0x4 – Bp;
0x5 – |Y|;
0x6 – Q;
0x7 – Cs;
0x8 – Ls;
0x9 – Rs;
0xA – ;
0xB – Xs;
0xC – |Z|;
0xD – D;
0xE – I;
SecParam – дополнительный измеряемый параметр;
SecParam_Value – старший, средний, младший байты и байт множителя 10
дополнительного измеряемого параметра в дополнительном коде;
ImParam_Value – старший, средний, младший байты и байт множителя 10 измеряемого
параметра в дополнительном коде;
OnChange – байт флагов редактирования:
3-й бит – изменение поддиапазона;
2-й бит – изменение частоты;
1-й бит – изменение смещения;
0-й бит – изменение уровня;
CS – контрольная сумма.
Прибор принимает однобайтные команды соответствующие нажатию клавиш управления:
0х0 – Меню;
0х1 – Вправо;
0х2 – Z/;
0х3 – режим R;
0х4 – Вниз;
0х5 – Ввод;
0х6 – Вверх;
0х7 – режим L;
0х8 – калибровка;
0х9 – Влево;
0хА – режим I;
0хВ – режим С;
0хС – изменение смещения;
0хD – изменение частоты;
0xE – изменение уровня сигнала;
0xF – изменение поддиапазона.
Подскажите, как их "подружить". Просьба пинать не сильно и в нужную сторону. Это мой первый проект на ардуино
22 байта взял из кода родной программы на паскале, которая была на диске с прибором
Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, OoMisc, AdPort, ExtCtrls, Math;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    BitBtn5: TBitBtn;
    BitBtn6: TBitBtn;
    BitBtn7: TBitBtn;
    BitBtn8: TBitBtn;
    BitBtn9: TBitBtn;
    BitBtn10: TBitBtn;
    BitBtn11: TBitBtn;
    BitBtn12: TBitBtn;
    BitBtn13: TBitBtn;
    BitBtn14: TBitBtn;
    BitBtn15: TBitBtn;
    BitBtn16: TBitBtn;
    BitBtn17: TBitBtn;
    ApdComPort1: TApdComPort;
    Timer1: TTimer;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Panel2: TPanel;
    Panel1: TPanel;
    DQValue: TLabel;
    RLC: TLabel;
    DQ: TLabel;
    RLCValue: TLabel;
    Limit: TLabel;
    Level: TLabel;
    Frequency: TLabel;
    Offset: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Flash: TLabel;
    procedure ApdComPort1Trigger(CP: TObject; Msg, TriggerHandle,
      Data: Word);
    procedure FormCreate(Sender: TObject);
    procedure ErrorComm;
    procedure CalcValue;
    procedure Timer1Timer(Sender: TObject);
    procedure BitBtn16Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn8Click(Sender: TObject);
    procedure BitBtn12Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
    procedure BitBtn7Click(Sender: TObject);
    procedure BitBtn9Click(Sender: TObject);
    procedure BitBtn10Click(Sender: TObject);
    procedure BitBtn11Click(Sender: TObject);
    procedure BitBtn13Click(Sender: TObject);
    procedure BitBtn14Click(Sender: TObject);
    procedure BitBtn15Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  BlockIn: array [0..21] of byte;
  FlashF: boolean;

implementation

{$R *.DFM}



procedure TForm1.ApdComPort1Trigger(CP: TObject; Msg, TriggerHandle,
  Data: Word);
var
   CheckSum,i: byte;
begin
     if ApdComPort1.InBuffUsed >= 22 then
                                       begin
                                       ApdComPort1.GetBlock(BlockIn,22);
                                       CheckSum:=0;
                                       for i:=0 to 20 do
                                           CheckSum:=CheckSum+BlockIn[i];
                                       if (BlockIn[0]=$aa) and (CheckSum=BlockIn[21])
                                          then
                                              begin
                                              ApdComPort1.FlushInBuffer;
                                              Timer1.Enabled:=false;
                                              CalcValue;
                                              Timer1.Enabled:=true;
                                              if FlashF then begin
                                                                 Flash.Visible:=true;
                                                                 FlashF:=false;
                                                                 end
                                                        else begin
                                                                  Flash.Visible:=false;
                                                                  FlashF:=true;
                                                                  end;
                                              end;
                                       ApdComPort1.FlushInBuffer;
//                                       Memo1.Clear;
//                                       for i:=0 to 20 do
//                                          Memo1.Lines.Add(IntToHex(blockIn[i],2))
                                       end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     if ApdComPort1.Open=false then begin
                                    ApdComPort1.Open:=true;
                                    end;
     Timer1.Enabled:=true;
end;



procedure TForm1.ErrorComm;
begin
     RLCValue.Caption:='Comm Error';
end;

procedure TForm1.CalcValue;
var
   RLCVal, DQVal: real;
   m: byte;
   Lev: real;
   Freq: integer;
   Text,Units: string;
begin
     case BlockIn[10] of
          0: RLC.Caption:='Cp';
          1: RLC.Caption:='Lp';
          2: RLC.Caption:='Rp';
          3: RLC.Caption:='Gp';
          4: RLC.Caption:='Bp';
          5: RLC.Caption:='Y';
          6: RLC.Caption:='Q';
          7: RLC.Caption:='Cs';
          8: RLC.Caption:='Ls';
          9: RLC.Caption:='Rs';
          10: RLC.Caption:='T';
          11: RLC.Caption:='Xs';
          12: RLC.Caption:='Z';
          13: RLC.Caption:='D';
          14: RLC.Caption:='I';
     end;
     case BlockIn[10] of
          0: Units:='F';
          1: Units:='H';
          2: Units:='Om';
          3: Units:='S';
          4: Units:='S';
          5: Units:='S';
          6: Units:=' ';
          7: Units:='F';
          8: Units:='H';
          9: Units:='Om';
          10: Units:='°';
          11: Units:='Om';
          12: Units:='Om';
          13: Units:=' ';
          14: Units:='A';
     end;
          if (BlockIn[18] and 128)<>0 then
        begin
            BlockIn[16]:=BlockIn[16] xor 255;
            BlockIn[17]:=BlockIn[17] xor 255;
            BlockIn[18]:=BlockIn[18] xor 255;
            RLCVal:=-1-BlockIn[16]-(BlockIn[17]+BlockIn[18]*256)*256;
        end
        else begin
                  RLCVal:=BlockIn[16]+(BlockIn[17]+BlockIn[18]*256)*256;
             end;
//        RLCVal:=RLCVal*Power(10,BlockIn[19]);
        case BlockIn[19] of
          0: begin
                  m:=2;
                  Text:='k';
                  end;
          1: begin
                  m:=3;
                  Text:='k';
                  end;
          2: begin
                  m:=4;
                  Text:='k';
                  end;
          3: begin
                  m:=2;
                  Text:='M';
                  end;
          4: begin
                  m:=3;
                  Text:='M';
                  end;
          5: begin
                  m:=4;
                  Text:='M';
                  end;
          6: begin
                  m:=2;
                  Text:='G';
                  end;
          7: begin
                  m:=3;
                  Text:='G';
                  end;
          8: begin
                  m:=4;
                  Text:='G';
                  end;
          9: begin
                  m:=2;
                  Text:='T';
                  end;
          10: begin
                  m:=3;
                  Text:='T';
                  end;
          11: begin
                  m:=4;
                  Text:='T';
                  end;
          12: begin
                  m:=2;
                  Text:='T';
                  end;
          13: begin
                  m:=3;
                  Text:='T';
                  end;
          14: begin
                  m:=4;
                  Text:='T';
                  end;
          $ff: begin
                  m:=4;
                  Text:=' ';
                  end;
          $fe: begin
                  m:=3;
                  Text:=' ';
                  end;
          $fd: begin
                  m:=2;
                  Text:=' ';
                  end;
          $fc: begin
                  m:=4;
                  Text:='m';
                  end;
          $fb: begin
                  m:=3;
                  Text:='m';
                  end;
          $fa: begin
                  m:=2;
                  Text:='m';
                  end;
          $f9: begin
                  m:=4;
                  Text:='mk';
                  end;
          $f8: begin
                  m:=3;
                  Text:='mk';
                  end;
          $f7: begin
                  m:=2;
                  Text:='mk';
                  end;
          $f6: begin
                  m:=4;
                  Text:='n';
                  end;
          $f5: begin
                  m:=3;
                  Text:='n';
                  end;
          $f4: begin
                  m:=2;
                  Text:='n';
                  end;
          $f3: begin
                  m:=4;
                  Text:='p';
                  end;
          $f2: begin
                  m:=3;
                  Text:='p';
                  end;
          $f1: begin
                  m:=2;
                  Text:='p';
                  end;
          $f0: begin
                  m:=4;
                  Text:='f';
                  end;
          $ef: begin
                  m:=3;
                  Text:='f';
                  end;
          $ee: begin
                  m:=2;
                  Text:='f';
                  end;
          $ed: begin
                  m:=4;
                  Text:='f';
                  end;
          $ec: begin
                  m:=3;
                  Text:='f';
                  end;
          $eb: begin
                  m:=2;
                  Text:='f';
                  end;
        end;
        RLCVal:=RLCVal/Power(10,5-m);
        RLCValue.Caption:=format('%*.*f',[m,5-m,RLCVal])+' '+Text+Units;
     if (BlockIn[14] and 128) <>0 then
        begin
            BlockIn[12]:=BlockIn[12] xor 255;
            BlockIn[13]:=BlockIn[13] xor 255;
            BlockIn[14]:=BlockIn[14] xor 255;
            DQVal:=-1-BlockIn[12]-(BlockIn[13]+BlockIn[14]*256)*256;
        end
        else begin
                  DQVal:=BlockIn[12]+(BlockIn[13]+BlockIn[14]*256)*256;
             end;
        case BlockIn[15] of
          0: m:=1;
          1: m:=2;
          2: m:=3;
          3: m:=4;
          4: m:=3;
          5: m:=4;
          6: m:=2;
          7: m:=3;
          8: m:=4;
          9: m:=2;
          10: m:=3;
          11: m:=4;
          12: m:=2;
          13: m:=3;
          14: m:=4;
          $ff: m:=4;
          $fe: m:=3;
          $fd: m:=2;
          $fc: m:=1;
          $fb: m:=4;
          $fa: m:=3;
          $f9: m:=2;
          $f8: m:=1;
          $f7: m:=2;
          $f6: m:=4;
          $f5: m:=3;
          $f4: m:=2;
          $f3: m:=4;
          $f2: m:=3;
          $f1: m:=2;
          $f0: m:=4;
          $ef: m:=3;
          $ee: m:=2;
          $ed: m:=4;
          $ec: m:=3;
          $eb: m:=2;
        end;
     case BlockIn[11] of
          0: Units:='F';
          1: Units:='H';
          2: Units:='Om';
          3: Units:='S';
          4: Units:='S';
          5: Units:='S';
          6: Units:=' ';
          7: Units:='F';
          8: Units:='H';
          9: Units:='Om';
          10: Units:='°';
          11: Units:='Om';
          12: Units:='Om';
          13: Units:=' ';
          14: Units:='A';
     end;
     case BlockIn[15] of
          0: Text:='k';
          1: Text:='k';
          2: Text:='k';
          3: Text:='M';
          4: Text:='M';
          5: Text:='M';
          6: Text:='G';
          7: Text:='G';
          8: Text:='G';
          9: Text:='T';
          10: Text:='T';
          11: Text:='T';
          12: Text:='T';
          13: Text:='T';
          14: Text:='T';
          $ff: Text:=' ';
          $fe: Text:=' ';
          $fd: Text:=' ';
          $fc: Text:='m';
          $fb: Text:='m';
          $fa: Text:='m';
          $f9: Text:='mk';
          $f8: Text:='mk';
          $f7: Text:='mk';
          $f6: Text:='n';
          $f5: Text:='n';
          $f4: Text:='n';
          $f3: Text:='p';
          $f2: Text:='p';
          $f1: Text:='p';
          $f0: Text:='f';
          $ef: Text:='f';
          $ee: Text:='f';
          $ed: Text:='f';
          $ec: Text:='f';
          $eb: Text:='f';
        end;
        if BlockIn[11]=13 then Text:=' ';
        if BlockIn[11]=6 then Text:=' ';
        DQVal:=DQVal/Power(10,5-m);
        DQValue.Caption:=format('%*.*f',[m,5-m,DQVal])+' '+Text+Units;

     if BlockIn[10]=14 then begin
                                 DQ.Visible:=false;
                                 DQValue.Visible:=false;
                                 Level.Visible:=false;
                                 Frequency.Visible:=false;
                                 end
                       else begin
                                 DQ.Visible:=true;
                                 DQValue.Visible:=true;
                                 Level.Visible:=true;
                                 Frequency.Visible:=true;
                                 end;
     case BlockIn[11] of
          0: DQ.Caption:='Cp';
          1: DQ.Caption:='Lp';
          2: DQ.Caption:='Rp';
          3: DQ.Caption:='Gp';
          4: DQ.Caption:='Bp';
          5: DQ.Caption:='Y';
          6: DQ.Caption:='Q';
          7: DQ.Caption:='Cs';
          8: DQ.Caption:='Ls';
          9: DQ.Caption:='Rs';
          10: DQ.Caption:='F';
          11: DQ.Caption:='Xs';
          12: DQ.Caption:='Z';
          13: DQ.Caption:='D';
          14: DQ.Caption:='I';
     end;
     if (BlockIn[7] and 2)<>0 then                     //предел
                        Limit.Caption:='A '
                    else
                        Limit.Caption:='   ';
     if BlockIn[10]=14 then
                       case BlockIn[9] of
                            0: Text:='Error';
                            1: Text:='1mkA';
                            2: Text:='10mkA';
                            3: Text:='100mkA';
                            4: Text:='1mA';
                            5: Text:='10mA';
                            6: Text:='100mA';
                            7: Text:='1A';
                            8: Text:='10A';
                            end
                       else
                       case BlockIn[9] of
                            0: Text:='Error';
                            1: Text:='10MOm';
                            2: Text:='1MOm';
                            3: Text:='100kOm';
                            4: Text:='10kOm';
                            5: Text:='1kOm';
                            6: Text:='100Om';
                            7: Text:='10Om';
                            8: Text:='1Om';
                            end;
     Limit.Caption:=Limit.Caption+Text;

     Lev:=BlockIn[3]/100;                              //Уровень
     Level.Caption:=format('%1.2f',[Lev])+'V';

     Freq:=BlockIn[4]+BlockIn[5]*256;                  //Частота
     case BlockIn[6] of
          0: Text:='Hz';
          3: Text:='kHz';
          6: Text:='MHz';
     end;
     Frequency.Caption:=IntToStr(Freq)+Text;

     Lev:=(blockIn[1]+BlockIn[2]*256)/100;
     Offset.Caption:=format('%2.2f',[Lev])+'V';

     if (BlockIn[20] and 8)<>0 then Label4.Visible:=true
        else Label4.Visible:=false;
     if (BlockIn[20] and 1)<>0 then Label5.Visible:=true
        else Label5.Visible:=false;
     if (BlockIn[20] and 4)<>0 then Label6.Visible:=true
        else Label6.Visible:=false;
     if (BlockIn[20] and 2)<>0 then Label7.Visible:=true
        else Label7.Visible:=false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
     ErrorComm;
end;

procedure TForm1.BitBtn16Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($f));
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($3));
end;

procedure TForm1.BitBtn8Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($7));
end;

procedure TForm1.BitBtn12Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($b));
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($2));
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($1));
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($0));
end;

procedure TForm1.BitBtn5Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($4));
end;

procedure TForm1.BitBtn6Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($5));
end;

procedure TForm1.BitBtn7Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($6));
end;

procedure TForm1.BitBtn9Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($8));
end;

procedure TForm1.BitBtn10Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($9));
end;

procedure TForm1.BitBtn11Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($a));
end;

procedure TForm1.BitBtn13Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($c));
end;

procedure TForm1.BitBtn14Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($d));
end;

procedure TForm1.BitBtn15Click(Sender: TObject);
begin
     ApdComPort1.PutChar(Chr($e));
end;

end.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
Изменено:
  • Лойс +1
Реакции: mikolaki

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
А прибор точно работает на 9600?
спасибо!! поставил 2400, какие-то данные появились. Каждый раз разные, попробую расшифровать, что получается, хотя всё равно что-то не то
Код:
61:177:252:126:55:185:61:216:254:126:55:185:61:216:254:126:173:185:61:126:55:185:END
61:177:254:126:55:185:61:177:252:126:55:185:61:216:254:126:55:185:61:126:55:185:END
61:216:254:126:55:185:61:177:252:126:55:185:61:177:252:126:173:185:61:126:55:185:END
61:177:252:126:55:185:61:177:252:126:55:185:61:216:254:126:55:185:61:126:55:185:END
61:177:254:126:55:185:61:177:254:126:55:185:61:216:254:126:55:185:61:126:55:185:END
61:216:254:126:55:185:61:255:252:126:55:185:61:216:254:126:55:185:61:126:55:185:END
61:177:252:126:55:185:61:216:254:126:55:185:61:255:252:126:55:185:61:126:55:185:END
61:177:252:126:55:185:61:255:252:126:55:185:61:177:252:126:173:185:61:126:173:185:END
неплохо бы выложить все схемы соединений. Вдруг Вы там чего накосячили(такое бывает ;) ).
я мог:)🙃. ТХ с конвертера на 11 пин ардуины, RX - на 10, GND на "-", VCC на "+", проверял несколько раз, или вы не про это? Что китайцы напаяли в переходнике не знаю, и как это проверить не представляю
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
133
@mikolaki,
Если верить протоколу, то должен быть стартовый байт 0xAA (170) У вас такого нет. Подбирайте скорость дальше. Стартовый байт может быть не обязательно в начале, т.к. вы при чтении не синхронизуетесь на стартовый байт.
 

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
Если верить протоколу, то должен быть стартовый байт 0xAA (170) У вас такого нет
ну да, тоже это заметил, посмотрел родную программу. Как я понял, она читает данные до тех пор, пока не окажется, что первый байт 0xAA, и после этого начинает их расшифровывать. Не то мне не везёт, не то я что-то делаю не так, не то китайцы что-то не то напаяли в переходнике. Не знаете, они все подходят для приёма данных?

или нельзя просто так отпаять от платы "маму" и припаять на её место "папу"?
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
133
Если у вас работает с программой на ПК. То подключите к ПК, запустите программу терминала (например Terminal v1.93b) и перебирайте скорости. Когда найдете рабочую скорость и поймете протокол, то переходите к ардуино.

Может тут кто знает, как определить скорость на которой работает СОМ на ПК. Раньше можно было через PortMon. Как сейчас не знаю.
 
  • Лойс +1
Реакции: mikolaki

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
@Bruzzer,
если у вас винда, то смотрите "настройки COM порта" в "диспетчере устройств"
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
В оригинальной программе есть ApdComPort1 - у него есть свойства (если открыть в той же дельфи или что это, лазарус) и посмотреть выставленную там скорость.
 

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
То подключите к ПК, запустите программу терминала (например Terminal v1.93b) и перебирайте скорости. Когда найдете рабочую скорость и поймете протокол, то переходите к ардуино.
подключил, посмотрел, что она читает. Первый байт 0хAA есть только на скорости 9600, встречается очень часто. На других скоростях его ниразу не видел. На ардуине на такой скорости порта во всех байтах 0xFF

как определить скорость на которой работает СОМ на ПК. Раньше можно было через PortMon. Как сейчас не знаю.
сейчас не запускается. Пишет ошибка 2 и закрывается. Да и фиг с ней

если у вас винда, то смотрите "настройки COM порта" в "диспетчере устройств"
родной программе пофиг, что там стоит. Работает одинаково с любой выставленной скоростью. Видимо, настраивает порт сама как ей надо

В оригинальной программе есть ApdComPort1 - у него есть свойства (если открыть в той же дельфи или что это, лазарус) и посмотреть выставленную там скорость.
в чём это посмотреть и как открыть не знаю. Открыл в notepad++

Заказал у китайцев другой переходник, может с ним будет работать. Жаль, что ждать долго :(:cry:. Попробовал прозвонить кабель, что-то совсем запутался. Займусь им завтра
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
должен быть файл с расширением dfm, он может быть тестовым. В нем буде объект (object) с названием ApdComPort1 и в сл. строках будут расписаны его поля.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
472
133
@mikolaki,
У вас есть осциллограф чтобы проверить уровни сигнала на выходе устройства? Может быть уровни и так ТТЛ.
Если осциллографа нет, то можно на удачу попробовать запустить софт сериал с инверсной логикой.
И замечание - на этапе проб, вызывая mySerial.readBytes(buf, BUF_SIZE); имеет смысл получать результат - количество прочитанных байт, и выводить только это кол-во а не весь буфер целиком.
 
  • Лойс +1
Реакции: mikolaki

SergejEU

★★✩✩✩✩✩
16 Сен 2020
120
73
подключил, посмотрел, что она читает. Первый байт 0хAA есть только на скорости 9600, встречается очень часто. На других скоростях его ниразу не видел. На ардуине на такой скорости порта во всех байтах 0xFF
можно считать, что скорость обмена установлена. Теперь смотрите на настройки COM порта в программе Terminal, в которой наблюдали данные. А именно, какое управлене потоком установлено. И если оно аппаратное, то какие хендшейки (RTS/CTS) используются? Установлен ли Бит четности или стоповый бит?

Если хендшейки в настройках обоих портов не совпадают, то данные скорее всего не будут отправлены вообще. В моей практике, при работе с одним экзотическим BLE модулем через виртуальный UART, я не мог получить ответы ни на одну AT комманду до тех пор, пока не включил в настройках хендшейк RTS/CTS. И сразу увидел реакцию на AT0 в терминале
 
  • Лойс +1
Реакции: mikolaki

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
Вроде разобрался. Дело было в кабеле. Комплектный был как на картинке снизу, а нужен такой, как сверху. Спаял как надо и заработало. видимо, это и имел ввиду @Старик Похабыч в первом сообщении, но это я понял как-то не сразу. Данные совпадают с тем, что показывал Terminal на компе. Сейчас попробую расшифровать. И как я понимаю, если TX с конвертера подключить к D0, а RX к D1, то данные с него можно будет читать через аппаратный Serial?
Ещё хотел спросить, что делать, если скетч не влезает в память из-за библиотек? Пока что есть две мысли, или использовать ардуино мега, или взять две ардуино нано и соединить их между собой.
Код:
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:64:55:0:FF:4:EE:CheckSum = EE CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:64:55:0:FF:4:EE:CheckSum = EE CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:61:55:0:FF:4:EB:CheckSum = EB CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:60:55:0:FF:4:EA:CheckSum = EA CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:60:55:0:FF:4:EA:CheckSum = EA CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:62:55:0:FF:4:EC:CheckSum = EC CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:60:55:0:FF:4:EA:CheckSum = EA CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:60:55:0:FF:4:EA:CheckSum = EA CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:61:55:0:FF:4:EB:CheckSum = EB CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:63:55:0:FF:4:ED:CheckSum = ED CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:63:55:0:FF:4:ED:CheckSum = ED CheckSum OK!
AA:0:0:64:1:0:3:17:1:4:2:6:0:0:0:FC:61:55:0:FF:4:EB:CheckSum = EB CheckSum OK!
012214712614.png
 

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
Поработало всё полдня и перестало. Ардуино читает только нули, через комп всё нормально. Получается, что сдох конвертер, или может быть какая-то другая причина?
 

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
приехал из Китая новый переходник, если компилировать скетч в Arduino IDE, то всё работает, получается как и должно быть, байт синхронизации AA, дальше данные. К прибору подключен кусок провода, меряет его сопротивление, которое постоянное

скетч:
#include <Arduino.h>
#include <SoftwareSerial.h>

#define BUF_SIZE 22

SoftwareSerial mySerial(6, 7); // RX, TX

//массив полученных данных
byte buf[BUF_SIZE];

void setup()
{
    Serial.begin(9600);    
    mySerial.begin(9600);
}
void loop()
{
    if(mySerial.available())
    {
        mySerial.readBytes(buf, BUF_SIZE);
        for(int i = 0; i < BUF_SIZE; i++)
        {
            Serial.print(buf[i], HEX);
            Serial.print(":");
        }
        Serial.println("");
    }
}
правильные данные

Код:
AA:0:0:64:1:0:3:13:1:7:9:6:1D:0:0:FC:5B:58:0:FC:4:8:
AA:0:0:64:1:0:3:13:1:7:9:6:1D:0:0:FC:58:58:0:FC:4:5:
AA:0:0:64:1:0:3:13:1:7:9:6:1D:0:0:FC:58:58:0:FC:4:5:
AA:0:0:64:1:0:3:13:1:7:9:6:1D:0:0:FC:58:58:0:FC:4:5:
AA:0:0:64:1:0:3:13:1:7:9:6:1D:0:0:FC:59:58:0:FC:4:6:
AA:0:0:64:1:0:3:13:1:7:9:6:1D:0:0:FC:56:58:0:FC:4:3:
AA:0:0:64:1:0:3:13:1:7:9:6:1D:0:0:FC:56:58:0:FC:4:3:
AA:0:0:64:1:0:3:13:1:7:9:6:1D:0:0:FC:56:58:0:FC:4:3:
AA:0:0:64:1:0:3:13:1:7:9:6:1D:0:0:FC:56:58:0:FC:4:3:
если тот же скетч скомпилировать в Platformio для VSCode, то данные получаются совсем другие, по-моему рандом полный

Код:
D6:0:0:2A:4:1A:2D:2:3:22:A8:0:0:F8:C7:16:0:0:CE:D6:0:0:
2A:4:1A:2D:2:3:22:A8:0:0:F8:C7:16:0:0:CE:D6:0:0:2A:4:1A:
2D:2:3:22:A8:0:0:F8:C6:16:0:0:F3:D6:0:0:2A:4:1A:2D:2:3:
22:A8:0:0:F8:C6:16:0:0:F3:D6:0:0:2A:4:1A:2D:2:3:22:A8:0:
0:F8:C6:16:0:0:F3:D6:0:0:2A:4:1A:2D:2:3:22:A8:0:0:F8:C5:
16:0:0:CE:D6:0:0:2A:4:1A:2D:2:3:22:A8:0:0:F8:C5:16:0:0:
CE:D6:0:0:2A:4:1A:2D:2:3:22:A8:0:0:F8:C5:16:0:0:CE:56:0:
как заставить его работать в platformio? Понравилась намного больше. Плата выбрана правильно, другие скетчи работают одинаково
 
Изменено:

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
@Boroda22, с какой кодировкой? Там байты, которые выводятся в HEX. Кодировка там латинская, которая везде одинаковая

@Геннадий П,
похоже, но перепробовал все стандартные скорости 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200. Данные меняются, но всёравно неправильные. С нестандартными, вообще не работает
 

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
@Геннадий П, в platformino 16 МГц

JSON:
{
  "build": {
    "core": "arduino",
    "extra_flags": "-DARDUINO_AVR_NANO",
    "f_cpu": "16000000L",
    "mcu": "atmega328p",
    "variant": "eightanaloginputs"
  },
  "bootloader": {
    "efuse": "0xFD",
    "file": "atmega/ATmegaBOOT_168_atmega328.hex",
    "hfuse": "0xDA",
    "lock_bits": "0x0F",
    "lfuse": "0xFF",
    "unlock_bits": "0x3F"
  },
  "debug": {
    "simavr_target": "atmega328p",
    "avr-stub": {
      "speed": 115200
    }
  },
  "frameworks": [
    "arduino",
    "simba"
  ],
  "name": "Arduino Nano ATmega328",
  "upload": {
    "maximum_ram_size": 2048,
    "maximum_size": 30720,
    "protocol": "arduino",
    "require_upload_port": true,
    "speed": 57600
  },
  "url": "https://www.arduino.cc/en/Main/ArduinoBoardNano",
  "vendor": "Arduino"
}

пробовал в nanoatmega328.json менять частоту. Ставил 8 или 20 МГц, получается непонятно что. На другие частоты ругается, что текущая версия SoftwareSerial поддерживает только 8, 16 и 20 МГц. Как посмотреть, что настроено в Arduino IDE не знаю

С 8 МГц получается так:
JJS␌��␌h��KJ�JM��Z�[h����␌N���␎KJJKZS���J�␌i�␌N��
JJS␌��␌��
␎␎�J�Z�[���JS
�JJ�K�@␎␎��␌jJJJ�␌␎�␌N��
:�J�JJZJJ���KJJ�JJkJ␎␎JKJJK��␎KJ␌N�␌jJ�J�␌␎�␌N��
JJS␌��␌�0
␎␎��MJjKzJ�JKJJK��␎KJJKZS���J��ZjJJ�␌␎JJZJJZS��Ȃ)N�L␎␎JKJJK̭�␎�JJKZS�(JJ�␌N��
JJS␌��␌���jJJJMZ��@ӥ�JKJJJ[�␎KJJKZS�HJJ�␌␎�␌N␎�
JJS␌��␌��
␎␎NJ�Z�[ĥ�␀�KJJJ[�␎KJJKZS��JJ�␌N�����JS␌�̟(��jJJJM�S�@␎��␀N�␌␎␎K��[��
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,969
632
44
@mikolaki, Ну, смысл в том, что на Platformio порт почему то медленней работает, примерно на 15-20%, поэтому и получается такое. Из-за чего это происходит - хз.
 
  • Лойс +1
Реакции: mikolaki

mikolaki

✩✩✩✩✩✩✩
25 Янв 2022
17
0
кажется разобрался, в чём было дело. В platformio.ini было написано
INI:
lib_extra_dirs = C:\Program Files (x86)\Arduino\libraries
и библиотеку softwaresirial оно брало отсюда, где она аж за 2014 год. В профиле пользователя тоже есть softwareserial, которая находится %userprofile%\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.5\libraries\ там она поновее, за 2022 год, файлы отличаются достаточно сильно. Видимо, Arduino IDE библиотеки сначала ищет в этой папке. Поменял Softwareserial.h, подсунул в platformio новую версию, всё заработало
 
Изменено: