기술자료/델파이팁

비트통신법 알려주세요~

theF 2011. 4. 6. 09:22

re] 비트통신법을 알려주세요...ㅡ..ㅡ 
 

안녕하셔요...

음..통신이 시리얼(rs232) 이죠..

그렇다면 비트 또는 니블 통신이라는 것도 결국 바이트 통신과 같습니다.

다만 바이트는 상대편이 한 바이트를 가지고 하나의 정보를 가지는것이고

비트는 한바이트를 가지고 8개의 각각 다른 정보를 가지는것이고

니블은 한바이트를 가지고 2개의 각각 다른 정보를 가지는 것이랍니다.

그럼..예를 들어 볼까요...

1. 비트 통신

비트는 주로 DI,DO등의 접점에 많이 쓰이죠..

한바이트 가지고 8개의 DI,DO를 제어할수 있어닌깐 통신량이 그만큼 줄어들겠죠..

예를 들어 8개의 램프가 있고 이걸 켜고 싶다면(비트로 매핑되어 있을 경우)

실제 데이터는 한바이트만 쓰여지죠..

const 
  BitFieldOn : array[1..8] of Byte = ($01,$02,$04,$08,$10,$20,$40,$80); 
  BitFieldOff : array[1..8] of Byte = ($FE,$FD,$FB,$F7,$EF,$DF,$BF,$7F);

var 
  senddata : Byte;

  senddata := 0; //데이터 초기화

  //1번,7번을 켜고 싶을 경우 
  senddata = senddata or BitFieldOn[1]; 
  senddata = senddata or BitFieldOn[7];

  //전송 
  comport.writechar(senddata);

  //7번을 끄고 싶을 경우 
  senddata = senddata and BitFieldOff[7]; 
  //전송 
  comport.writechar(senddata);

또는 귀찮어시면 다음 함수를 사용하셔도 됩니당.

// 주어진 바이트에서 원하는 비트를 끄잡어 내기.. 
function GetBitFromByte(B : Byte; Count: Integer) : Boolean; 
begin 
  Case Count of 
    0: Result := Boolean((B and $80) shr 7); 
    1: Result := Boolean((B and $40) shr 6); 
    2: Result := Boolean((B and $20) shr 5); 
    3: Result := Boolean((B and $10) shr 4); 
    4: Result := Boolean((B and $08) shr 3); 
    5: Result := Boolean((B and $04) shr 2); 
    6: Result := Boolean((B and $02) shr 1); 
    7: Result := Boolean(B and $01); 
  else 
    Result := True; 
  end; 
end;

// 주어진 바이트에 원하는 비트를 셋팅하기.. 
procedure SetBitToByte(var B : Byte; Count: Integer; Value: Boolean); 
begin 
  Case Count of 
    0: if Value then B := B or $80 else B := B and $7F; 
    1: if Value then B := B or $40 else B := B and $BF; 
    2: if Value then B := B or $20 else B := B and $DF; 
    3: if Value then B := B or $10 else B := B and $EF; 
    4: if Value then B := B or $08 else B := B and $F7; 
    5: if Value then B := B or $04 else B := B and $FB; 
    6: if Value then B := B or $02 else B := B and $FD; 
    7: if Value then B := B or $01 else B := B and $FE; 
  end; 
end;

2. 니블 통신

니블은 주로 카운터를 표시할때 많이 쓰이죠..

예를 들어 자동차 키로수처럼 카운터 메터를 표시할경우 한바이트로 두개의 영역을

표시할수 있어닌깐 이또한 통신 데이터를 줄일수 있겠죠..

예를 들어 9999를 표시한다면 두바이트면 되겠죠..

var 
  aa,bb : Byte; 
begin 
  aa := 0; 
  bb := 0;

  //1234를 전송할 경우 
  aa := ($01 shl 4) or $02; 
  bb := ($03 shl 4) or $04;

  comport.writechar(aa); 
  comport.writechar(bb); 
end;

휴~ 이상 입니당.

그럼..즐거운 주말 되시구요..항상 건강하셔요..

>장비가 10년전거라그러는데요, 지금도 사용잘하고 있답니다. 
>그당시 플을 업그레이드 하면서 제가 델로 하니까 델로 업을 하려는데요 
>비트통신이 되야되거든요... 
>이중에서도 두가지 입니다. 한종류는 비트통신 또하나는 4bit를 한 값으로 
>이용하는 니블통신이요. 
>이자 겨우 바이트 통신을 알게 된지 얼마 안되었는데 
>비트 통신을 하게 되었답니다.. 
>단, 4비트의(니블값) 최고값이 9를 넘지는 않더군요...즉 0 에서 9까지만여 

>지금 고민중이긴 한데 될듯될듯 안되네요...ㅜ..ㅜ 

>예제나 샘플이나 know-where등등 많이 많이 알려주시와요... 
>언릉 끝내야 하거든요.... 

>감사합니다....