apdcomport bileşeni ile ilgili.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
meron06
Üye
Mesajlar: 393
Kayıt: 15 Eki 2005 04:23

apdcomport bileşeni ile ilgili.

Mesaj gönderen meron06 »

Sel.Al. arkadaşlar.forumda aradım fakat anlaşılır bişey bulamadım.apdcomport bileşeni ile port tan bilgi okumaya çalışıyorum.asci tablosundaki SOH,NUL,ETX,EOT,STX gibi komutlar porta nasıl gelir.daha önce kullandığım yöntemle (başka bi labaratuvar cihazında) bu komutları ayırt edebiliyordum.kullandığım yöntem şu şekilde..

for I := 1 to Count do begin
C := poku.GetChar;
case C of
#0..#31 :begin
komut:='';
case ord(c) of
0:komut:='[NUL]';
1:komut:='[SOH]';
2:komut:='[STX]';
3:komut:='[ETX]';
4:komut:='[EOT]';
5:komut:='[ENQ]';
6:komut:='[ACK]';
7:komut:='[BEL]';
8:komut:='[BS]';
9:komut:='[HT]';
10:komut:='[LF]';
11:komut:='[VT]';
12:komut:='[FF]';
13:komut:='[CR]';
14:komut:='[SO]';
15:komut:='[SI]';
end;
S:=S+komut;

bu yöntemi kullanarak komutları alabiliyor ayırt edebiliyordum.şimdi becman colter diye bi cihaz var ve bu cihazda da aynı kodları kullandım ama bu kez porttan bilgi okuyamadım.cihazın dökümanlarında hep hex değerlerkullanılmış. burda öğrenmek istediğim port mantığında gelen datalar hep hex değermidir.koddaki #0..#31 bu komutların decimal değerleri ben burda gelen bilgiyi hex olarak nasıl değerlendirebilirim.örneğin 01(hex) değer geldiğinde bunu nasıl SOH komutu olarak algılatabilirim.
Kullanıcı avatarı
uğur alkan
Üye
Mesajlar: 227
Kayıt: 29 Ağu 2004 04:49
Konum: Istanbul

Mesaj gönderen uğur alkan »

Cihazın sana ne gönderdiğine bağlı bazen ASCII bazen HEX dönebilir.
Sana HEXTOASCII türü bişey lazım... porttan ne geldiğini memoya veya edite yazdır. Ona göre diğer fonksiyonlar ile bişeyler yapılabilir.
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
meron06
Üye
Mesajlar: 393
Kayıt: 15 Eki 2005 04:23

Mesaj gönderen meron06 »

uğur kardeş peki apdcomport getchar ı gelen hertülü bilgiliyi okurmu yani hex bi değer geldimi bu yöntemle porttan bilgi alabilirmiyim .
Kullanıcı avatarı
uğur alkan
Üye
Mesajlar: 227
Kayıt: 29 Ağu 2004 04:49
Konum: Istanbul

Mesaj gönderen uğur alkan »

Getchar fonksiyonu ne gelirse gelsin karekter olarak alıp yorumluyor. mesela binary gelirse; '10010101' geldiğini farzet bunu sana "1","0",.... olarak döndürür işlemek sana kalmış o yüzden direkt olarak bi yere yazdırırsan ne gelip ne gidiyor görürsün ona göre hareket etmek daha kolay olur. mikroişlemciler PC ile genellikle ASCII (Karakter olarak) haberleşirler HEX (56) sana "5","6" olarak iki hamlede gelir.
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
meron06
Üye
Mesajlar: 393
Kayıt: 15 Eki 2005 04:23

Mesaj gönderen meron06 »

uğur kardeş yukarda yazdığım kod başka cihazda çalışıyor yani 101010 şeklindede gelse mesela ben diyorum ord(01) SOH a karşılık geliyor ve yukarda yazdığım kod çalışıyor yani burda demek istediğim SOH ETX gibi komutlar karakter karakter deyilde bir bütün olarakmı geliyor.(getchar oalyında komutlar birbütün olarak kendiliğinden ayrıştırılıyormu.) eğer 1010 bilgisi geldiğinde bunu önce 1 i sonra 0 ı alarak işlese

C := poku.GetChar;
case C of
#0..#31 :begin
komut:='';
case ord(c) of
0:komut:='[NUL]';
1:komut:='[SOH]';
2:komut:='[STX]'; bu kodun hiç çalışmaması gereki.örneğin porta 01 geldiğinde önce 0 ı sonra 1 alacak dolayısıyla da gelen komutun SOH olduğunu anlamayacak.
Kullanıcı avatarı
uğur alkan
Üye
Mesajlar: 227
Kayıt: 29 Ağu 2004 04:49
Konum: Istanbul

Mesaj gönderen uğur alkan »

Getchar sadece porttun bufferinden okur yani ASCII tablo üzerindeki karekterler kullanılarak haberleşme yapılır.
GetChar komutu 1byte bilgi okuma kabiliyetine sahiptir.
(1Byte=1 tane ASCII Karakter=0-225 arasında bir sayı) senin portun
bufferından 1 byte okudun diyelim

Kod: Tümünü seç

