Zdravím.
Komunikací s arduinem jsem už několikrát řešil, ale odesilal jsem řetězec.
Ser.SendString('test');
Bych potřeboval odeslat Hex 52 0d 0a
Tak tam to CRLF synaser nepřidává je třeba to tam poslat celé, já má tu sekvenci CRLF ($0D + $0A) v constantě.
const
CR = #$0d;
LF = #$0a;
CRLF = CR + LF;
jinak na binární data bych použil spíš funkci sendbuffer
function TBlockSerial.SendBuffer(buffer: pointer; length: integer): integer;
sendString to tam stejně přeposílá, vezme pointer na string a jeho délku a pošle to
SendBuffer(pointer(data), lenght(data)) ; //kde data je ten string
Tak ještě něco je špatně.
http://img24.cz/…74398586.png
To první je odeslane přes ser monitor 52 0d 0a jako hex a jde vidět že mi to vratilo váhu 0.kg
To druhe je Ser.SendString(#$52#$0d#$0a);
A nic nevratí.
Ser.Config(9600, 8, 'N', 0, False, False);
Ser.Connect('COM6');
A takto mám nastavený ser.monitor, přes který to funguje.
http://img24.cz/images/07123974130337788982.png
no na tom prvním obrázku je vidět že to snad odešlo a stejně jako v prvním případě, takže problém bude spíš s příjmem nebo na straně váhy, nevím jak u té váhy funguje paměť měření rezp příkazy,
Já dělal program pro vyčítání dat z refraktoru (měření Cukru v nápojích), tam když jsem vyčetl data posledního měření tak do dalšího měření byla mezipaměť prázdná a nic to nevracelo.
#10 MilanL
Ne, problem je u mně.
Přes lazarus použivám komponentu LazSerial, která použivá unity od synapse.
https://github.com/zbyna/LazSerial
LazSerial1.WriteData(#$52#$0d#$0a);
A normalně to je funkční a i přichozí data přijimám.
A takto to mám nastavene
http://img24.cz/…58700582.png
#12 MilanL
To jsem zkoušel.
I takto Ser.SendString('R'#13#10);
http://img24.cz/…80965915.png
#14 gna
http://synapse.ararat.cz/…kSerial.html
Ser.Config(9600, 8, 'N', SB1andHalf, False, False);
Nic
Ha, nějakou chybu mam ve čtení.
Najdu někde nějake demo ohledně čtení přes ten ser.port?
procedure TForm1.Timer1Timer(Sender: TObject);
var
Rcvd : string;
begin
Rcvd := '';
if Ser.LastError = 0 then
begin
if Ser.CanRead(10000) then
begin
Rcvd := Ser.Recvstring(10000);
end;
Memo1.Lines.Add(Rcvd);
Ser.Purge;
end;
Čitat to nechce.
Vrací mi to mezera 9997 mezera 9997 atd.
procedure TForm1.Timer1Timer(Sender: TObject);
var
i:integer;
Replystring:string;
begin
if Ser.LastError = 0 then
begin
Ser.SendString(#$52#$0d#$0a);
Replystring := Ser.recvstring(2000);
Memo1.Lines.Add(Replystring);
Memo1.Lines.Add(IntToStr(Ser.LastError));
Ser.Purge;
end
else
begin
i:= Ser.LastError;
Memo1.Lines.Add('chyba'+ IntToStr(Ser.LastError));
end;
end;
mimrod007@seznam.cz
Se omliuvám, zařizení je v prací a ja jsem poctívý zaměstnanec a dodržují pracovní dobu
Mně ještě napadlo zkusit ten lazarus.
Připijít k portu tu komponentu LazSerial, odeslat ty data,odpojít, připojit se jen přes synapse a zkusit načist data.
Pokud to tak pujde, měl bych zjistít, zda je problem v odesilaní, nebo ve čtení
#23 MilanL
Ono to funguje.
Jsem si napsal programek do arduina.
Posilam mu po ser.p. data a ono podle toho co mu přijde odpovida.
Ono něco schazi při odesilaní toho hex
Jsem si zkusil nainstalovat komponentu ZylSerialPort.
Vyhazuje hlašku, že je to demo, ale jinak plně funkční.
Tato komponenta komunikuje, ale vraci se mi jen ERR04.
http://img24.cz/…98940132.png
Takže mužu být rad, že mi to alespon přes ten lazarus chodí a budu muset ten program napsat v něm.
#25 MilanL
btw jakej máš čas v timeru, nelezou ti do sebe jeho přerušení? vše chvilku trvá, než se to pošle, než zařízení připraví odpověď, ve funkci čtení máš timeout, tak vše dohromady chvíli trvá a jestli máš krátký cyklus timeru může to lézt do sebe.
Jsem k tomu heblu našel i dokumentaci a je tam popsana i komunikace.
6. COMMUNICATION STRINGS
7. COMMUNICATION CONTROLS
https://www.vetek.se/Dynamics/Documents/543cef61-c61d-4fdb-b350-f7d6b7fdb100/TECH_MAN_ENG_DFW_v4.pdf
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku