LXSDF T2

 

본 설명은 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