LXSDF T2A

개요

 

LXSDF T2A LX Serial Data Format T2A

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

다채널 실시간 스트림데이터, 비스트림 데이터  전송 가능한 범용 시리얼 통신 규격, 모든 시리얼 통신매체 UART (RS-232), 와이파이, 블루투스, 이더넷  등 에서 적용가능.

Overview LXSDF T2A

Overview LXSDF T2A

Features

  • 다채널 실시간 스트림 데이터 전송.
  • 스트림, 비스트림 통신 모두 지원.
  • UART(RS-232), Bluetooth, WiFi, Ethernet, 등에서 사용가능.
  • COM 포트 자동 탐색.

 

T2A 패킷 필요성

– 시리얼 통신매체 UART 예로들어 설명.

본 글에서의 시리얼 통신매체 UART라 함은 임베디드 분야에서는 UART (Universal Asynchronous Receiver & Transmitter ), PC나 스마트 폰 등에서는 COM포트, 시리얼포트, RS232 등으로 불린다. UART와 같은 시리얼 통신매체 의 기본 통신 규격은 1바이트 단위로 반복 전송되는 형식이며 바이트들 사이의 데이터 속성 구분 정보는 UART 기본 규격에서는 정의되어있지 않다.

시리얼 통신매체 기반 통신 기능 구현시 기본 시리얼 통신규격대로 1바이트 단위로만 반복 전송하는 경우는 극히 드물다. 예로 12비트 AD변환 샘플링 데이터를 전송해야 하는 경우에는 4비트, 8비트로 분리해서 시리얼 통신 2개 바이트에 분리하여 전송해야하며, 수신한 측에서는 이를 다시 12비트 의 AD변환값으로 통합해야한다. 전송해야할 데이터 종류가 다양한 경우에는 패킷개념 요구.

즉, 여러 개의 바이트를 1개의 패킷으로 핸들링 할 수 있는 규격이 요구되며, 미리 정의된 패킷 규격에 따라 송신하고, 수신한 측에서는 패킷 규격에 따라 수신한 데이터를 분리해서 활용하게된다. 패킷형식의 규격은 사용하는 용도에 따라 다양한 규격이 있을 수 있으며, LXSDF T2A에서는 고속의 실시간 다채널 실시간 스트림 데이터를 전송 가능함과 동시에 장치의 상태정보, 간헐적 계산값, 기타 비스트림 형식의 데이터열 모두를 핸들링 가능한 범용 시리얼 통신 데이터 포맷.

LXSDF T2A는 극단적으로 단순한 구조, 데이터 전송률 손실 최소화 설계되어 초소형 사물 인터넷( IoT ) 기기부터 대형 시스템 까지 적용하기 쉬운 최적의 통신 규격이다.

 

T2A 패킷

동기바이트(Sync Bytes) : T2A packet 핵심개념

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

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

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

SyncBytes LXSDF T2A

SyncBytes LXSDF T2A

 

T2A 패킷 요소 정의

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

Table. LXSDF T2A Packet Definitions.
 Index  Value  Packet Element Name for Stream Mode.  Packet Element Name for Non-Stream Mode.
 0  255  SyncByte0 (Synchronization Byte 0)
 1  254  SyncByte1 (Synchronization Byte 1)
 2  0~254  PPD (Packet Property Data). 0~15 : Stream Mode, 16~254 : Non-Stream Mode.
 3  0~254  PUD0 (Packet Unit Data 0)  PBS (Packet Byte Size)
 4  0~255  PC (Packet Count)  IID (Information ID)
 5  0~253  PUD 1 (Packet Unit Data 1)  .
 6  0~255  PCD (Packet Cyclic Data)  .
 7  0~253 CRD (Command Response Data). bit 6
PUD2 (Packet Unit Data 2). bit 5,4,3
PCDT (Packet Cyclic Data Type). bit 2,1,0
 .
 8  0~253  PSD1 (Packet Stream Data High Byte)  .
 9  0~255  PSD0 (Packet Stream Data Low Byte)  .
 10  0~253  PSD1 (Packet Stream Data High Byte)  .
 11  0~255  PSD0 (Packet Stream Data Low Byte)  .
 …  …  …  …
 N-1  0~253  PSD1 (Packet Stream Data High Byte)  .
 N  0~255  PSD0 (Packet Stream Data Low Byte)  .
 Color  Description
  스트림, 비스트림 모드에서 공통적인 패킷 요소들.
 다채널 스트림 데이터 탑재영역. 최대 채널 수 임의 확장 가능. 대표적인 멀티 채널 스트림 데이터 소스 : 다채널 ADC 변환 값들.

 

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