C := poku.GetChar; 
case C of 
#0..#31 :begin 
komut:=''; 
case ord(c) of   <----------------
0:komut:='[NUL]'; 
1:komut:='[SOH]'; 
yukarıda gösterdiğim satırda sen porta düşen değerin(karekterin) ASCII değerine ulaşıyorsun yani gerçekte senin porttan okuduğun deger ASCII degeri sen bunu alıyorsun ve bir karektere dönüştürüp karşılaştırıyorsun.

[NUL] =' ' boşluk anlamında ascii değeri= 0
[SOH]='' garip bir karekter( rdeğil) ascii değeri=1
------
Klavyede kullanılmayan değerleri kullanarak kıyaslama yapıyorsun

var sayalım porta karekter olarak "0" düştü ASCII 48 değeri bunu burada
yorumluyamazsın

portun bufferine senin anlıyacagın sadece karekter düşer ve bununda ASCII değerini kullanarak işlemlerini yaptırabilirsin benim yazdığım başka bir kod var onu örnek olarak sana gönderiyorum ORD kullanmadım ben

Kod: Tümünü seç


procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
I : Word;
C : Char;
S : String;
begin
S := '';
for I := 1 to COUNT do
begin
C := ApdComPort1.GetChar;
//------------------------------------------- baskı say????
IF C='A' THEN
BEGIN
ANASAYAC:=ANASAYAC+1;
FORM1.RzLEDDisplay1.Caption:=INTTOSTR(ANASAYAC);
IF ANASAYAC=STRTOINT(FORM1.RzLEDDisplay2.Caption) THEN
BEGIN
Form1.RzLEDDisplay3.Caption:='STOP';
start:=0;
form1.ApdComPort1.PutString('SBFXMXF');
form9.visible := false;
form9.showmodal;
Form1.RzLEDDisplay5.Caption:='BASKI TAMAM';
END;
END;
//-------------------------------------------//butonlarla manuel moda geçildi....
IF C='B' THEN
BEGIN
form10.Label1.Caption:='ACİL STOP';
IF FORM_AKTIF=0 THEN
BEGIN
Form1.RzLEDDisplay5.Caption:='ACiL STOP';
form1.ApdComPort1.PutString('SBFXMXF');
Form1.RzLEDDisplay3.Caption:='STOP';
start:=0;
FORM_AKTIF:=1;
END;
END;
//-------------------------------------------//butonlarla manuel moda geçildi....
IF C='C' THEN
BEGIN
IF FORM_AKTIF=0 THEN
BEGIN
Form1.RzLEDDisplay5.Caption:='STOP BUTON';
Form1.RzLEDDisplay3.Caption:='STOP';
start:=0;
FORM_AKTIF:=1;
END;
END;
//-----------------------------------------------
IF C='D' THEN
BEGIN
IF FORM_AKTIF=0 THEN
BEGIN
Form1.RzLEDDisplay5.Caption:='ALT BARiYER';
Form1.RzLEDDisplay3.Caption:='STOP';
start:=0;
FORM_AKTIF:=1;
END;
END;
//'-----------------------------------------------
IF C='K' THEN
BEGIN
form10.Label1.Caption:='1. Kafa Hareket Edemiyor';
END;
IF C='E' THEN
BEGIN
form10.Label1.Caption:='2. Kafa Hareket Edemiyor';
END;
IF C='F' THEN
BEGIN
form10.Label1.Caption:='4. Kafa Hareket Edemiyor';
END;
IF C='G' THEN
BEGIN
form10.Label1.Caption:='5. Kafa Hareket Edemiyor';
END;
IF C='H' THEN
BEGIN
form10.Label1.Caption:='7. Kafa Hareket Edemiyor';
END;
IF C='J' THEN
BEGIN
form10.Label1.Caption:='8. Kafa Hareket Edemiyor';
END;
IF C='Q' THEN
BEGIN
form10.Label1.Caption:='HAVA YOK KONTROL EDiNiZ !!! ';
END;
IF C='O' THEN
BEGIN
form10.Label1.Caption:='Pozisyon Hatası';
END;
IF C='M' THEN
BEGIN
Form1.RzLEDDisplay3.Caption:='MANUEL';
OTOMATIK:=0;
MANUEL:=1;
END;
IF C='Z' THEN
BEGIN
Form1.RzLEDDisplay3.Caption:='NUMUNE';
OTOMATIK:=0;
MANUEL:=1;
END;

benim haberleşme karekterlerim normal karekterlerim
umarım anlatabilmişimdir.
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
meron06
Üye
Mesajlar: 393
Kayıt: 15 Eki 2005 04:23

Mesaj gönderen meron06 »

uğur kardeş çok teşekkür ederim .iyi çalışmalar.
oguthan
Üye
Mesajlar: 34
Kayıt: 30 May 2005 10:23

uğur kardeş yine ben

Mesaj gönderen oguthan »

hocam bu bileşen paketini yükledim delphi ortamına com prt bileşeninin ekledim terazim baund rate : 9600 stop bit :1 data bit 8 olarak bilgi gönderiyor bileşeni açtığım zaman buffer is empty diye bir error alıyorum ne yapmam gerek veya doğru bileşeni mi kullandım ?
oguthan
Cevapla