질문,답변

데이터량이 많을경우...

조회 수 154 추천 수 0 2018.07.05 16:37:19

안녕하세요?

정말 오랜만에 글을 올려봅니다.

 

LabWindows 2015를 사용하고 있는데요.

RS-232C (USB to UART)로 통신을 사용하고 있습니다.

 

총 22Byte씩 받아오는데 데이터 들어오는 양이 많거든요.

대략 10ms에 6~7번씩 들어옵니다.

이렇게 되면 데이터가 많이 누적이 되는데요.

UI가 버티지를 못하더라구요.

대략 30초 정도만 지나도 버퍼가 폭발을 해버리죠...

 

제가 사용하는 방법은 스레드를 이용해서 데이터를 받아 분석까지 같이 해서 그런거 같은데...

 

//------------------------------ 스래드 생성 (RS-232 연결이 되었을경우 생성)

if(!Thread_Exiting_Log)

{

Thread_Exiting_Log = 1; // while 동작

CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, LogCall_Function, NULL, &LogCall_ID); // 생성

}

 

 

int CVICALLBACK LogCall_Function (void *functionData)

{

unsigned char sRdBuf_0x02[2]={0,}, sRdBuf_Data[30]={0,};

int nRdBuf_Len=0, nRdBuf_No=0, nReturn_N=0, nData_ID=0, nData_Num=0;

char sData_Text[500]={0,};

 

while (Thread_Exiting_Log)

{

// 데이터가 들어왔는지 확인

nReturn_N = GetInQLen (Log_ComPort);

if(nReturn_N > 0)

{

// Read -- 0x02 가 맞는지 확인 (맞을경우 들어가고 아니면 계속 확인함)

ComRd (Log_ComPort, sRdBuf_0x02, 1);

if(sRdBuf_0x02[0] == 0x02)

{

//     0  1  2  3  4 5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

// 02 0A 00 D0 00 0F 00 7A 00 00 01 10 01 12 34 56 78 9A BC DE F0 6A

memset(&sRdBuf_Data, 0, sizeof(sRdBuf_Data));

nReturn_N = ComRd (Log_ComPort, sRdBuf_Data, 21);

if(sRdBuf_Data[2] == 0xD0)

{

// ID

nRdBuf_No = 7;

nData_ID = (sRdBuf_Data[nRdBuf_No] * 0x1000000) + (sRdBuf_Data[nRdBuf_No+1] * 0x10000) + (sRdBuf_Data[nRdBuf_No+2] * 0x100) + sRdBuf_Data[nRdBuf_No+3];

// Data

nRdBuf_No = 12;

sprintf(sData_Text, "ID: 0x%02X%02X%02X%02X  Data: %02X %02X %02X %02X  %02X %02X %02X %02X\n", (nData_ID>>24), ((nData_ID>>16)%256), ((nData_ID>>8)%256), (nData_ID%256),

sRdBuf_Data[nRdBuf_No],   sRdBuf_Data[nRdBuf_No+1], sRdBuf_Data[nRdBuf_No+2], sRdBuf_Data[nRdBuf_No+3],

    sRdBuf_Data[nRdBuf_No+4], sRdBuf_Data[nRdBuf_No+5], sRdBuf_Data[nRdBuf_No+6], sRdBuf_Data[nRdBuf_No+7]);

// TextBox 100줄이 넘었을때 초기화함

GetNumTextBoxLines (Program_Log, TABPANEL_LOG_TEXTBOX, &nData_Num);

if(nData_Num>= 100)

DeleteTextBoxLines (Program_Log, TABPANEL_LOG_TEXTBOX, 0, -1);

// Data Display

SetCtrlVal (Program_Log, TABPANEL_LOG_TEXTBOX, sData_Text);

}

else if(sRdBuf_Data[2] == 0xD1)

{

.....

}

.....

}

}

}

return 0;

}

 

 

ex)

Read : 02 0A 00 D0 00 0F 00 7A 00 00 01 10 01 12 34 56 78 9A BC DE F0 6A

Display :  ID: 0x00000110  Data: 12 34 56 78 9A BC DE F0

 

위 내용과 같이 Display를 Table 또는 TextBox에 계속 뿌리고 싶습니다.

Table 같은 경우는 ID가 같으면 덮어쓰게 하고 TaxtBox경우 100줄이 넘어갈경우 초기화하고 뿌리게 했는데....

그래도 버티지를 못하더라구요.

 

좀 효율적으로 사용하는 방법은 없나요??


허창원

2018.07.06 19:51:05
*.177.11.192

Real Time OS 버전이 아닌, 일반 Windows 에서 10ms마다 6~7번씩 받아들이려면 쉽지는 않을 것 같네요.

잘 되다가도 어느 순간에 버벅댈 수도 있으니 말입니다.

일단 화면의 컨트롤에 출력하는 것이 시간을 꽤 잡아먹습니다. 10ms를 넘어갈때가 많을 겁니다.(PC사양과 윈도 버전에 따라 다르겠지만요)

 

받은 데이터를 다 표시해야할 필요가 없다면, 

평소에는 데이터 수신만 하고, 화면에는 간간히 보여주는 것이 프로그램 운영상 좀더 원활할 것 같구요,

 

그게 어렵다면, 화면 갱신 속도를 높이는 방법을 사용해보실 것을 권해드립니다.

예를 들면,

 

SetCtrlAttribute(Program_LogTABPANEL_LOG_TEXTBOX, ATTR_VISIBLE, 0);   // 컨트롤을 숨기고,

