개요

 

LX Serial Data Format T5A 

Simple packet and protocols easy to use. UART, Bluetooth, WiFi, Ethernet, etc.

특징

  • 초간단 쉬운 사용 시리얼 통신 패킷.
  • 다채널 실시간 스트림 데이터 전송.
  • 스트림, 비스트림 통신 모두 지원.
  • 고정밀 32bit 스트림 전송.
  • UART(RS-232), Bluetooth, WiFi, Ethernet, 등 모든 시리얼 통신에서 사용가능.
  • com 포트 자동탐색.

 

T5A 패킷

동기바이트(Sync Bytes) : T5A 패킷 핵심개념

송신측에서 송신한 데이터를 수신하는 수신측에서 패킷의 첫시작점을 파악할 수 있는 수단이 필요하다. LXSDF T5A 패킷에서는 동기바이트로 각 패킷 전송 초기 5개 바이트를 사용하며, 첫 1바이트 부터 255,255,255,255, 254 의 값이 기록되어있다. 즉 패킷 전체 바이트열 중에서 연속해서 4개의 255와 이후 254 가 등장하는 지점은 동기바이트가 유일하도록 설계되어 있다.

장치에서 데이터 전송시 항상 이 규격에 맞게 데이터를 호스트로 전송한다. 수신측에서는 전송되어 오는 각각의 단위 바이트들을 상시 모니터링 하여 동기 바이트를 검출하는 것으로 1패킷의 시작점을 찾을 수 있다. 시작점을 찾게 되면 LXSDF T5A 패킷 규칙에 의거하여 필요한 데이터들을 프로그램에서 추출할 수 있게 된다.

아래 그림에서 1패킷의 가장 첫부분에 주황색으로 표시된 부분에는 항상 패킷의 첫지점을 나타내는 동기바이트 5바이트 할당 되어 있고, 그 이후에 일련의 바이트 단위의 데이터들이 연속 전송된다.

 

T5A 패킷 요소 정의.

아래 표에 T5A 패킷 요소들 정의 되어있으며, 각각의 인덱스가 1바이트를 점하며 시리얼 전송시 인덱스 0, 1, 2, … 순서로 전송하게 된다.  각 패킷 인덱스 별로 탑재가능한 값이 컬럼 Value 에 정의되어있다.

Table. LXSDF T5A Packet Definitions.
 Index  Value  Packet Element Name for Stream Mode.  Packet Element Name for Non-Stream Mode.
 0  255  SyncByte0 (Synchronization Byte 0)
 1  255  SyncByte1 (Synchronization Byte 1)
 2  255  SyncByte2 (Synchronization Byte 2)
 3  255  SyncByte3 (Synchronization Byte 3)
 4  254  SyncByte4 (Synchronization Byte 4)
 5  0~254  PPD (Packet Property Data). 0~15 : Stream Mode, 16~254 : Non-Stream Mode.
 6  0~255  PCDT (PCD Type) : Bit 2,1,0.  PBS (Packet Byte Size)
 7  0~255  PC (Packet Count)  IID (Information ID)
 8  0~255  PCD0 (Packet Cyclic Data 0) LSByte  .
 9  0~255  PCD1 (Packet Cyclic Data 1) MSByte  .
 10  0~253  PCD SEP   reserved.
 11  0~255  PUD0 (Packet Unit Data 0) LSByte
 12  0~255  PUD1 (Packet Unit Data 1)
 13  0~255  PUD2 (Packet Unit Data 2)
 14  0~255  PUD3 (Packet Unit Data 3) MSByte
 15  0~253  PUD SEP  reserved.
 16  0~255  PSD0 (Packet Stream Data 0) LSByte  .
 17  0~255  PSD1 (Packet Stream Data 1)  .
 18  0~255  PSD2 (Packet Stream Data 2)  .
 19  0~255  PSD3 (Packet Stream Data 3) MSByte  .
 20  0~253  PSD SEP  .
 …  …  Can be repeated above 16~20 index  .
 Color  Description
스트림, 비스트림 모드에서 공통적인 패킷 요소들.
다채널 스트림 데이터 탑재영역. 최대 채널 수 임의 확장 가능. 대표적인 멀티 채널 스트림 데이터 소스 : 다채널 ADC 변환 값들.

 

스트림 모드와 비스트림 모드 차이점

