'Programmings'에 해당되는 글 51건
- 2008.04.21 CVI Serial통신 관련 함수
- 2008.04.16 CVI 시리얼 통신 예제
- 2008.04.11 CVI Ring control의 간단한 예
- 2008.02.01 CVI에서 Dynamic Link Library(DLL) 만들기
- 2008.02.01 CVI에서 Static Library 만들기
- 2008.01.24 CVI에서 컨트롤을 동적으로 생성하기
- 2008.01.24 GetActiveCtrl() 함수
- 2008.01.24 GetCtrlVal() 함수
- 2008.01.18 LabWindows/CVI에서 Win32 API를 사용하는 방법
- 2008.01.15 CVI 첫번 째 프로그램 - Hello world
CVI Serial통신 관련 함수
현재 LabWindows/CVI 를 이용해서 '시리얼(RS-232)통신'을 이용하는 프로그래밍을 하고 있는데.. 참 모르는 것이 많아 삽질 중이다. -_-
이런 저런 예제, FAQ등을 웹검색을 하고 또 'NI LabWindows/CVI Help'를 뒤지던 도중 RS-232 관련 좋은 문서가 있어 간단히 소개를 한다.
NI LabWindows/CVI Help를 일단 열고, 검색 탭을 클릭하여 검색을 활성화 하자.
검색창에 RS-232 Library tree로 검색을 하면 "RS-232 Library Function Tree"라는 녀석이 있는데... 이녀석이 CVI에서 RS-232 통신을 위해서 준비된 라이브러리 들인 듯 하다. -_-
뭐 정확한건 아니고.. 그냥 본인 생각에... ^^;
대충 아래와 같은 녀석들이 있다.
Function Tree, RS-232 Library
Class/Panel Name | Function Name |
---|---|
Open/Close | |
Open COM and Configure | OpenComConfig |
Close COM | CloseCom |
Open COM-Current State | OpenCom |
Input/Output | |
Read Buffer | ComRd |
Read Terminated Buffer | ComRdTerm |
Read Byte | ComRdByte |
Read to File | ComToFile |
Write Buffer | ComWrt |
Write Byte | ComWrtByte |
Write from File | ComFromFile |
XModem | |
XModem Receive File | XModemReceive |
XModem Send File | XModemSend |
XModem Configure | XModemConfig |
Control | |
Set Timeout Limit | SetComTime |
Set XON/XOFF Mode | SetXMode |
Set CTS Mode | SetCTSMode |
Flush Input Queue | FlushInQ |
Flush Output Queue | FlushOutQ |
Send Break Signal | ComBreak |
Set Escape Code | ComSetEscape |
Status | |
Get COM Status | GetComStat |
Get COM Line Status | GetComLineStatus |
Get COM Connection State | GetComConnectionState |
Get Input Queue Length | GetInQLen |
Get Output Queue Length | GetOutQLen |
Return RS-232 Error | ReturnRS232Err |
Get Error String | GetRS232ErrorString |
Callbacks | |
Install COM Callback | InstallComCallback |
Extension | |
Get System COM Handle | GetSystemComHandle |
자세한 내용은 NI LabWindows/CVI Help를 검색하시길...
'Programmings > CVI' 카테고리의 다른 글
CVI Control Modes for Generating Events (0) | 2008.04.24 |
---|---|
CVI 시리얼 통신 예제 (0) | 2008.04.16 |
CVI Ring control의 간단한 예 (0) | 2008.04.11 |
CVI에서 Dynamic Link Library(DLL) 만들기 (0) | 2008.02.01 |
CVI에서 Static Library 만들기 (0) | 2008.02.01 |
CVI 시리얼 통신 예제
간단한 '시리얼 통신프로그램'을 'LabWindows/CVI'로 구현하는 방법에 대해 알아보려 한다.
LabWindows/CVI에서 제공하는 Sample RS232예제를 보고 하려니 쫌 답답한 면도 있고.. 약간 복잡(?)한것 같아 일단 접는다. ㅋ
'CVI 정보나눔'이라는 한글 CVI관련 사이트의 예제 프로그램을 간단히 분석해보려 한다.
RS-232통신이라고 하지만.. 간단한 예제라 그런지 생각보다 단순하다.
'CVI 정보나눔'에서는 다른 프로그램과 연동하여 그 프로그램의 정보를 받아오는 역할을 하지만, 본인은 간단히 루프백하여 전송한 데이터를 다시 받아오는 형식으로 진행한다. 그게 간단하니깐...
프로그램을 설명하자면, RS-232 Port에서 포트를 선택하고, Write 에서 전송할 데이터를 입력하고 Query버튼을 클릭하면, 전송한 데이터가 Read로 다시 리턴되는 프로그램이다.
대충의 'uir'을 위의 화면과 같이 작성한다. 보기 좋게 속성 값과 함수의 값도 설정하고...
다 대충 대충 해도 Query버튼에 관련된 세팅은 대충하면 안된다. RS-232 통신하는데 가장 중요한 부분이므로..
본인의 경우 Query버튼의 속성을 아래 그림과 같이 Callback Function을 cmdQuery라고 정해 주었다. 사실... CVI정보나눔에서 이리 되어 있어 따라한거긴 하지만... -_-
cmdQuery 콜백함수의 내용은 아래와 같다.
int CVICALLBACK cmdQuery (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
{
int port, RTCount;
// 쓰기 버퍼관련 변수들..
char WriteBuffer[256];
int length;
int TermChar; // 전송하기 전에 덧붙일 Term.Char방법
// 0:None, 1:CR(0x0D), 2:LF(0x0A), 3:CR+LF
// 읽기 버퍼관련 변수들..
char ReadBuffer[10000];
// 1. Port를 Open하고, Configure합니다.
GetCtrlVal (panel, PANEL_ringRESOURCE, &port);
if(!OpenComConfig (port, "", 9600, 0, 8, 2, 512, 512) ) {
SetComTime (port, 2000);
// 2. 장치 포트로 보낼 데이터를 읽어옵니다.
GetCtrlVal (panel, PANEL_strWriteBuffer, WriteBuffer);
GetCtrlVal (panel, PANEL_ringTermChar, &TermChar);
// 3. Termination character를 덧붙여서 송신합니다.
switch(TermChar) {
case 1:
strcat(WriteBuffer, "\015"); // CR(0x0D)는 8진수로 015
break;
case 2:
strcat(WriteBuffer, "\012"); // LF(0x0A)는 8진수로 012
break;
case 3:
strcat(WriteBuffer, "\015\012");
break;
}
length = strlen(WriteBuffer);
ComWrt (port, WriteBuffer, length);
// 4. 장치 포트로부터 데이터를 읽어옵니다.
ReadBuffer[0] = '\0';
RTCount = ComRdTerm (port, ReadBuffer, 50, 0x0A);
ReadBuffer[RTCount] = '\0';
SetCtrlVal(panel, PANEL_strReadBuffer, ReadBuffer);
// 5. 포트를 닫습니다.
CloseCom (port);
}
}
break;
}
return 0;
}
일반적인 통신 프로그래밍과 얼추 비슷한것 같다.
통신할 장치(Device)를 열고, 읽고, 쓰고, 통신한 장치를 닫고... 등..
LabWindows/CVI에서의 시리얼 통신에 관련된 부분은 NI의 웹페이지에서도 찾아볼 수 있다.
LabWindows/CVI Serial Communication Serial Communication Programming(http://www.ni.com/support/cvi/serlprog.htm)
위의 링크를 따라가면
- Opening and Closing COM Ports
- Writing to COM Port
- Reading from COM Port
- Using InstallComCallback with Serial Reads
'Programmings > CVI' 카테고리의 다른 글
CVI Control Modes for Generating Events (0) | 2008.04.24 |
---|---|
CVI Serial통신 관련 함수 (0) | 2008.04.21 |
CVI Ring control의 간단한 예 (0) | 2008.04.11 |
CVI에서 Dynamic Link Library(DLL) 만들기 (0) | 2008.02.01 |
CVI에서 Static Library 만들기 (0) | 2008.02.01 |
CVI Ring control의 간단한 예
CVI 프로그래밍을 하면 일반적인 GUI프로그래밍을 하는것과 거의 유사하다.
수많은 컨트롤들이 있고, 그에 따른 속성들과 함수들이 제공된다. 이를 모르면 그야말로 캐삽질!!!
작업량이 많아 간간히 CVI를 하는 실정이다. 뭐 이리저리 문서를 찾아는 보지만 적당히 볼만큼의 문서는 눈을 씻고 찾아볼래야 찾아볼 수가 없다. 그래도 어쩌겠는가... 일단 하기는 해야하는데.. -_-
하는 작업들은 거의 대부분이 CVI에서 제공하는 예제들과 NI LabWindows/CVI Help를 참고하고 있다.
뭐 다른 사람들도 다 마찬가지겠지만.. ^^;
"RING"라는 컨트롤이 있다.
그 중에서 빨간 밑줄을 그은 녀석.. 일반적으로 다른 GUI에서 "콤보박스"라고 부르는 녀석에 대해서 알아보려한다.
CVI에서는 "Recessed Menu Ring"라고 부르는 듯하다. 뭐 그리 적혀있으니...
기능을 대충 보아하니 완전 콤보박스다. 괜히 이름만 다르게 불러 사람을 헷갈리게 하고 있다.
하는 일은 여러 메뉴(?)를 가지고 있으면서 공간이 모자라는 듯한 곳에 위치해 컨트롤을 한 번 클릭하게 되면 리스트가 펴지면서 원하는 메뉴를 선택할 수 있게 하는 것이다.
여기서 보일 예제는 RING에서 어떤 항목을 선택하게 되면 옆에 리스트박스(ListBox)라는 녀석에 해당하는 하위 리스트를 보여주는 것이다.
왠지 꽤 사용성이 짙어보이긴 하는데... -_-;
간단하게 위의 그림과 같이 UI를 작성하자.
그리고 RING의 속성을 대충 채워 넣는다.
*.uir파일에서 Ring 컨트롤을 더블클릭하면 아래와 같은 에디트 창이 뜬다
Ring에 들어갈 세부 항목을 선택하기 위해서 "Label/Value Pairs..."를 클릭한다.
사용하려 하는 항목과 값을 대충 넣는다.
이로서 일단 RING에대한 준비작업은 끝났다.
여기서 중요한 것은 Data Type이다. Value의 값이 Data Type의 값과 일치해야한다. 만일 Data Type를 char나 다른 값으로 바꾸어보며 작업을 해보면... 대충 감을 잡을 것이다.
List Box의 경우도 동일하게 작업을 해준다. List Box의 Label/Value Pairs..는 일단 Data Type만 정의해주고 나머지는 비워둔다. RING에서 선택된 값을 나중에 넣어줄 것이므로..
이제 만들어진 uir를 이용하여 소스 프레임을 생성한다.
메뉴에서 Code > Generate > All Code...
음.. 이제 소스부분으로 슬슬 넘어가 보겠다.
일단 List Box에 들어갈 데이터를 정의해야겠다.
List Box는 Label과 Value로 이루어져있다. 그래서 데이터도 Label과 Value의 쌍으로 된 녀석을 만들어준다.
typedef struct {간단하게 위와 같이 만들었다.
char name[20];
int id;
}datatype;
datatype fluit[4] = {{"사과", 0},
{"딸기", 2},
{"바나나", 3},
{"오렌쥐", 5}};
datatype vegetable[2] = {{"오이", 0},
{"당근~당근!!", 1}};
RING에서는 과일과 채소라는 항목을 만들었고, 과일이라는 항목을 선택했을 때 List Box에 fluit라는 녀석을 보여줄 것이다. 음.. 채소를 선택했다면... vegetable라는 녀석을 보여줄것이고..
다음은 RING 컨트롤을 생성할 때 같이 생성한 cmdRING라는 함수의 내용을 채워넣어야 한다.
cmdRING는 위쪽에 RING의 속성을 채워넣는 부분에서 CallBack Function이라는 항목에 넣었던 부분이다.
CallBack Function이라는 부분에 cmdRING라는 녀석을 넣어주면 자동으로 아래와 같은 부분이 생성된다.
int CVICALLBACK cmdRing (int panel, int control, int event,이 내부에 원하는 부분을 채워 넣기만 하면 된다.
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
break;
}
return 0;
}
본인의 경우 아래와 같이 채워 넣었다.
흠.. 흠.. 타이핑하기 귀찮아서... -_-
RING에서 선택된 항목은 Value값에 의해서 switch-case의 해당하는 부분으로 점프한다.
과일을 선택하면 case 0:에 걸리고, 채소를 선택하면 case 1:에걸리고.. 이건... C에 나오는 부분이니 대충 패스!!
각 선택되었을 때 미리 생성해 놓은 데이터의 크기(리스트의 개수)만큼 루프를 돌면서 List Box에 추가시켜주는 간단한 예이다.
List Box에 새로운 아이템을 추가할 때에는 InsertListItem()이라는 함수를 사용하게 된다.
더 자세한 사항은 NI LabWindows/CVI Help를 참조하면 될 듯 하다.InsertListItem
int InsertListItem (int panelHandle, int controlID, int itemIndex, char itemLabel[], ...);
Purpose
Inserts a label/value pair into a list or ring control at a specific zero-based index.
Inserting the new pair causes the indices of existing label/value pairs at and beyond the insertion point to increase by one.
You can create columns in a list box control by embedding escape codes in the itemLabel parameter.
......
'Programmings > CVI' 카테고리의 다른 글
CVI Serial통신 관련 함수 (0) | 2008.04.21 |
---|---|
CVI 시리얼 통신 예제 (0) | 2008.04.16 |
CVI에서 Dynamic Link Library(DLL) 만들기 (0) | 2008.02.01 |
CVI에서 Static Library 만들기 (0) | 2008.02.01 |
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
CVI에서 Dynamic Link Library(DLL) 만들기
이번엔 LabWindows/CVI에서 Dynamic Link Labrary(DLL)을 만드는 방법이다!!
아무래도 Static Library보다는 Dynamic Link Labrary이 사용하기에도 더 편리하고 더 많이 사용하는 듯 하기에...
현재 만드는 DLL이니 LIB니 하는 것들은 다음번에 다룰 CVI로 작성하게 될 MP3 Player를 만들기 위해 사용되는 라이브러리이다. 뭐 직접 하지 않아도 상관은 없지만.. 하나하나 직접 따라 해보는 것이 좋지 않을까? 생각한다.
이번 예제도 앞서 이야기 했던 'Static Labrary'와 마찬가지로 'CVI 정보나눔'의 강좌를 토대로 작성을 했고, KD_MCI_sl_source.zip파일을 이용하여 DLL파일을 작성하게 된다.
DLL을 만들기 위해 하나의 프로젝트(KD_MCI.prj)를 생성한다. 물론 다른 이름으로 프로젝트를 생성해도 전혀 상관이 없다. 위의 첨부파일의 압축을 해제하고, 파일들을 프로젝트에 포함시킨다.
참고로, 편의를 위해서 파일명을 KD_MCI_sl.*에서 KD_MCI.*로 바꾸어 준다. 안해도 상관은 없음... -_-
Static Library를 만들 때와 다른 점이라면, 프로젝트에 winmm.lib가 포함된다는 점이다.
다음 해주어야 하는 일은 각각의 소스파일에 약간의 수정을 해주어야 하는 부분이 있다.
파일 이름을 수정해 주었으므로 include문도 수정을 해주고, Export할 변수 이름과 함수 앞에 DLLEXPORT라는 것을 추가시켜준다.
Export한다는 것은 해당 DLL을 이용하는 다른 프로그램이 해당 변수나 함수를 이용할 수 있도록 하겠다는 의미이다.
참고로... 위 그림에 나오는 부분만 바꾸는 것이 아니고 죄다~ 싹 다 바꾸는 거다!!
다음은... DLL중 가장 중요한 함수를 작성해야 한다.
DLL main이라고.. 다른 main함수와 마찬가지로 DLL의 시작점을 나타내는 함수이다.
'KD_MCIPLAY DLLEXPORT kmp; 다음에 커서를 위치시키고, Edit > Insert Construct > DLLMain을 선택하자.
그러면, 아래와 같이 DLLMain과 관련된 부분이 생성되는 것을 확인할 수 있다.
추가로 맨위의 #define KD_MCI_C는 KD_MCI.h 파일에서 전역변수 kmp에 대한 선언을 DLL만들 때와 DLL사용할 때를 구분하기 위해 정의한 매크로이다.
다음으로 KD_MCI.h파일을 수정하자.
별건 없고, 아래의 붉은 부분으로 된 부분을 수정해 주면 된다.
잘은 모르지만.. extern KD_MCIPLAY DLLIMPORT kmp;를 해주어야 한다고 한다. DLL을 만들 때는 선언되지 않도록 하고, 나중에 DLL을 사용하기 위한 프로그램의 프로젝트에서는 적용되어 사용을 할 수 있게 된다고 한다.
.c에서 define으로 정의해 두고, 정의가 되지 않으면 사용하도록 해서 그런가?? -_-다음은 DLL Project 파일 속성을 설정하는 부분이다.
Build > Configuration > Release를 선택하고,
Build > Target Type > Dynamic Link Library를 선택,
Build > Target Settings... 에서 DLL Export Option을 설정한다.
Build > Create Release Dynamic Link Library 메뉴를 선택하여, DLL을 생성한다.
생성된 DLL은 프로젝트가 있는 디렉토리를 확인하면 생성된 파일을 볼 수 있을 것이다.
생성된 파일들은 Static Library와 비슷하다.
참고 : CVI 정보나눔
'Programmings > CVI' 카테고리의 다른 글
CVI 시리얼 통신 예제 (0) | 2008.04.16 |
---|---|
CVI Ring control의 간단한 예 (0) | 2008.04.11 |
CVI에서 Static Library 만들기 (0) | 2008.02.01 |
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
GetActiveCtrl() 함수 (0) | 2008.01.24 |
CVI에서 Static Library 만들기
LabWindows/CVI에서 Static Library를 생성하는 방법에 대해서 알아보고자 한다.
이 글은 'CVI 정보나눔'이라는 홈페이지의 강좌를 보고 직접 실습을 해가며 작성하는 것으로.. 이 문서를 보는 사람들도 각자 따라해보기 식으로 하면 도움이 될 듯 하다.
먼저 이 예제에서 필요로해서 제공되는 소스코드가 들어있는 파일이 있다.
일단 위의 파일을 다운로드받고, 압축해제를 한다.
프로젝트를 하나 생성하고, 다운받은 파일 중 .c, .h파일을 프로젝트에 추가시킨다.
예제와 같이 프로젝트 이름은 'KD_MCI_sl.prj'라는 이름으로 만든다.
다음은 project 파일속성을 설정하는 단계이다.
예제에서는 Build > Configuration > Release 모드로 작성을 했다.
처음 테스트 하는 단계에서는 Debug모드로 작성을 하고 테스트 한 후, 검증된 단계에서 Library로 만들 때에는 Release모드로 작성을 하는게 맞는 듯 하다.
Build > Target Type을 Static Library로 변경한다.
Build > Target Settings... 메뉴를 선택하고 Target Settings창에서 "Library Generation Choises..."버튼을 클릭한다.
어떤 컴파일러용의 라이브러리를 생성할 것인가를 선택하는 것인데, 'Generate static libraries for both compilers'를 선택하게 되면 'Visual C++'와 'Borland C++'계열의 라이브러리도 함께 생성된다.
마지막 단계로 Build > Create Static Library메뉴를 클릭하자!!!
다음과 같은 메시지 창이 나타나게 되면 정상적으로 'Static Library'를 생성한 것이다.
프로젝트를 생성한 디렉토리에 들어가서 Static Library가 정상적으로 생성 되었는지 확인해 보자
위의 그림에서 보는것처럼 KD_MCI_sl.lib라는 라이브러리 파일이 있고, borland, msvc라는 디렉토리가 있는것을 확인할 수 있다.
KD_MCI_sl.lib는 CVI용 Static Library이고, borland, msvc는 각각 Borland용, MS Visual C++용 Static Library이다.
차후에 이렇게 만들어진 라이브러리 유용하게 사용할 수 있을 것 같다.
출처 : CVI 정보나눔
'Programmings > CVI' 카테고리의 다른 글
CVI Ring control의 간단한 예 (0) | 2008.04.11 |
---|---|
CVI에서 Dynamic Link Library(DLL) 만들기 (0) | 2008.02.01 |
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
GetActiveCtrl() 함수 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
CVI에서 컨트롤을 동적으로 생성하기
CVI에서 동적으로 컨트롤을 생성하는 방법이다.
일반적인GUI프로그램에서 사용하고자 하는 컨트롤을 Panel에 미리 배치해놓고 작업을 하게 된다.
하지만 경우에 따라 버튼을 클릭한다거나 했을 때 동적으로 panel에 생성할 필요가 있을 때가 있다.
이 때 LabWindows/CVI에서 사용할 수 있는 함수가 NewCtrl()함수이다.
인자로 panel핸들, 컨트롤의 스타일, 컨트롤의 label, 위치(상, 좌)가 있고, int형의 컨트롤 ID를 반환한다.
NewCtrl
int NewCtrl (int panelHandle, int controlStyle, char controlLabel[], int controlTop, int controlLeft);
Purpose
Creates a new control and returns a control ID that you can use to
specify the control in subsequent function calls.
If you call this function to add a timer control to a panel, you
must do so in the same thread in which you create or load the panel.
Parameters
Return Value
Name | Type | Description |
controlID | integer | Returns the ID you can use to specify the control in subsequent function calls. Negative values indicate that an error occurred. Zero is not a valid ID. |
참고 : CVI 정보나눔, NI LabWindows/CVI Help
'Programmings > CVI' 카테고리의 다른 글
CVI에서 Dynamic Link Library(DLL) 만들기 (0) | 2008.02.01 |
---|---|
CVI에서 Static Library 만들기 (0) | 2008.02.01 |
GetActiveCtrl() 함수 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
LabWindows/CVI에서 Win32 API를 사용하는 방법 (0) | 2008.01.18 |
GetActiveCtrl() 함수
GetActiveCtrl()함수는 특정 Panel위에 있는 활성화된 컨트롤의 ID를 받아오는 함수이다.
음.. 대충 사용하려는 컨트롤의 ID를 알고싶을 때 사용하면 좋을듯..
예를 들어(CVI 정보사랑을 검색하다 발견..)..
버튼이라든지 다른 컨트롤을 동적으로 생성할 경우가 있을 수 있다.
이렇게 동적으로 생성한 컨트롤을 다룰 때 이녀석의 ID는 어떻게 될지.. 혹은 ID를 사용해야 할 경우가 있다면, 그때 GetActiveCtrl()을 사용할 수 있을 것이다.
반대로 SetActiveCtrl()은 특정 Panel의 활성화 된 컨트롤에 ID를 세팅하는 정도(?)의 함수일 것이다.
GetActiveCtrl
int GetActiveCtrl (int panelHandle);
Purpose
Obtains the ID of the active control on the specified panel.
The active control is the control that receives keyboard events
when the panel is the active panel.
Parameters
Input | ||
Name | Type | Description |
panelHandle | integer | Specifier for a particular panel that is currently in memory. You obtain this handle from LoadPanel, NewPanel, or DuplicatePanel. |
Return Value
Name | Type | Description |
controlID | integer | Returns the control ID of the active control. If the panel has no controls,
GetActiveCtrl returns zero. GetActiveCtrl can return the following error code: –4—Panel, pop-up, menu bar, or plot ID is invalid. |
참고 : CVI 정보나눔, NI LabWindows/CVI Help
'Programmings > CVI' 카테고리의 다른 글
CVI에서 Static Library 만들기 (0) | 2008.02.01 |
---|---|
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
LabWindows/CVI에서 Win32 API를 사용하는 방법 (0) | 2008.01.18 |
CVI 첫번 째 프로그램 - Hello world (0) | 2008.01.15 |
GetCtrlVal() 함수
GetCtrlVal()함수는 해당 컨트롤의 값을 받아오는 함수이다.
다시말해서 수치컨트롤, 문자열컨트롤, 버튼컨트롤 등의 값을 읽어올 때 사용하는 CVI함수이다.
이와 반대로 컨트롤에 값을 기록할 때에는 SetCtrlVal()함수를 사용한다.
관련된 함수 정보는 NI LabWindows/CVI Help를 검색해보면 아래와 같은 정보를 얻을 수 있다.
GetCtrlVal
int GetCtrlVal (int panelHandle, int controlID, void *value);
Purpose
Obtains the current value of a control.
When the control ID is for a list box or ring control, GetCtrlVal returns the value of the currently selected list item. To obtain the index of the selected list item, use GetCtrlIndex.
Note This function is not valid for graph and strip chart controls. |
Parameters
Input | ||
Name | Type | Description |
panelHandle | integer | Specifier for a particular panel that is currently in memory. You obtain this handle from LoadPanel, NewPanel, or DuplicatePanel. |
controlID | integer | The defined constant, located in the .uir header file, that you assigned to the control in the User Interface Editor, or the ID returned by NewCtrl or DuplicateCtrl. |
Output | ||
Name | Type | Description |
value | void * | The control value. The data type of value must match the data type of the control. |
Return Value
Name | Type | Description |
status | integer | Return value indicating whether the function was successful. A negative number indicates that an error occurred. |
참고 : CVI 정보나눔, NI LabWindows/CVI Help
'Programmings > CVI' 카테고리의 다른 글
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
---|---|
GetActiveCtrl() 함수 (0) | 2008.01.24 |
LabWindows/CVI에서 Win32 API를 사용하는 방법 (0) | 2008.01.18 |
CVI 첫번 째 프로그램 - Hello world (0) | 2008.01.15 |
CVI 설치 (0) | 2008.01.15 |
LabWindows/CVI에서 Win32 API를 사용하는 방법
Win32 API에는 Windows라는 OS에 사용되는 여러 자원을 이용하기 때문에 Windows상에서는 CVI보다는 훨씬 유용하게 사용할 수 있다.
그러나... LabWindows/CVI에서 Win32 API를 사용할 수 있다고 한다.
이 문서는 LabWindows/CVI상에서 Win32 API를 사용하는 방법에 대해 간략하게 말하고자 한다. 다음은 LabWindows/CVI 8.5에서 작업을 한 것이다.
방법은 생각외로 간단(?)하다.
Build Options를 수정해주는 것과 약간의 작업으로 끝!
첫 번째로 CVI에서 Options의 Build Options...를 선택한다.
다음은 Compiler Defines부분을 수정해준다.
원래는 /DWIN32_LEAN_AND_MEAN로 되어있는데.. 이부분을 /WIN32_LEAN_AND_MEAN로 수정한다음 OK버튼을 클릭한다.
Win32 API 함수를 사용하기를 원하는 소스파일에 windows.h 헤더파일을 추가한다.
그리고나서 해당 API함수에 대한 Import Library를 Project에 추가한다. Import Library를 확인하는 방법은 CVI의 Help를 이용하면 된다.
메뉴의 Help를 보면, Windows SDK에 대한 정보를 얻을 수 있는 것이 있다.
찾을 키워드에서 찾고 싶은 함수를 입력하게되면, Import Library를 확인할 수 있다.
해당하는 Import Library를 CVI가 설치된 디렉토리에서 찾아 해당 Project에 추가한다. 그리고 나서 소스에 원하는 Win32 API함수를 사용한 후 컴파일 하고, 실행파일을 만들면 CVI에서 Win32 API를 사용하는 것을 볼 수 있을 것이다.
참고 : CVI 정보나눔
'Programmings > CVI' 카테고리의 다른 글
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
---|---|
GetActiveCtrl() 함수 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
CVI 첫번 째 프로그램 - Hello world (0) | 2008.01.15 |
CVI 설치 (0) | 2008.01.15 |
CVI 첫번 째 프로그램 - Hello world
CVI를 설치하고 실행하는 첫번째 프로그램...
왜 사람들은 항상 첫번 째 프로그램을 Hello world로 하는 거지? ㅡㅡ;
그냥 한다. ㅋ
콘솔 프로그램은 텍스트 모드의 출력을 내는 순차적인 프로그램이다. 약간 촌스럽긴 하지만.. 함 해보는데 의의를 두고..
먼저 CVI를 실행시킨다.
모양새가 요즘의 프로그램 툴들과 비슷하여 그냥 보고 할 수 있을 정도이다. 처음엔 다 쉽지만.. 말이다.
일단 프로젝트를 열기 위해서 Files의 New의 Project를 클릭한다.
위와 같은 모양의 CVI 툴을 볼 수 있다. 쫌 단순하게 생겼다.. 별로 이쁘지도 않고..
File -> Save Untitled.prj As..를 클릭해 새로운 프로젝트로 저장을 한다. 뭐 일단 따라하기 식으로 따라하는 것이니.. 그대로 고고!!
소스파일을 작성하기 위해서 File -> New -> Source(.c)...를 클릭한다.
에디터에 다음과 같이 "Hello, world"를 출력할 프로그램을 작성한다.
이상한 점은... 기존의 C와는 달리 헤더파일이 없다는 거... ㅡㅡ;
CVI에서는 헤더파일을 적지 않는 것 같다. 뒤에 보면 알겠지만.. 알아서 생성되는 듯...
에디터 창의 파일을 현지의 프로젝트에 추가한다.
아래와 같이 변한 모습을 볼 수 있다.
실행 파일을 생성하기 위해서 다음과 같이 Build -> Create Debuggable Executable를 클릭한다.
참고로, 바로 실행을 하더라도 dependency check에 의해 컴파일 과정을 자동으로 거치게 된다.
디폴트 값은 디버그 모드로 되어 있고, Build -> Configuration에서 릴리즈 모드로 변경할 수 있다.
다음과 같은 창이 갑자기 튀어나올 것이다.
이녀석은 hello.c에 헤더파일을 적어주지 않았기 때문에 헤더파일을 추가시킬 것인지에 대한 메세지창이다.
stdio.h가 아니고, ansi_c.h로 되어있다. 이는 ANSI C에서 이용되는 모든 헤더파일을 포함한다고 생각하면 된다. CVI에서만 이용된다고 보면 된다.
'YES'를 클릭하면 실행파일이 만들어진다. 그리고 소스파일에는 다음과 같이 헤더파일이 추가된 것을 확인할 수 있다.
실행은 Run -> Debug ~.exe를 통해서 할 수 있다.
물론 아래쪽에 있는 Execute... 를 통해서도 할 수 있다.
실행을 하게 되면, 도스창이 깜빡이고 사라지는 것을 확인 할 수 있다. 마지막에 입력을 받기위해 대기하는 getchar()함수를 추가시키면 도스화면이 멈춘상태로 대기하는 것을 확인할 수 있다.
#include <ansi_c.h>Run -> Debug ~.exe를 실행시키면 다음과 같은 결과화면을 볼 수 있다.
void main(void)
{
printf("Hello, world!!\n");
getchar();
}
Run -> Execute ~.exe를 실행시키면 아래와 같이 약간 특이한 모양새의 출력화면을 볼 수 있다.
뭐 결과는 같으니.. 마음에 드는걸로다가 알아서 실행하기를... ㅋ
'Programmings > CVI' 카테고리의 다른 글
CVI에서 컨트롤을 동적으로 생성하기 (0) | 2008.01.24 |
---|---|
GetActiveCtrl() 함수 (0) | 2008.01.24 |
GetCtrlVal() 함수 (0) | 2008.01.24 |
LabWindows/CVI에서 Win32 API를 사용하는 방법 (0) | 2008.01.18 |
CVI 설치 (0) | 2008.01.15 |