//SetCtrlVal (Program_Log, TABPANEL_LOG_TEXTBOX, sData_Text);  // 표시한 후

SetCtrlAttribute (Program_Log, TABPANEL_LOG_TEXTBOX, ATTR_CTRL_VAL, sData_Text);  // 조금이라도 더 빠른 방법이지만, 스크롤은 잘 안될 듯....

 

SetCtrlAttribute(Program_LogTABPANEL_LOG_TEXTBOX, ATTR_VISIBLE, 1);   // 다시 컨트롤을 보이도록

 

이렇게만 해도 화면 갱신에 소요되는 시간이 좀 줄어들겠지만, 근본적인 대책이 필요할 것 같습니다.

 

그럼, 좋은 하루되세요.

 

루키니아

2018.07.11 17:07:54
*.216.133.98

답변 감사합니다^^

 

저도 위와 같은 방법은 계속 하고 있는데 들어오는 량이 많다보니 계속 화면이 깜박이고 정신이 하나도 없더라구요...;;

 

아...그리고 찾다보니 병렬로 사용하는 방법이 있더라구요.

이 방법을 이용하니 그나마 조금 빨라진거 같습니다.

(처음 사용해보는거라 혹 잘못 사용하면 말해주세요.)

 

 

// 선언해 주어야함

#include <omp.h>

 

//------------------------------ 스래드 생성 (RS-232 연결이 되었을경우 생성)

if(!Thread_Exiting_Log)

{

   Thread_Exiting_Log = 1; // while 동작

   CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, LogCall_Function, NULL, &LogCall_ID); // 생성

}

 

 

 

 

 

int CVICALLBACK LogCall_Function (void *functionData)

{

   unsigned char sRdBuf_0x02[2]={0,}, sRdBuf_Data[30]={0,};

   int nRdBuf_Len=0, nRdBuf_No=0, nReturn_N=0, nData_ID=0, nData_Num=0;

   char sData_Text[500]={0,};

 

   while (Thread_Exiting_Log)

   {

      // 데이터가 들어왔는지 확인

      nReturn_N = GetInQLen (Log_ComPort);

      if(nReturn_N > 0)

      {

         // Read -- 0x02 가 맞는지 확인 (맞을경우 들어가고 아니면 계속 확인함)

         ComRd (Log_ComPort, sRdBuf_0x02, 1);

         if(sRdBuf_0x02[0] == 0x02)

         {

            //     0  1  2  3  4 5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

            // 02 0A 00 D0 00 0F 00 7A 00 00 01 10 01 12 34 56 78 9A BC DE F0 6A

            memset(&sRdBuf_Data, 0, sizeof(sRdBuf_Data));

            nReturn_N = ComRd (Log_ComPort, sRdBuf_Data, 21);

 

            #pragma omp parallel sections

            {

               #pragma omp section

                  if(sRdBuf_Data[2] == 0xD0) Data_0xD0(sRdBuf_Data);

               #pragma omp section

                  if(sRdBuf_Data[2] == 0xD1) Data_0xD1(sRdBuf_Data);

               #pragma omp section

                  if(sRdBuf_Data[2] == 0xD2) Data_0xD2(sRdBuf_Data);

               .....

            }

         }

      }

   }

   return 0;

}

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 파일(특히 그림파일)을 올리실 때의 유의사항 운영자 2004-07-16 98967
1615 Tab 컨트롤러의 Label 변경 [1] sebi 2019-10-29 14
1614 utf-8 디코딩 관련하여 질문드립니다. cvi초보! 2019-07-11 29
1613 libMPSSE.dll 파일로드 에러 질문 입문 2019-06-12 31
1612 CVI 232통신 질문 드려요 [1] 길꾸리 2019-04-17 125
1611 pns 파일은 어떻게 확인할 수 있는지요? file [2] 쉬리0103 2018-11-09 106
1610 두개의 랜포트중 한개 사용방법? [2] 이중훈 2018-09-18 148
1609 rtsp 프로그램 해보신분 계신가요...? [3] 루키니아 2018-08-06 339
» 데이터량이 많을경우... [2] 루키니아 2018-07-05 154
1607 한글 IME 강좌편 tree 컨트롤에서 에러 file [4] 개발닥발 2018-07-04 71
1606 LabWindows/CVI 2017에서 RC1109 에러가 나는데요... file [1] 허창원 2018-05-25 147
1605 TCP 통신 질문입니다. client로 binary데이터 전송방법 문의드립니다. [2] 토키토키 2018-03-26 1221
1604 예제 Tmer [1] 깔쌈신 2018-03-19 124
1603 activex control 설치 관련 땡글이 2018-03-16 324
1602 디버그 모드와 릴리즈 모드에 대해 질문드립니다. [1] cvi초보! 2018-01-02 138
1601 하위 폴더 안의 데이터 검색하는 방법 문의 드립니다. [1] 토키토키 2017-12-28 89
1600 C++ 이용 관련 문의드립니다. file [2] cvi초보! 2017-12-15 163
1599 그래프 그리는 것 관련 질문드립니다. [1] cvi초보! 2017-11-15 115
1598 히스토그램 [1] 김승준 2017-10-13 116
1597 'Error Code -94' 해결방법이... [2] 요돌이 2017-10-10 102
1596 cvi 에서 cmd창 없애는 방법 [2] 김승준 2017-09-11 138