'프로그램'에 해당되는 글 4건

  1. 2009.02.05 프로그램 실행 에러 - MFC71D.DLL을(를) 찾을 수 없으므로... 5
  2. 2008.04.16 CVI 시리얼 통신 예제
  3. 2008.01.30 시리얼 통신 프로그램 2
  4. 2008.01.15 CVI 첫번 째 프로그램 - Hello world
2009. 2. 5. 10:14

프로그램 실행 에러 - MFC71D.DLL을(를) 찾을 수 없으므로...



프로그램을 실행하다보면 간혹 다음과 같은 에러 메시지를 볼 때가 있다.
"MFC71D.DLL을(를) 찾을 수 없으므로 응용 프로그램을 시작하지 못했습니다. 이문제를 해결하려면 응용 프로그램을 다시 설치하십시오.

이는 MFC로 작성된 프로그램을 실행 시킬 때 필요로 하는 MFC71D.DLL이라는 파일이 없어서 발생하는 문제이다.이 때는 단순히 MFC71D.DLL 이라는 파일을 구해서 실행하는 파일이 있는 폴더 혹은 WINDOWS(C:\WINDOWS)폴더 혹은 System(C:\WINDOWS\System32)폴더에 복사한 후 해당 프로그램을 실행하면 된다.

위와 같이 다양한 경로에 MFC71D.DLL 파일을 넣어도 정상적으로 동작하는 이유는 해당 프로그램이 실행될 때 연관된 파일을 찾는 순서가 정해져 있어서 여기 저기 필요한 곳을 뒤져 필요한 파일을 찾아서 실행하기 때문이다.
  1. 프로그램의 실행파일이 존재하는 디렉토리
  2. Windows System(C:\WINDOWS\System32) 디렉토리
  3. Windows(C:\WINDOWS) 디렉토리
  4. 환경변수 PATH에 의해 지정된 디렉토리
MFC71D.DLL 파일을 넣은 뒤 응용 프로그램을 다시 실행하면 한번 더 에러 메시지를 볼 수 있다.
"MSVCR71D.DLL을(를) 찾을 수 없으므로 응용 프로그램을 시작하지 못했습니다. 이 문제를 해결하려면 응용 프로그램을 다시 설치하십시오."

이녀석도 마찬가지로 MSVCR71D.DLL을 MFC71D.DLL과 같은 방식으로 해주면 해결을 할 수가 있다.

이렇게 하고 다시 프로그램을 실행시키면 정상적으로 프로그램이 실행되는 것을 확인할 수 있을 것이다.

2008. 4. 16. 19:25

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
등에 관련된 정보를 얻을 수 있다.

2008. 1. 30. 16:51

시리얼 통신 프로그램



얼마 전 '거리측정 초음파 센서'로 작업을 할 때 테스트 용으로 사용했었던 시리얼 통신 프로그램이다.

당시 초음파 센서로 특정 명령을 HEX 값으로 날리는 작업이 필요했었는데.. 웹에서 구하는 다른 프로그램들은 대부분(사실 내가 찾았던 것들은 모두가...) ASCII 로만 값을 날리는 것들 뿐이었다.

그러던 도중 'Commaster'이라는 통신 프로그램을 구하게 되었다.

꽤나 단순한 작업을 할 수 있는 프로그램이었고,  ASCII값이나 HEX값을 모두 날릴수 있도록 지원이 되어서 테스트를 진행 할 수있었다.

사용자 삽입 이미지
시리얼 통신 프로그램 commaster

누가 만들었는지는 몰라도 그땐 정말 고마웠다. ㅎㅎ
"감사히 잘 썼습니다!!!!"
이렇게 감사의 인사라도 해야하는 것이 예의일거 같아서..

일단 다른 사람들도 필요할 때 사용할 수 있으면 좋을 것 같아서 파일을 올린다.

만약 '저작권'(?)같은것 때문에 문제가 된다면 얘기해주시길...

2008. 1. 15. 15:00

CVI 첫번 째 프로그램 - Hello world



CVI를 설치하고 실행하는 첫번째 프로그램...

왜 사람들은 항상 첫번 째 프로그램을 Hello world로 하는 거지? ㅡㅡ;
그냥 한다. ㅋ

콘솔 프로그램은 텍스트 모드의 출력을 내는 순차적인 프로그램이다. 약간 촌스럽긴 하지만.. 함 해보는데 의의를 두고..

먼저 CVI를 실행시킨다.
사용자 삽입 이미지

모양새가 요즘의 프로그램 툴들과 비슷하여 그냥 보고 할 수 있을 정도이다. 처음엔 다 쉽지만.. 말이다.

일단 프로젝트를 열기 위해서 FilesNewProject를 클릭한다.
사용자 삽입 이미지
위와 같은 모양의 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>

void main(void)
{
    printf("Hello, world!!\n");
    getchar();
}
Run -> Debug ~.exe를 실행시키면 다음과 같은 결과화면을 볼 수 있다.
사용자 삽입 이미지

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