LXSDF T2

개요

 

LX Serial Data Format T2

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

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

특징

  • 다채널 실시간 스트림 데이터 전송.
  • 기기에서의 송신과 수신포맷이 다르게 정의.
  • UART(RS-232), Bluetooth, WiFi, Ethernet, 등에서 사용가능.
  • COM 포트 자동 탐색.

설명

LXSDF T2(LX Serial Data Format Type2) 는 스트림데이터의 실시간 전송과 동시에 상대적으로 저속인 기타 데이터들이 1개의 패킷형식내에서 전송 가능한 범용의 시리얼 통신포맷이다. 스트림데이터란 아날로그 신호의 AD변환된 시계열 데이터와 같이 시간적으로 상관된 데이터를 의미한다. 시리얼 통신 이라함은 임베디드분야에서는 UART(Universal Asynchronous Receiver & Transmitter), PC나 스마트 폰 등에서는 COM포트, 시리얼포트, Rs232 등으로 불리는 것을 지칭한다.
시리얼 통신 규격은 보통 1바이트를 기본 전송단위로 하여 반복적으로 전송되는 형식이나, 실제 응용과정에서는 통신에 요구되는 데이터 요소가 1바이트 단위로만 반복 전송하는 경우는 극히 드물다. 예로 12비트 AD변환 샘플링 데이터를 전송해야 하는 경우에는 4비트, 8비트로 분리해서 시리얼 통신 2개 바이트에 분리하여 전송해야하며, 수신한 측에서는 이를 다시 1개의 데이터로 통합해야한다. 만일 전송해야할 데이터 종류가 다양한 경우에는 패킷개념이 요구된다. 여러 개의 바이트를 1개의 패킷으로 핸들링 할 수 있는 규격이 요구되며, 이 규격에 따라 송신하고, 수신한 측에서는 규격에 따라 수신한 데이터를 분리해서 활용하게된다. 패킷형식의 규격은 사용하는 용도에 따라 다양한 규격이 있을 수 있으며, LXSDF T2에서는 고속의 실시간 다채널 실시간 파형 데이터를 전송 가능함과 동시에 장치의 상태정보, 계산값등과 같은 저속의 데이터도 동일한 1개의 패킷 형식으로 모두 전송 가능한 범용의 실시간 통신 활용에 적합한 시리얼 통신 데이터 포맷이다.

 

 

LXSDF T2 기반 기기 및 응용프로그램 예.

 

T2 패킷

 

LXSDF T2는 Rx, Tx 2종류의 데이터 포맷이 따로 정의 되어 있다.  여기서 Rx, Tx는 각각 수신, 송신을 의미하며 호스트와 통신하는 장치 입장에서의 통신의 방향성을 의미한다.  아래 그림에서 왼쪽이 장치의 예이고 오른쪽이 호스트의 예이다. 호스트로는 일반PC, 스마트폰, 일반 임베디드 시스템등이 있다. 보통 장치들은 호스트측으로 많은 데이터를 전송해야 하는 경우가 많고 반면 호스트 측에서 장치 쪽으로는 간단한 명령이 전송되는 경우가 대부분이다. 장치에서 호스트로 송신(호스트 입장에서는 장치로부터 수신)하는 데이터 형식을  LXSDF T2 Tx 패킷이라고 지칭하고, 장치가 호스트로부터 수신받는 데이터 형식을 LXSDF T2 Rx라고 지칭한다.

T2 Rx 데이터 포맷

호스트에서 장치로 데이터를 전송할 때 사용되는 데이터 규격.

연속한 3바이트를 사용하며, Rx인덱스 0,1,2 순서로 호스트에서 데이터를 전송해야 한다. 시간적으로 먼저 전송되는 Rx인덱스0의 최상위 비트는 1, 나머지 2개 바이트의 최상위 비트에는 반드시 0이 기록되어 있어야 한다. Cmd 데이터에 따라서 장치에 어떤 작용을 하는지는 제품별로 달리 정의되며 해당제품의 통신 규격을 참조 해야 한다.

