Seriporttan okunan anlamsız karakterler????

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen m_ekici »

Merhaba

Aslangeri'nin karşılaştığı problemin aynısı bende de var. Hyper terminal ile portu açıp kapatana kadar benim program veri almıyor. Bu sorunu nasıl çözerim? Test programını da tekrar yüklemeniz mümkün mü?
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen freeman35 »

Component içindeki parametre ve getdata result tipini hatta tüm component içindeki "string" tiplerini "ansistring" tipine çevirip component ı tekrar build edip bir dene, Muhtemelen Delphi yeni version larını kullanıyorsundur, bunlarda string tiplerin hepsi unicode tipinde, okuduğu array ler "Char" tipinde. genelde bu eski yazılmış component tiplerinde bu sorunlar olabiliyor.
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen m_ekici »

hyper terminal ile portu tetikledikten sonra okumada sorun yok. program normal bilgi alıyor. stringlerle ilgili bir hata olsa bu durumda da çalışmaması lazım değil mi?
tşk
Kullanıcı avatarı
baypipox
Üye
Mesajlar: 122
Kayıt: 16 Eki 2006 04:23
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen baypipox »

Hocam sizin probleminiz handshake den kaynaklanıyor olabilir.
Hangi componenti kullanıyosunuz bilmiyorum ama, ya cihazdan handshake i kapatın (varsa), yada kenti tarafınızdan iletişim ayarında Flow Control'ü RtsCts yapın...
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen omurolmez »

Tarih çok geçmiş ama yine de yazayım. Bu seriport muhabbetiyle çok karşılaşıyorum. Olayın esrpisi şurada. Seri porta yazan cihaz (mesela barkod okuyucu olsun) ve windows birbirinden bağımsız çalışır. Herkes şöyle bir önyargı içinde. Diyelim ki barkod boyu 10 byte. Ya seri portta hiç veri yoktur ya da 10 un katı kadar byte vardır zannediliyor. Bu yanlış. İşin doğrusu, seri portta baktığınız anda herhangibir sayıda byte hazır olabilir. Mesela henüz 6 byte ın transferi tamamlanmış ve kalan 4 byte transfer ediliyor olabilir. Bu anlık (ms civarında) da olsa programınızda bunu yakalama ihtimaliniz yüksektir.

Daima kendi tamponunuzla çalışmalısınız. Yapı şöyle olmalı :
başla
seri portta kaç byte var öğren
o kadar baytı oku ve kendi tamponuma ekle
kendi tamponumda CR var mı ?
varsa veri gelmiş. tampon başından CR ye kadar olan veriyi tampondan çıkar ve kullan ( CR den sonrakiler henüz tamamlanmamış yeni pakete ait, dokunma).
başa dön
Ömür Ölmez
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: Seriporttan okunan anlamsız karakterler????

Mesaj gönderen m_ekici »

Çözümü şu şekilde buldum;

Veri sürekli geldiği için CR karakteri sürekli doğru yerde gelmiyor.
TComport, ComDataPocket ve ComTerminal Componetleri ile bilgi alıyorum. TComterminal bilgiyi doğru şekilde (ve çok hızlı) ekranda gösteriyor. Gelen 3 adet paketi sırayla okutuyorum. 3 paketten 2 si birbiriyle aynı (ve sıfırdan farklı) ise doğru kabul edip değeri alıyorum. bir kaç test yaptım hatasız okudu. Sürekli kullanmaya bu hafta başlıyorum, problem çıkarsa haberdar ederim.

Kod: Tümünü seç

procedure TfBarMenu.ComTerminalStrRecieved(Sender: TObject; var Str: string);
var
Sec : Shortint;
begin
Sec:=KGS;
case Sec of
  0: begin
     KG1 := KgStr(str);
     KGS := 1;
     end;
  1: begin
     KG2 := KgStr(str);
     KGS := 2;
     end;
  2: begin
     KG3 := KgStr(str);
     KGS := 0;
     end;
  end;
end;

procedure TfBarMenu.ComDataPacket1Packet(Sender: TObject; const Str: string);
begin
ComDataPacket1.ResetBuffer;
end;

procedure TfBarMenu.KayitBtnClick(Sender: TObject);
var
BRUTKG : Double;
begin
BRUTKG := 0;
if ((KG1=KG2) and (KG1<>0)) then BRUTKG := KG1 else
if ((KG1=KG3) and (KG1<>0)) then BRUTKG := KG1 else
if ((KG2=KG3) and (KG2<>0)) then BRUTKG := KG2 else exit;

// BRUTKG okundu 
end;

function KgStr(TUT:String):Double; 
var // sayı haricinde gelen karakterleri almıyor ve decimal karakteri "." ise "," ile değiştiriyor. 
I: Integer;
TStr:String;
begin
try
TStr := '';
For I:=1 to length(TUT) do
    begin
    If (TUT[I] in ['0','1','2','3','4','5','6','7','8','9']) Then TStr:=TStr + TUT[I];
    If (TUT[I]='.') Then TStr:=TStr + ',';
    end;
Result:= StrToFloat(TStr);
except
Result := 0;
end;
end;
Cevapla