Packet Index  Stream Mode  Non-Stream Mode
 5  PPD :  available value 0 ~ 15  PPD : available value 16 ~ 254
 6  PCDT : Packet Cyclic Data Type.  PBS : Packet Byte Size allocated.
 7  PC : +1 for each packet.  IID : Information ID allocated.
 8 ~ 10  PCD0,1,PCD SEP : PCD data is allocated each PC.  general data allocated.
 11 ~ 15  PUD0,1,2,3,  PUD SEP : Packet Unit Data.  general data allocated.
 16 and over  PSD :  real time stream data allocated.  general data allocated.

패킷 바이트 크기. 

  • 스트림 모드인 경우 : 선정의된 고정 크기 (예. 16, 32, …)를 가지며 응용에 따라 다른 값을 가질 수 있다.
  • 비스트림 모드인 경우 : 매번의 패킷 마다 패킷 사이즈는 다를 수 있으며, 패킷인덱스 6( PBS ) 에 패킷 사이즈가 기록되어있다.

 

스트림 패킷

 

PPD (Packet Property Data)

PPD 값이 0 ~ 15 사이의 값인 경우 본 패킷은 스트림 모드.

PC (Packet Count)

매번의 패킷 전송시 +1 증가되어 최대값 이후 다시 0 부터 시작. 각 패킷의 PCD 값은 PC 값에 따라 다른 값을 가질 수 있다. 즉, PC 1일 때 PCD0,1 값 (PCD0,1[1] 로 표기.)와 PC 2일때 PCD1,2[2] 값은 다른 데이터 할당가능. PCD Type (PCDT) 값에 따라 PC의 최대값은 다를 수 있다. PCDT 값이 0인 경우의 PC 최대값은 31.

PCD0~1, PCD SEP (Packet Cyclic Data)

각 패킷 카운트 마다 다른 값 할당 가능.

PUD0~3, PUD SEP (Packet Unit Data)

주활용 : 1패킷 단위로 전송가능하므로 고속 전송이 요구되는 데이터.

PSD0~3, PSD SEP (Packet Stream Data)

다채널 스트림 데이터 전송용.

PCDT (Packet Cyclic Data Type)

PCDT 값에 따라 패킷카운트 PC 최대값이 달라지며, 또한 PCDT 값에 따라 패킷순환데이터로 전달되는 데이터가 달라진다.
장치 전원온 초기상태는 PCDT 값은 항상 0이며, 상황에 따라 PCD모드 값이 1,2,3등의 다른 값으로 변경되어도, 해당모드의 데이터 전송이 1회 완료 되면 다시 자동으로 PCDT값은 0으로 변경된다. 데이터 전송의 1회 완료란 PC = 0에서 시작하여 PC 의 최대값이 될 때까지이다.
.

 PCDT  PC (Packet Count) Maximum  Data
 0  31  Exclusive data for LXSDF T5A and general data.
 1 ~ 7  depends on each product.

 

PCDT = 0 의 PCD 시스템 지정 데이터

스트림 전송모드이면서, PCDT 값이 0일 때의 PC 값 0에서 19까지는 제품 특화된 데이터를 전송할 수 있는 구간이며,  PC 20 에서 PC 31까지는 시스템 지정 데이터 영역이며 아래 표와 같은 데이터가 기록된다.

 Table. PCD Designated Data of PCDT 0
 PCD0,1[PC]  Item  Description
 PCD0,1[31]  Com port search information PCD0[31] :  fixed value 110. Information for searching device using LXSDF T5A.
 PCD0,1[30]  LXDeviceID  Allocated value between 256 and 65535. Unique ID for identifying the device.PCD0[30] : Low Byte, PCD1[30] : High Byte.
 PCD0,1[29]  ComFirmInfo1 PCD0[29] : Bit 7  ComFirmID, Bit6~0 : ComFirmVersion for processor 1.
 PCD0,1[28]  Number of channel PCD0[28] : number of channel in the element PSD(Packet Stream Data).
 PCD0,1[27]  Number of samples PCD0[27] : number of samples in the element PSD(Packet Stream Data).
 PCD0,1[26]  ComPath PCD0[26] :  Communication physical path.
 PCD0,1[25]  ComFirmInfo2 PCD0[25] : Bit 7  ComFirmID, Bit6~0 : ComFirmVersion for processor 2.
 PCD0,1[24]  ComFirmInfo3 PCD0[25] : Bit 7  ComFirmID, Bit6~0 : ComFirmVersion for processor 3.
 PCD0,1[23]  –  – reserved
 PCD0,1[22]  –  – reserved
 PCD0,1[21]  –  – reserved
 PCD0,1[20]  –  – reserved