Index  name  MSB value 
 0  Cmd 0   1
 1  Cmd 1   0  
 2  Cmd 2   0  

 

T2 Tx 패킷

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

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

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

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

T2 Tx 패킷 요소 정의

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

Table. LXSDF T2 Tx Packet Definitions.
 Index  Value  Packet Element Name 
 0  255  SyncByte0 (Synchronization Byte 0)
 1  254  SyncByte1 (Synchronization Byte 1)
 2  0~254  PUD0 (Packet Unit Data 0)
 3  0~127  CRD (Command Response Data). bit 6
 PUD2 (Packet Unit Data 2). bit 5,4,3
 PCDT (Packet Cyclic Data Type). bit 2,1,0
 4  0~255  PC (Packet Count)
 5  0~127  PUD 1 (Packet Unit Data 1)
 6  0~255  PCD (Packet Cyclic Data)
 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 변환 값들.

 

PC (Packet Count)

매번의 패킷 전송시 마다 1씩 증가되는 최대값 이후 다시 0부터 시작. PC를 이용하여 매번의 패킷마다 PCD로 전송되는 데이터가 어떤 데이터인지 식별함에 필수로 사용된다. PC의 최대값은 PCD Type값에 따라 다른 값을 갖게 되며 PCD Type = 0인 경우 PC의 최대값은 31이다.

CRD (Command Response Data)

호스트 측에서 LXSDF T2 Rx형식으로 명령을 장치로 전달한 것을 장치에서 수신 성공한 경우 CRD값을 반전한다. 활용 – 호스트에서 명령을 전송하기 전의 CRD 값이 1이었는데 명령 전송후에도 1이라면 명령전달 실패, CRD 값이 반전되어 0으로 변경되었다면 호스트에서 전송한 명령을 장치에서 수신 성공했음을 의미한다.

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

주로 고속으로 전송해야할 정보류의 데이터가 할당된다.

PCDT (Packet Cyclic Data Type)

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

 PCDT  PC (Packet Count) Maximum  Data
 0  31  LXSDF T2 전용 시스템 지정 데이터 및 일반 데이터. .
 1~7  제품마다 다름.

 

PCD Type 0 의 시스템 지정 PCD 데이터.

PCD Type 0 의 PC 0에서 23까지는 제품 특화된 데이터를 전송할 수 있는 구간이며, PC 24 에서 PC 31까지는 시스템 지정 데이터 영역.

 Table. PCD Designated Data of PCDT 0
 PCD[PC]  Item  Description
 PCD[31]  Com port search information  fixed value 108. Information for searching device using LXSDF T2.
 PCD[30]  LXDeviceID  Allocated value between 1 and 255. Unique ID for identifying the device.
 PCD[29]  ComFirmInfo1  Firmware ID and version for processor 1.
 PCD[28]  Number of channel  Number of channel from stream area of packet.
 PCD[27]  Number of samples  Number of samples from stream area of packet.
 PCD[26]  ComPath  Communication physical path.
 PCD[25]  ComFirmInfo2  Firmware ID and version for processor 2.
 PCD[24]  ComFirmInfo3  Firmware ID and version for processor 3.
 PCD[23]  –  – reserved
 PCD[22]  –  – reserved
 PCD[21]  –  – reserved
 PCD[20]  –  – reserved

ComPath

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

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

 

 

프로그래밍 가이드

LXSDF T2 형식의 통신포맷을 사용하는 장치와 통신하기 위한 호스트측의 프로그램 전체 구조를 그림에 보이고 있다. 호스트에서는 가장 먼저 COM포트 오픈 하는 것으로 시작한다. 임베디드 시스템에서는 MCU에서 UART통신설정을 해둬야 한다.

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

.

 

코드예 . T2 Tx 패킷 추출 및 패킷 요소 확보.

