apdcomport bileşeni ile ilgili.
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
apdcomport bileşeni ile ilgili.
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.
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.
- uğur alkan
- Üye
- Mesajlar: 227
- Kayıt: 29 Ağu 2004 04:49
- Konum: Istanbul
- uğur alkan
- Üye
- Mesajlar: 227
- Kayıt: 29 Ağu 2004 04:49
- Konum: Istanbul
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
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.
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.
- uğur alkan
- Üye
- Mesajlar: 227
- Kayıt: 29 Ağu 2004 04:49
- Konum: Istanbul
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
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
benim haberleşme karekterlerim normal karekterlerim
umarım anlatabilmişimdir.
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]';
[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;
umarım anlatabilmişimdir.
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
uğur kardeş yine ben
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