Packet Index  Stream Mode  Non-Stream Mode
 2  PPD :  available value 0 ~ 15  PPD : available value 16 ~ 254
 3  PUD0 : general data allocated.  PBS : Packet Byte Size allocated.
 4  PC : +1 for each packet.  IID : Information ID allocated.
 6  PCD : PCD data is allocated each PC.  general data allocated.
 7  PCDT : means PCD type.  general data allocated.
 8 and over  PSD :  real time stream data allocated.  general data allocated.

패킷 바이트 크기. 

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

 

스트림 패킷

 

PPD (Packet Property Data)

PPD 값이  0 ~ 15 사이 값인 경우 스트림 모드, 즉 패킷 인덱스 8번이후 PSD 에 스트림 데이터가 배치되어 전송중임을 의미.

PC (Packet Count)

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

CRD (Command Response Data)

통신 상대방의 Command 수신시 1비트 점하는 CRD 값을 반전 하여 전송. 통신 상대방이 자신이 보낸 커맨드 수신여부 확인시 사용.

PUD 0, PUD 1, PUD 2 (Packet Unit Data)

LXSDF T2A 를 도입한 제품에 따라 제품특화된 데이터들이 배치되며, 1패킷 단위로 전송가능하므로 고속전송이 요구되는 데이터 배치에 적합.

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  LXSDF T2A 전용 시스템 정의 데이터.
 1~7  depends on each product.

 

LXSDF T2A Designated Data for PCD of PCDT 0.

PCD Type 0 의 PC 0에서 29까지는 제품 특화된 데이터를 전송할 수 있는 구간이며, PC 20 에서 PC 31까지는 시스템 지정 데이터 영역이다. 아래 표에 시스템 지정 데이터 의미 정리.

 Table. PCD Designated Data of PCDT 0
 PCD[PC]  Item  Description
 PCD[31]  Com port search information  고정 109. 본 패킷이 LXSDF T2A임을 의미.
 PCD[30]  LXDeviceID  기기 식별 아이디. 가능 값 :  1 ~ 255.
 PCD[29]  ComFirmInfo1  펌웨어 아이디 와 버전  (기기내장 프로세서1  )
 PCD[28]  Number of channel  패킷의 스트림 영역에 전송되는 채널 수
 PCD[27]  Number of samples  패킷의 스트림 영역에 전송되는 샘플링 수
 PCD[26]  ComPath.  통신매체 식별숫자.
 PCD[25]  ComFirmInfo2  펌웨어 아이디 와 버전  (기기내장 프로세서2  )
 PCD[24]  ComFirmInfo3  펌웨어 아이디 와 버전  (기기내장 프로세서3  )
 PCD[23]  –  – reserved.
 PCD[22]  –  – reserved
 PCD[21]  –  – reserved
 PCD[20]  –  – reserved

ComPath

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

 ComPath Value  Communication Path
 0  UART
 1  USB CDC
 2  Bluetooth SPP(Serial Peripheral Profile)
 3  Bluetooth Low Energy SPS

 

 

비스트림 패킷

 

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)

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

 

프로그래밍 가이드

 

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

  1. COM Read Bytes : com 포트에서 순차적으로 수신된 바이트열들 읽기.
  2. LXSDF T2A Packet Extraction : 패킷의 시작점을 의미하는 SyncByte (255, 254 순으로 데이터 배치되어 있음)  검출하여 패킷단위 분리.
  3. LXSDF T2A Take elements : packet 요소들을 분리. 본 과정에서 확보된 각 패킷 요소들은 제품별로 그 의미가 다를 수 있다.
  4. Get device providing data : 제품별 데이터 배치 정보 문서 참조하여 기기에서 제공하는 정보 확보.

 

COM포트 자동탐색

 

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

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

COM 포트 탐색 방법.

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

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

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

Code Example : COM port automatic search. C#