앞의 그림2의 단계 2와 3의 처리 코드 예. 간단한 일반 함수만 사용되고 있는것이라 언어와 무관하게 전체적인 코딩방법론은 동일하다.

        // transmit the data received by serial with the function by 1 byte  in order .
        // processing  in the function : Find the sync spot and abstract data by each packet TX Index .
        #define Ch_Num 1  // ubpulse 320/340/360/H3. 
        #define Sample_Num 1 // ubpulse 320/340/360/H3. 
        bool Sync_After = false;
        byte Packet_TX_Index = 0;
        byte Data_Prev = 0; // PREVALUE
 
        byte PUD0 = 0;
        byte CRD_PUD2_PCDT = 0;
        byte PUD1 = 0;
        byte PacketCount = 0;
        byte PacketCyclicData = 0;
        byte psd_idx = 0;
        byte PacketStreamData[2];   

        int Parsing_LXSDFT2(byte data_crnt)
        {
            int retv = 0;

            if (Data_Prev == 255 && data_crnt == 254)// Found sync spot.
            {
                Sync_After = true;
                Packet_TX_Index = 0;                  // Initialize  packet  TX Index  0.
            }
            
            Data_Prev = data_crnt;                   // receive the present value as pre value.

            if (Sync_After == true)                  // only task after discovering sync.
            {
                Packet_TX_Index++;                    // increase TX Index 1. The spot where is discovered 254 is 1. Whenever receiving 1 byte as serial, it increases 1.
                if (Packet_TX_Index > 1)              // only task over TX Index  2.
                {
                    if (Packet_TX_Index == 2)            // occupied TX Index2 PUD0.
                        PUD0 = data_crnt;
                    else if (Packet_TX_Index == 3)       // occupied TX Index 3 CRD, PUD2, PCD Type 
CRD_PUD2_PCDT = data_crnt;
                    else if (Packet_TX_Index == 4)       // occupied TX Index 4  PC. 
                        PacketCount = data_crnt;
                    else if (Packet_TX_Index == 5)       // occupied TX Index 5  PUD1.
                        PUD1 = data_crnt;
                    else if (Packet_TX_Index == 6)       // occupied TX Index 6 PCD(Packet cyclic data) .
                        PacketCyclicData = data_crnt;
                    else if (Packet_TX_Index > 6)        // Stream data(wave-pattern data) enters one each in order in more than TX Index 7. the data procedure to receive ->  it is recorded in order of Ch 1 high byte , Ch 2 high byte low byte..
                    {
                        psd_idx = (byte)(Packet_TX_Index - 7); // Packet Stream Data arrangement Index.
                        PacketStreamData[psd_idx] = data_crnt; // crnt data is occupied in order and stream data is only occupied.
                        if (Packet_TX_Index == (Ch_Num * 2 * Sample_Num + 6)) // Channel number  x 2( 2bytes occupation) x Sample capacity + 6(Index value before the front section of wave-pattern data) is the end of one packet.
                        {
                            Sync_After = false; // Be false to search sync spot again.
                            retv = 1; // If Passing of 1 packet unit is finished, it will be returned.
                        }
                    }
                } //if (Packet_TX_Index > 1)

            }
            return retv; //If 1  packet is finished, others return 0.
        }

 

COM 포트 자동탐색

 

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

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

COM 포트 탐색 방법.

LXSDF T2 규격에서는 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 T2 패킷은 아니므로 현재 com 포트 닫고 다음 com 포트 오픈하여  step 1 반복.
 Step 2.  PCD[31] 의 값이  108 이면 Step3 진행. PCD[31] 의 값이 108 아니면 step1 진행..
 Step 3. PCD[30] 값을 읽어서 그 값이 통신하려는 LXDeviceID 와 일치하면 현재 com 포트번호가 해당 기기가 연결된 포트 번호. 이후 응용프로그램은 본 과정에서 발견된 com 포트 번호와 통신 시행.

 

Application Example : COM port auto search.

Code Example : COM port auto 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_108 = 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 == 108)// If packet count is 31 and packet cyclic data is 108, it is surely  LXSDF T2 Type.
                            find_108 = 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_108 && find_NumSample > 0)  // This means loof break because  find_NumSample is in packet count 27 and  find_108 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

 

 

다운로드

 

문서.

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

Suggest Edit