Set Until channel, packetlength, untilchar, charCheck
channel : 사용채널 (1부터 3) |
packetlength : 패킷수 |
untilchar : 종료캐릭터 (캐릭터는 "S" 처럼 쌍따옴표로 둘러쌓은 캐릭터 또는 숫자) |
charCheck : 종료캐릭터 체크여부 (0=체크함, 1=체크안함), 생략시 0 |
일종의 조건부 수신 인터럽트 발생 선언문입니다. ON RECV만 선언한 상태에서는 수신버퍼에 단 1바이트의 데이터만 도착해도 수신 인터럽트가 발생됩니다. 계속해서 RS232데이터가 도착한다면, 너무 잦은 인터럽트 발생으로 인해 본 프로그램 원활한 흐름에 영향을 줄 수 있습니다. SET UNTIL선언을 사용해서, 원하는 종료코드가 도착했을 경우에만 수신 인터럽트를 발생하도록 하면, 너무 잦은 인터럽트 발생을 막을 수도 있고, 원하는 하나의 프레임을 갖춘 데이터가 도착했을 경우에만 인터럽트를 발생시킬 수도 있습니다. 즉, SET UNTIL에 사용한 종료캐릭터가 도착하기까지 계속해서 데이터를 수신하고 있다가, 종료캐릭터가 도착하면 수신 인터럽트가 발생하는 것입니다.
만약, 수신버퍼를 초과하는 양의 데이터가 도착했는데도 지정한 종료캐릭터가 나타나지 않을 경우를 대비해서 최대수신 가능 바이트 수를 정해주어야 합니다. 이것이 PACKET수 입니다. 패킷수를 10바이트로 선언하면, 10바이트까지 데이터를 수신하다가 종료코드를 발견하면 인터럽트를 발생시키고, 10바이트 안에 종료코드를 발견하지 못하면 10바이트만 받은 상태에서 인터럽트를 발생시킵니다.
이 명령은 ON RECV선언문과 함께 사용해야 합니다. ON RECV선언문 바로 밑에 작성해주시기 바랍니다.
Dim A(5) As Byte Opencom 1,19200,0, 100, 50 On Recv1 GOSUB DATARECV_RTN Set Until 1,99,"S"
위의 예를 보면, 패킷 사이즈는 99바이트입니다. 즉, 99바이트 이내에 종료코드인 “S”를 발견하지 못하면 인터럽트가 발생됩니다.
종료캐릭터 없이 패킷수만 가지고 통신하는 경우도 발생합니다. 바이너리값이 수신되는 경우 0부터 255사이의 아무값이나 올수 있기 때문에, 이런 경우에는 종료캐릭터 검사기능이 오히려 불편을 초래합니다.
네번째 파라메터인 charCheck를 1로 하면, 패킷수만 가지고 인터럽이 발생됩니다. 즉, 종료캐릭터 포함여부를 체크하지 않습니다.
주의할 사항은, 연속적으로 오는 데이터만 유효하다는 점입니다. 일반적으로 관련있는 패킷은 연속적으로 전송되기 때문입니다. 만약 5바이트를 수신하는데 있어서, 1바이트만 먼저 도착하고 나머지 4바이트가 나중에 도착하는 경우는 처음 1바이트를 자동 삭제하도록 되어 있습니다.
Const Device = CB280 Dim St1 As String * 30 Dim ln As Integer Opencom 1,9600,3,50,50 On Recv1 Gosub sub_datarev Set Until 1,10,"S",0 Delay 500 Debug "start",Cr Do Loop sub_datarev: Debug "Rev S",Cr ln = Blen(1,0) '수신버퍼에 있는 데이터갯수 Debug Dec ln,Cr st1 = Getstr(1,ln) ' 다 읽어와야, 이벤트가 또 안 발생된다. Debug st1,Cr Return
이 소스프로그램을 CB280에 실행시킨뒤 CFTERM을 이용해서 아래와 같이 설정하고 데이터를 보냅니다.
그러면 디버그창에 다음과 같이 표시됩니다.
대문자S가 올때, 이벤트가 발생됩니다. 그러면 이벤트 루틴안에서 수신된 데이터의 갯수만큼 모두 읽어내서 Debug창에 표시한 것입니다.
Set Until 1,10,"S",0
Set Until 1,10,13, 0
위 경우 캐리지 리턴 (13)을 검출하고 있습니다.