Automatic search method to find the device. The method is the same regardless of language whether it is C# or C++.

            int bytestoread = sp.BytesToRead;   // occupied  byte number in Com port buffer. Sp is serial port object.

            // OUTPUT 1. Whether it is our device or Not? Our device must have the data in COM port..
            if (bytestoread == 0) { return; }  // If there is no data which can  be read in  COM port, this is not  LXSDF T2 format. LXSDF T2 transmits the data every time.

            /// If there is some data to read in COM port, it reads all the data. 
            byte[] rbuf = new byte[bytestoread]; // created the memory size dynamically. 
            bool find_sync = false;
            sp.Read(rbuf, 0, bytestoread); //  received in rbuf tentatively..
            // OUTPUT 2. Check sync .
            for (int i = 0; i < bytestoread-1; i++) // 
            {
                if (rbuf[i] == 255 && rbuf[i + 1] == 254) // Found the sync spot. 
                {
                    find_sync = true;
                    break; // break the loop 
                }
            }
            if (find_sync == false) return; // If there is no data in order of 255, 245, this is not  LXSDF T2. 
            ///OUTPUT 3. Check the packet cyclic data in case of detecting some sync.  Must receive over certain time data continuously to check it.
            byte[] cbuf = new byte[4096];
            int bytetoreadlimit =0;
            int readbytenum = 0;
            int sum_readbytenum = 0;
            bool while_continue = true;
            byte Packet_Count =0;
            byte PacketCyclicData = 0;
            bool find_109 = false;
            byte find_ComDeviceID = 0; // ComDeviceID allots more than value 1.
            byte find_NumChannel = 0;
            byte find_NumSample = 0;
            byte find_firmversion = 0;

            while (while_continue)
            {
                if(sp.BytesToRead > 4096)
                    bytetoreadlimit = 4096;
                else
                    bytetoreadlimit = sp.BytesToRead;
                
                readbytenum = sp.Read(cbuf, 0, bytetoreadlimit); // read the data and figure the byte cumulative sum.
                
                sum_readbytenum += readbytenum;
                
                for (int i = 0; i < readbytenum-3; i++)
                {
                    if (cbuf[i] == 255 && cbuf[i + 1] == 254) // detected sync spot.
                    {
                        Packet_Count = cbuf[i + 4];           // occupied packet count value.
                        PacketCyclicData = cbuf[i + 6];       // occupied packet cyclic data.

                    

    if (Packet_Count == 31 &&  PacketCyclicData == 109)// If packet count is 31 and packet cyclic data is 109, it is surely  LXSDF T2 Type.
                            find_109 = true;
                        else if(Packet_Count == 30)                      // This spot  is for Product ID.
                            find_ComDeviceID = PacketCyclicData;
                        else if (Packet_Count == 29)                     // This spot is for firmware version number. It is necessary if updating firmware by UART.
                            find_firmversion = PacketCyclicData; 
                        else if (Packet_Count == 28)                     // Channel number transmitted into stream data.
                            find_NumChannel = PacketCyclicData;
                        else if (Packet_Count == 27)
                            find_NumSample = PacketCyclicData;

                        if (find_109 && find_NumSample > 0)  // This means loof break because  find_NumSample is in packet count 27 and  find_109 is in packet count 31. If both value were found , Medium value could be found.
                        {
                            while_continue = false;
                            break;
                        }
                        
                    }
                }
                /// Designate the maximum value to review how many data can be received in COM port.  If this value is too big, it takes very long time to search the device. So it’s good to set the small value.
                /// To search the device by LXSDF T2 type , The minimum needed data capacity  must  be  at least 32 packets. In other words, 68bytes ( byte capacity of 1 packet) x 32 = 2176 bytes.  It’s possible to exam device search information because it has 3000 bytes enough to be 32 packets.
                ///   Formula : byte capacity of 1 packet  can find the answer as 8 bytes + 64 bytes .
                /// 8 bytes : 1 packet is 8 bytes  from Tx Index 0  to 6 
                /// 64  bytes :  Stream area is  channel number * 2(bytes) * sample number, though it has different value by each product . Because the maximum channel number allotted from LXSDF T2 is 8 and sample number is within 4, the maximum  is  64 bytes.
                /// x 32 : must receive 32 packets to communicate packet count 0 to 31.
                if (sum_readbytenum > 3000)  // Forcing  Loof  break condition. 
                {
                    while_continue = false;
                    break;
                }
            } // while

 

 

다운로드

 

LXSDF T2A 문서.

 pdf 문서 다운로드 / 웹에서 바로보기.

 

 

Suggest Edit