ComPath

ComPath 는 데이터 패킷이 전송된 통신경로 표식용으로 사용된다. 1개의 장치는 동시에 2개 이상의 통신경로로 LXSDF T5A형식의 데이터 전송 가능하며, 수신한 호스트 측에서 통신경로를 확인하고자 할 때 ComPath 의 값을 참조한다.

 ComPath Value  Communication Path
 0  UART
 1  USB CDC
 2  Bluetooth SPP(Serial Peripheral Profile)
 3  Bluetooth Low Energy SPS (DIALOG)
 4  Bluetooth Low Energy NUS (NORDIC)
 5  Bluetooth Low Energy HID
 32  USB HID
 64  USB LX High Speed. ( FTDI D2XX driver or FTDI VCP driver )

 

 

비스트림 패킷

 

 

PPD (Packet Property Data)

PPD 값이 16 ~ 254 범위의 값인 경우,현재 패킷은 비스트림임을 의미.

선정의된  PPD 값들.  : 32, 34, 48, 64, 128 은 아래 같은 방식으로만 사용 가능.

  • 32 : 데이터 송신. 상대방에게 결과 요청하지 않는 데이터 송신.
  • 34 : 데이터 송신. 상대방에게 결과 요청하는 데이터 송신.
  • 48 : PPD 34 수신한 기기에서는 PPD 48 로 결과 응답 송신.
  • 64 : 데이터 요청.
  • 128 : PPD 64 수신한 기기에서는 PPD 128 로 응답 데이터 송신.

 

PBS (Packet Byte Size)

현재 송신한 패킷의 바이트 단위의 패킷 사이즈 기록. 패킷 바이트 사이즈는 최대 패킷인덱스 +1 의 값을 갖는다.

 

IID (Information Identification Data)

현재 전송하는 패킷에 탑재된 정보 식별용 고유번호.

 

Code Example

non-stream LXSDF T5A 형식으로 송신된 시리얼 데이터 수신한 측에서 매번의 바이트 마다 함수 Proc_NS_T5A 호출하면, 내부적으로 패킷검출하고 PACKET_NS_T5A[100] 에 LXSDFT5A  1 패킷 저장.

/*
LXSDF T5A Non Stream example codes.
feature : Parsing and After processing for each PPD value. 

inputs
byte_now : One byte per call
*/

uint8_t PACKET_NS_T5A[100]; // array for gathering the received bytes. 

void Proc_NS_T5A(uint8_t byte_data)
{
  int ppd = Parsing_NS_T5A(byte_data);

  if(ppd == -1) return ; // not completed packet

  switch(ppd)
  {
    case 128:  // response from the opposite for this request 64
            //do something
    break;

    case 64:  // request 64 from the opposite, should response 128
            //do something
    break;

    case 34: // request 34 from the opposite, shoulde response 48
            //do something
    break;

    case 32: // request 32 from the opposite. no need to response tx.
            //do something
    break;

  }
}


/*
inputs
byte_now : One byte per call

return
-1 : when packet not complete
PPD : when packet completed
*/
int Parsing_NS_T5A(uint8_t byte_now)
{

  static uint8_t byte_prev8[8]    = {0};   // for accumulateing the byte_now
  static uint8_t sync_after       = 0;	// marking 1 when T5A SyncBytes detected
  static uint32_t PacketIndex_T5A = 0;  // LXSDF T5A Packet Index

  /// fast shifting the byte_prev8 and then put the byte_now.
  memmove(byte_prev8+1, byte_prev8,7); //byte_prev8 array shift  i.e byte_prev8[7] = byte_prev8[6];, [6] = [5], ... [1] = [0]
  byte_prev8[0] = byte_now; //

  ///Check T5A SyncBytes
  if((byte_prev8[7] == 0xFF) && (byte_prev8[6] == 0xFF) && (byte_prev8[5] == 0xFF) && (byte_prev8[4] == 0xFF) && (byte_prev8[3] == 0xFE)   )  // SyncBytes Detected
  {
      sync_after = 1; // mark SyncBytes detected.

      PacketIndex_T5A = 6;

      PACKET_NS_T5A[5] =  byte_prev8[2]; // PPD
      PACKET_NS_T5A[6] =  byte_prev8[1]; // PBS
  }

  if(sync_after == 0) return -1; // not detected SyncBytes.

  PacketIndex_T5A ++;

  //in this point  PacketIndex_T5A is 7

  PACKET_NS_T5A[PacketIndex_T5A] = byte_now;

  ///Check One Packet Completed . when (PacketIndex_T5A+1) is equal to PBS(PACKET_NS_T5A[6]) 
  if((PacketIndex_T5A+1) == PACKET_NS_T5A[6])
  {
      sync_after = 0 ; // init sync_after.

      return PACKET_NS_T5A[5]; // return PPD
  }

  return -1 ;
}

 

프로그래밍 가이드

 

LXSDF T5A 규격도입된 기기와 통신하기 위한 호스트 측 (com 포트 통신 예)의 프로그램 전체 구조를 아래 그림에 보이고 있다. 가장 먼저 com 포트 오픈 부터 시작 한다.

1. COM Read Bytes : com 포트에서 순차적으로 수신된 바이트열들 읽기.

2. LXSDF T5A Packet Extraction : 패킷의 시작점을 의미하는 SyncByte (255, 255, 255, 255, 254 순으로 데이터 배치되어 있음) 검출하여 패킷단위 분리.

3. LXSDF T5A Take elements : packet 요소들을 분리. 본 과정에서 확보된 각 패킷 요소들은 제품별로 그 의미가 다를 수 있다.

4. Get device providing data : 제품별 데이터 배치 정보 문서 참조하여 기기에서 제공하는 정보 확보.

 

COM포트 자동탐색

 

본 설명은 PC 에서 com 포트로 인식된 기기의 경우, 윈도우 운영체제에서는 고정된 com 포트가 할당되지 않아서 응용 프로그램에서 자동으로 기기 탐색하는 방법에 대한 설명이다.  마이크로 컨트롤러 와 같은 MCU의 UART 기반 통신인 경우에는 해당 UART 로는 항상 어떤 기기가 연결되어있는지 고정되어있으므로 본 설명이 적용되지 않는다.

PC에서 기기와의 com 통신이 요구되는  응용프로그램에서 사용자에게 com 포트를 직접 수동으로 입력하게 하는 방식의 운용은 임시 개발중인 프로그램에서는 개발자 본인 입장에서는 큰 불편함 없으나, 상용 프로그램으로 구현하는 경우에는 상품성 저하 요소에 해당한다. 사용자에게 번거로운 절차를 요구하지 않도록 응용프로그램에서 com 포트에 연결된 기기의 자동 탐색기능 제공하면 쉬운 사용성 달성된다.

COM 포트 탐색 방법.

LXSDF T5A 규격에서는 PCD0[31] 에 “COM 포트 탐색정보”가 기록되어있고, 동시에 PCD0,1[30] 에는 기기 고유 번호에 해당하는 LXDeviceID가 기록되어있다. 이 정보를 활용하면 응용프로그램에서 통신할 기기의 com 포트 자동탐색 가능하다.

아래 그림과 설명처럼 PC의 모든 com 포트를 스캔하는 방식으로 원하는 기기의 com 포트 자동 탐색가능하다.

 Flow Chart  Steps.  Description
 Step 1. com포트 1개 열어서, sync bytes (255, 255, 255, 255, 254) 이 검출되면, step2 로 진행. sync bytes 검출되지 않는다면    LXSDF T5A 패킷은 아니므로 현재 com 포트 닫고 다음 com 포트 오픈하여  step 1 반복.
 Step 2.  PCD0[31] 의 값이  110, 이면 Step3 진행. PCD0[31] 의 값이 110 이 아니면 step1 진행.
 Step 3. PCD0,1[30] 값을 읽어서 그 값이 통신하려는 LXDeviceID 와 일치하면 현재 com 포트번호가 해당 기기가 연결된 포트 번호. 이후 응용프로그램은 본 과정에서 발견된 com 포트 번호와 통신 시행.

다운로드

 

LXSDF T5A 문서.

 LXD8. LXSDF T5A 통신 표준.  다운로드 or 웹에서 바로보기.

Suggest Edit