태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

티스토리 툴바




C#에서 define 사용하기


C#에서는 C++에서 사용하던 방식으로 전처리 상수를 정의할 수 없다.


이를테면 C++에서 자주 사용될 상수를 정의할 때 아래와 같이 정의할 수 있었다.


#define pi   3.14159
#define golden_ratio   1.61803


위와같이 사용하기 귀찮은 상수들에 대해서 간편하게 정의해서 사용할 수 있던 기능이
C#에선 사라졌다.

그래서 C#에서는 아래와 같이 사용하라고 msdn에 나와있다.
static class Constants
{
    public const double Pi = 3.14159;
    public const int SpeedOfLight = 300000; // km per sec.

}
class Program
{
    static void Main()
    {
        double radius = 5.3;
        double area = Constants.Pi * (radius * radius);
        int secsFromSun = 149476000 / Constants.SpeedOfLight; // in km
    }
}

static 형식의 class를  "contants"라는 이름으로 만들고
그 안에 public const형태의 상수들을 선언한다.

그리고 사용할 때는
Constants.[상수명]과 같이 불러와서 사용하게 된다.


결국...그냥 상수형으로 사용될 녀석들을 한 클래스안에 넣어서 사용하라는 말이다.


저작자 표시 비영리 변경 금지

C# 세자리 마다

콤마(,) 찍는 함수

        string tomoney(string no)
        {
            char[] tmp = no.ToCharArray();
            int cnt = tmp.Length;
            string result = "";
            try
            {
                while (true)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        cnt--;
                        result = tmp[cnt] + result;

                    }
                    if(cnt>0) result = "," + result;
                }
           
            }
            catch { }
            return result;
}


string 형태로 받아서 string형태로 반환해주는 함수
급하게 필요해서 짠거라...소스가 드러움-_-
저작자 표시 비영리 변경 금지

C#응용프로그램

배포프로그램 만들기



지인의 부탁으로 C#을 이용해 고객관리 프로그램을 만들게 되었습니다.
mysql과 C#을 연동해서 고객 database관리 및 게시판, 자료실 기능을 하는 응용프로그램을 만들었는데요

문제는.... dotNet Framework!!!

이 닷넷프레임워크 덕분에 고민에 빠졌습니다.

내가 만든 프로그램을 실행파일만 던져주게된다면...닷넷이 설치되어있는 pc에서만 실행이 될텐데...
(게다가 전 mysql 연동을 했기때문에 mysql 관련 파일도 같이 설치해야 하는 상황이었습니다)

그래서 배포패키지를 만드는 방법을 찾아보게되었죠..

전호진 님의 블로그를 통해 방법을 알게되었습니다.(http://crynut84.tistory.com/45)

이번 포스트에서는 배포를 위한 설치파일(exe 혹은 msi)을 만드는 방법을 알아보고,
다음 포스트에서는 .netframework 설치여부를 확인 후 설치되지 않은 경우 .netframework도 같이 설치 해 주는 배포프로그램을 제작 해 보도록 하겠습니다.

영문판 기준으로 설명드립니다;;

1. File -> Project : 프로젝트를 생성합니다. VS에서 설치프로그램을 만드냐구요? 네. 그렇습니다. 설치프로그램을 제작해주는 다양한 툴이 있지만...내부 소스를 분석해서 포함된 DLL파일을 찾아주는 기능을 해 주는 녀석은 (적어도 제가 아는 무료프로그램중에는) VS2008밖에 없습니다-_-
(아..전 대학생이라 VS2008이 무료! 2010/04/24 - MS VisualStudio 2010 무료다운로드(DreamSpark)


2. Other project Types  -> Setup Project : 설치 프로젝트를 생성합니다. 그리고 이름이랑 경로도 정해주세요... 나중에 설치하게되었을 때 프로그램 경로나 아이콘 이름 들이 다 설치프로젝트명으로 설정됩니다.
물론 바꿀 수도 있습니다-_-

3. 짜짠!! 이런게 나왔네요-_- 지금까지 보던 프로젝트 화면과는 조금 다르죠? 당연합니다. 이건 설치용 프로젝트를 만드는거니까요!
수훨한 설명을 위해 가장 왼쪽의 창을 1번!!, 가운데 Name과 Type이 나오는 창은 2번!! 그리고 속성 창을 3번이라고 부르도록 하죠!

4. 자..1번창에서 application folder를 선택하면 속성창에 application folder에 대한 속성이 나옵니다.
당연합니다-_-;;;
application folder : 프로그램이 실제로 설치되는 경로
user's desktop : 설치된 pc의 바탕화면
user's program menu : 시작바 -> 프로그램 눌렀을 때 뜨는 메뉴
이걸 왜 설명하냐면요...
우선 프로그램 설치 패키지까지 만들꺼니까...아이콘이 하나 좋은게 있으면 좋겠죠?
그래서 설치프로그램이랑 아이콘들은 모두 applicaiton folder에 넣을거구요
바탕화면과 프로그램 메뉴에 단축아이콘을 하나씩 넣을겁니다. 따라오세요


5. 우선 아까 1번창의 application folder를 선택한 상태에서...다른건 건드리지 마시고 잘 읽어보면 무슨 말인지 알겁니다. 전...귀찮으니까-_- defaultLocation만 건드리겠습니다. 기본 폴더가 좀 짜증나는 경로라..-_- 뭐..실제 사용자는 설치폴더를 볼 일이 잘 없겠지만... 그래도 깔끔한게 좋잖아요?
기본으로 설정되는 폴더는 
c:\program files \ 제조사명 \ 프로그램명
이딴식입니다-_-...으음...전 제조사도 아닐 뿐더러...제가 만든 응용프로그램을 두 가지 이상 설치할 필요도 없기 때문에...그냥  아래와 같이 간단하게 줄이도록 하겠습니다.


6. 자.. 이제 실행파일과 아이콘을 등록하도록 하죠.
  2번창에 우측클릭 > add > file
그럼 파일을 불러올 수 있습니다. 만들어놓았던 exe파일을 추가합니다.
(보통프로젝트 폴더의 debug나 release 폴더에 들어있죠?)


전 프로젝트 명을 처음에 Login이라고 만드는 바람에..(물론 고칠 수도 있었겟지만-_-;;) Login.exe라는 이름의 실행파일이 생성되었더군요-_-;;;;;(여기서 제가 만든 응용프로그램에서 최초로 제작된 폼이 로그인 폼이라는 것을 알 수 있겠군요-_-)
아무튼.. Login.exe파일이 추가되었습니다. 그런데...mysql.data.dll 파일도 추가되었군요.
제가 했냐구요? 아니요!-_-;;

여기서 제가 VS2008을 이용해 배포용 설치 패키징을 하는 이유가 나타납니다. 이 녀석은... 외부 리소스로 사용된 dll파일따위를 지가 알아서 찾아서 추가, 등록 시켜준다는거죠!!

전 mysql과 C#을 연동하기위해 resource에 mysql.data.dll파일을 추가했거덩요...
와우! 놀랍지않습니까?

7. 놀란가슴 진정시키고, Login.exe파일의 바로가기를 만들어주세요, 이 바로가기아이콘을 바탕화면과 프로그램 메뉴에 등록시킬겁니다.
실행파일 우클릭 > create shortcut to 실행파일

8. 그리고...이름이 마음에 안드니까... 맘에 드는 이름으로 바꿔주세요 전 회사 이니셜을 따서 HW Manager라고 이름을 지었습니다.

9. 그리고 이 녀석을 User's Desktop으로 드래그/드롭 해 주세요. 그러면 바탕화면에 등록되는겁니다.
쉽죠?

10. 그리고 아까 파일등록했던 방식 그대로 아이콘도 하나 등록합니다. 전 간단하게 아이콘을 하나 만들어서 가져왔습니다. 웹상에서 간단하게 아이콘을 만들 수 있거든요(관련 글 아래)


11. 자...이제 그럼 바로가기에 아이콘을 등록합시다. 
1번창:User's Desktop -> 2번창:HW Manager ->3번창 Icon

12. 아이콘을 불러옵니다. Browse해 주세요...캡쳐가 잘못되어서 None에 가 있군요-_-

아까 아이콘을 application folder에 넣어놨잖아요? 그걸 불러오는겁니다.

폴더안으로 찾아가니 아까 추가한 아이콘이 있네요^^
(favicon이라는 이름은...웹상에서 아이콘을 만들었을 때 자동으로 주어지는 이름입니다..;;아아..귀차니즘이여..)

자. 이제 끝났습니다. 빌드하십시오!!!




빌드하고 나면 실행파일이 생깁니다. 그걸 실행하면 자동으로 프로그램이 설치가됩니다.
물론 바탕화면과 프로그램 메뉴에 바로가기가 등록되겠지요

그리고 제어판-> 프로그램 추가/제거 메뉴에 들어가시면 설치한 프로그램이 보입니다.
즉, 삭제하고싶으실 땐 프로그램 추가/제거 하시면 되는겁니다^^







저작자 표시 비영리 변경 금지


VS2008에서 

C# .netframework3.5와

함께 배포하는 법


응용 프로그램과 함께 Setup.exe Bootstrapper 샘플 사용
.NET Framework 3.0

Setup.exe Bootstrapper 샘플에 의해 수행되는 작업은 자동으로 이루어집니다. 그러나 Setup.exe에서 사용자의 응용 프로그램이 사용되도록 하려면 응용 프로그램에 대한 필요 정보가 들어 있는 사용자 정의 Settings.ini 파일을 만들어야 합니다. 또한 설치 프로그램과 함께 응용 프로그램및 Dotnetfx.exe 설치를 위한최소 구성 요구 사항이 포함된 추가 정보 파일을 배포 하는 것이 좋습니다. 다음 항목에서는 Settings.ini 및 추가 정보파일을 만드는 방법에 대해 자세히 설명합니다.

Settings.ini 파일 만들기

설치 프로그램에 대한 추가 정보 파일 만들기

Settings.ini 파일 만들기

Setup.exe Bootstrapper 샘플의 경우 외부 파일인 Settings.ini를 통해 다음이 식별됩니다.,

  • Dotnetfx.exe 및 호스트 응용 프로그램의 위치

  • 확인 대상 .NET Framework 언어 버전

  • Setup.exe 대화 상자에 대한 사용자 정의 문자열

Settings.ini의 기본 위치는 Setup.exe와 같은 폴더입니다. 사용자 응용 프로그램과 함께 Setup.exe Bootstrapper 샘플을 사용할 수 있도록 Settings.ini 파일을 만드는 작업은 사용자가 해야 합니다. Setup.exe Bootstrapper 샘플과 함께 제공되는 Settings.ini 파일을 복사한 다음 응용 프로그램에 대한 정확한 값을 지정하는데 필요한 사항에 따라 파일을 수정할 수 있습니다.

Dotnetfx.exe 및 호스트 응용 프로그램의 위치 지정

Setup.exe Bootstrapper 샘플을 사용하려면 Dotnetfx.exe 및 호스트 .NET Framework 응용 프로그램이 Setup.exe에 등록된 상대적 위치에 있어야 합니다. Setup.exe Bootstrapper 샘플의 경우 외부 파일인 Settings.ini를 통해 Dotnetfx.exe 및 호스 응용 프로그램의 위치가 식별됩니다. 샘플과 함께 제공되는 Settings.ini 파일을 복사한 다음 .NET Framework 호스트 응용 프로그램 및 Dotnetfx.exe가 있는 위치를 가리키도록 파일을 수정할 수 있습니다.

다음 Settings.ini 파일 예제에서는 Setup.exe의 위치에 상대적으로 다양한 위치에 있는 호스트 .NET Framework 응용 프로그램 및 Dotnetfx.exe에 대한 Windows Installer 패키지(.msi 파일)를 가리키는 방법을 보여 줍니다.

다음 예제 Settings.ini 파일에서는 Setup.exe와 같은 폴더에 있는 .NET Framework 응용 프로그램 mySetup.msi와 Dotnetfx.exe에 대한 Windows Installer 패키지를 가리킵니다. 사용자 정의하지 않는 줄은 아포스트로피 " ' "로 주석 처리하였습니다.

[Bootstrap]
Msi=mySetup.msi
'LanguageDirectory=
ProductName= My Application 
'DialogText=
CaptionText=My Application
ErrorCaptionText= My Application Error
FxInstallerPath=c:\myProjectFolder\

다음 예제 Settings.ini 파일에서는 Setup.exe와 별도로 네트워크 공유에 있는 .NET Framework 응용 프로그램 mySetup.msi와 Dotnetfx.exe에 대한 Windows Installer 패키지를 가리킵니다.

[Bootstrap]
Msi=\\myNetworkShare\myProjectFolder\mySetup.msi
'LanguageDirectory=
ProductName=My Application
'DialogText=
CaptionText=My Application
ErrorCaptionText= My Application Error
FxInstallerPath=\\myNetworkShare\myProjectFolder\

다음 예제 Settings.ini 파일에서는 Setup.exe와 같은 컴퓨터의 다른 폴더에 있는 .NET Framework 응용 프로그램 mySetup.msi와 Dotnetfx.exe에 대한 Windows Installer 패키지를 가리킵니다.

[Bootstrap]
Msi=c:\myInstallerFiles\mySetup.msi
'LanguageDirectory=
ProductName= My Application
'DialogText=
CaptionText=My Application
ErrorCaptionText= My Application Error
FxInstallerPath=c:\myExecutables\

다음 예제 Settings.ini 파일에서는 Setup.exe와 같은 CD의 다른 폴더에 있는 .NET Framework 응용 프로그램 mySetup.msi와 Dotnetfx.exe에 대한 Windows Installer 패키지를 가리킵니다.

[Bootstrap]
Msi=myInstallerFiles/mySetup.msi
'LanguageDirectory=
ProductName= My Application
'DialogText=
CaptionText=My Application
ErrorCaptionText= My Application Error
FxInstallerPath=myExecutables/

언어 버전 지정

Setup.exe를 통해 .NET Framework의 빌드 번호 및 언어 버전을 확인하려면 Settings.ini 파일��서 확인하려는 언어의 culture 이름을 지정해야 합니다. culture 이름을 지정하지 않으면 기본적으로 영어 언어 버전이 확인됩니다.

다음 표에서는 사용할 수 있는 언어 버전과 Settings.ini 파일에서 지정하는 해당 culture 이름을 나열합니다. culture 이름은 대/소문자를 구분하지 않습니다.

언어Culture 이름

중국어(간체)

chs

중국어(번체)

cht

프랑스어

fr

독일어

de

이탈리아어

it

일본어

ja

한국어

ko

스페인어

es

다음 예제 Settings.ini 파일에서는 Setup.exe에서 Dotnetfx.exe의 프랑스어 버전이 확인되도록 지정합니다.

[Bootstrap]
Msi=mySetup.msi
LanguageDirectory=fr
ProductName= My Application 
'DialogText=
CaptionText=My Application
ErrorCaptionText= My Application Error
FxInstallerPath=c:\myProjectFolder\

Setup.exe 대화 상자에 대한 문자열 사용자 정의

Settings.ini 파일에서 다음 변수를 수정하여 Setup.exe 대화 상자에 표시되는 문자열을 사용자 정의할 수 있습니다.

  • ProductName은 Setup.exe에 의해 설치되는 .NET Framework 응용 프로그램 이름을 지정합니다. 여기서 지정하는 제품 이름은 Setup.exe를 실행할 때 나타나는 대화 상자에 표시되는 텍스트를 사용자 정의하는데 사용됩니다. 예를 들어, ProductName 값으로 My Application을 지정하면 대화 상자 텍스트는 "To start My Application Setup, click OK. To quit without installing, click Cancel."입니다.

CaptionText 변수를 사용자 정의하지 않으면 Setup.exe를 실행한 뒤 나타나는 대화 상자의 제목 표시줄을 사용자 정의하는 데에도 ProductName이 사용됩니다. 예를 들어 My Application을 ProductName 값으로 지정하면 제목 표시줄에 "My Application Setup"이 표시됩니다. ProductName 및 CaptionText 모두를 사용자 정의하는 경우에는 CaptionText를 사용하여 대화 상자의 제목 표시줄을 사용자 정의합니다.

ProductName은 응용 프로그램 설치가 완료될 때 표시되는 성공 대화 상자의 제목 표시줄을 사용자 정의하는 데에도 사용됩니다. ProductName을 사용자 정의하지 않으면 기본 텍스트인 "Application Setup"이 표시됩니다.

  • DialogText는 Setup.exe를 실행한 뒤 나타나는 대화 상자에 표시되는 사용자 정의 텍스트를 지정합니다. DialogText를 사용자 정의하지 않으면 기본 텍스트인 "To start Application Setup, click OK. To quit without installing, click Cancel."이 표시됩니다.

  • CaptionText는 Setup.exe를 실행한 뒤 나타나는 대화 상자에 표시되는 사용자 정의 텍스트를 지정합니다. CaptionText를 지정하지 않으면 ProductName이 표시됩니다. ProductName도 지정하지 않으면 기본 텍스트인 "Application Setup"이 표시됩니다.

  • ErrorCaptionText는 Setup.exe 오류 대화 상자의 제목 표시줄에 표시될 사용자 정의 텍스트를 지정합니다. ErrorCaptionText를 사용자 정의하지 않으면 기본 텍스트인 "Application Setup Error"가 표시됩니다.

설치 프로그램에 대한 추가 정보 파일 만들기

설치 프로그램을 배포할 때 설치 프로그램을 성공적으로 실행하는데 필요한 컴퓨터의 최소 구성 요구 사항이 나열된 추가 정보 파일을 함께 제공하는 것이 좋습니다. 최소한 설치에 앞서 갖춰야할 요구 사항으로 최소한 Microsoft Windows 98 이상과 Internet Explorer 5.01 이상이 설치되어 있어야 한다고 점을 알려야 합니다. 또한 설치 프로그램에는 필요하지 않지만 데이터 액세스가 포함된 .NET Framework 응용 프로그램에 필요한 것으로 MDAC 2.6 이상을 나열해야 합니다. Dotnetfx.exe 설치에관련된최소구성요구사항에대한자세한내용은최소 구성 요구 사항을참조하십시오.



저작자 표시 비영리 변경 금지



RichTextBox를  이용해서 serial 통신 프로그램을 짜고 있었다.

 

뭐 대단한건 아니었고

 

Virtual Serial Port Emulator를 이용해서 COM1, COM2를 연결해놓고

 

전송된 text를 받아서 확인하는 것이었는데

 

디버깅 오류: "잘못된 크로스 스레드 작업: '컨트롤 이름' 컨트롤이 자신이 만들어진 스레드가 아닌 다른 스레드에서 액세스되었습니다."

 

이따위 오류가 자꾸 보였다

 

MSDN을 뒤져봤다.

 

Windows Forms 응용 프로그램에서 다중 스레딩을 사용할 경우 스레드로부터 안전하게 보호되는 방식으로 컨트롤을 호출하도록 주의해야 합니다. 이 예외는 디버거에 의해 발생하며 런타임 시에는 나타나지 않지만 이 문제가 발견되면 해결하는 것이 좋습니다. 자세한 내용은 방법: 스레드로부터 안전한 방식으로 Windows Forms 컨트롤 호출을 참조하십시오.

 

 

뭐...런타임 시에는 발생하지 않는 에러라고 한다..

 

스레드에 대해서 공부를 해 봐야 할 것 같다.

 

스레드로부터 안전한 방식으로 Windows Forms 컨트롤 호출

http://msdn.microsoft.com/ko-kr/library/ms171728(VS.80).aspx


 

저작자 표시 비영리 변경 금지


C#을 이용한 프로그램을 하나씩 올려보려고 합니다
우선 첫번째로 간단하게 만들 수 있는 스탑워치를 만들어보겠습니다.

완성 프로그램 다운로드


1. 프로젝트 생성하기

File > New > Project 를 선택해서 새로운 프로젝트를 생성합니다.

왼쪽 트리창에서 Visual C#이 선택된 것을 확인하고, Windows를 선택하면 오른쪽에서 windows form appliciation 템플릿을 선택할 수 있습니다.

선택 후 프로젝트 이름과 프로젝트를 생성할 경로를 설정하고 OK를 누르면 프로젝트 생성 끝!


2. 폼 디자인 꾸미기
이제 스탑워치의 시간을 나타낼 부분과 시작/멈춤 버튼을 만들어야 합니다.
Toolbox에서 Lable을 끌어다가 폼에 올려놓습니다.

그리고 이 Lable의 이름을 변경해주어야 하는데요, 기본적으로 Lable1 이라는 이름으로 컨트롤이 생성되는데,  Lable1, Lable2... 이런식으로 컨트롤을 많이 만들면 나중에 헷갈리게되니까...
lable인 경우 lb_목적  TextBox의 경우 tb_목적 과 같은 방식으로(혹은 자기만의 방식으로) 컨트롤의 이름을 생성하면 됩니다.


우선 저는 시간을 나타낼 레이블은 lb_hour 라고 만들었습니다. "분"과 "초"를 나타낼 레이블도 만들어야겠죠? 물론 이름은 lb_min, lb_sec 입니다.
컨트롤의 이름(Name)을 바꾸더라도 컨트롤에 적혀있는 글씨(Text)은 바뀌지 않는데요 이걸 또 바꿔야겠죠?

프로그램을 켰을 때 label1 label2 label3 이라고 나오는 것 보단  스탑워치 답게  0 : 0 : 0 과 같은 식으로 나오면 좋겠죠?


lb_hour를 선택한 다음 properties 창에서 Text값을 찾은 후 아래와 같이 바꿔줍니다
lb_hour.Text : "0"
lb_min.Text : "0"
lb_sec.Text : "0"

그리고 글씨가 좀 컸으면 좋겠군요...font size를 크게 만들고싶군요...
properties창에서 [+]Font 라는 녀석을 찾아서 [+]를 클릭하면 Size가 나옵니다.
그냥 Size는 Label 컨트롤 자체의 크기를 의미하기 때문에 글씨크기는 커지지 않습니다.(영역만 넓어진다는 뜻이지요)

그리고 label을 두 개 더 추가해서 ":" 이 녀석을 나타내주면.....
이제 폼은 이런 모양을 하고있겠죠?
그러니가...여기선...label이 다섯개가 있는거죠?
아..버튼이 어디서 났냐구요?-_-;; 잘 생각해서 버튼도 두 개 추가해주세요
저는 bt_start, bt_stop 이라는 이름으로 버튼을 생성했습니다.

3. 프로그램에 숨불어넣기!
이제 프로그램에 숨을 불어넣을 차례입니다. 스탑워치를 만들려면.. 시간을 측정하는 녀석이 필요하겠군요. 바로 Timer라는 녀석인데요.. ToolBox에서 Timer 라는 녀석을 찾아서 폼에 드래그&드롭합니다.  그러면..폼에 아무것도 안생기죠? 하지만 폼 아래에 보면 스탑워치같이 생긴 녀석 하나가 나타날겁니다.

Timer라는 녀석을 선택해보면 Properties 창에 Timer에 대한 속성이 나오는데요..
우리가 여기서 주목해야 할 것은 Enabled Interval 입니다.
프로그램이 시작하자마자 스톱워치가 동작하는게 아니라, Start 버튼을 누르면 스톱워치가 동작하게 할 거니까... 우선 이녀석은 비활성화시켜야겠군요 그렇다면  Timer1.Enabled = false로 해 두죠.
(제가 아까부터 Timer1.Enabled 라던지..lb_hour.Text 라던지... (.)을 이용해서 속성을 이야기 하는데.. 이는 실제로 나중에 코드를 입력할 때 사용되는 방식입니다. 이따 다시 설명드리겠습니다.)

그리고 Interval이라는 녀석! 이벤트가 발생하는 시간단위를 말하는데요... 우리는 1초에 한 번씩 시간이 바뀌도록 하는 스탑워치를 만들거니까... Timer1.Interval = 1000; 이라고 설정합니다.(1000ms = 1초..가 되는거죠)

자...이제 제대로 코드를 짜볼까요?
폼 아랫부분의 시계모양(timer1)을 더블클릭하면, 1초에 한번씩 어떤 일을 할건지를 명령하는 코드를 입력하게 됩니다.

여기에 아래와 같이 넣어봅시다.

코드를 보면...

lb_sec.Text = (~~~)  --> lb_sec라는 녀석의 Text를 (~~~)로 바꾸어라!라는건 알겠죠?
하지만 우변을 보면 조금 난해합니다...

(Convert.ToInt32(lb_sec.Text) + 1).ToString();

부분 부분 나눠서 보면...

Convert.ToInt32(lb_sec.Text)  >>lb_sec의 Text값(초기값 = 0으로 설정해줬죠?)을 32비트의 정수형으로 변환하여라.  Label에 보여지는 값은 정수형이 아니라 문자열(string)형태입니다.  이 녀석을 1초에 한 번씩 1씩 더하기를 하려면, 정수형으로 변환할 필요가 있겠죠. 그래서 Convert.ToInt32() 라는 녀석을 쓰는 겁니다.

그러면 이제 Label에 들어있던 녀석은 문자열 "0" 에서 정수형 0 으로 바뀌었습니다.

이젠 여기다가 +1 을 해줄 수 있겠죠?

마지막 ToString() 이 의미하는 것은 쉽게 유추가 되죠?  label의 text에는 문자열만 들어갈 수 있는데, 지금 연산한 값은 정수형이니까...이 정수형 값을 다시 문자열로 바꾸는 역할을 해주는 함수입니다.
 
0. lb_sec에 입력된 값(문자열 "0")을 불러온다.
1. 문자열 "0"을 정수형 0으로 변환한다.
2. 변환된 정수형 값 0에 1을 더한다.
3. 1이 더해진 정수형 값을 다시 문자열로 변환한다.
4. lb_sec에 연산된 값을 입력한다.



하지만  프로그램을 실행(F5)해보면.. 아무런 변화가 없는데요...
아까 timer1.Enabled = false; 라고 설정해두었으니...방금 입력한 명령이 실행되지 않는 것입니다.

다시 폼 디자인하는 창으로 넘어가서 시작버튼(bt_start)를 더블클릭 해서 버튼에 명령을 입력합니다.



이제 실행(F5)해서 시작버튼을 눌러보면..1초에 한 번씩 초가 증가하는 것을 알 수 있습니다.

그렇다면...60초가 되면 lb_min이 1씩 증가하고, lb_sec는 다시 0으로 돌아오는 알고리즘을 넣어야겠군요!!
timer1에 입력된 명령을 수정해볼까요?

이제 다시 실행해보면 60초가 되면 lb_sec.Text=0으로, lb_min은 +1씩 증가하는 것을 확인할 수 있습니다.
(1분 기다리지 마시구요...timer1.Interval = 10 정도로 짧게 하시면 0.01초에 한 번씩 1초가 증가하는 걸 확인할 수 있습니다^_^)

그럼 이제 마지막으로... lb_min이 60분이 되면 0으로 바뀌고 한 시간 증가하도록 코드를 짜고 완성시켜보죠!


동작화면 >



저작자 표시 비영리 변경 금지



위 처럼 richTextBox 두 개를 만들어놓고, richTextBox1에 있는 글을 한 줄씩 읽어서 richTextBox2로 옮기도록 하겠습니다.

한 줄씩 읽는 명령어는

richTextBox1.Line[줄번호]
입니다. 쉽죠?

저작자 표시 비영리 변경 금지





일전에(몇 달 전이군요) C#에서 시리얼통신을 하는 방법을 포스팅한 적이 있는데 이번엔 조금 업그레이드된 버젼을 소개할까 합니다.

노트북을 이용해 시리얼통신을 구현하신다거나, 일반데스크탑을 사용하시더라도 USB형태의 시리얼통신(usb-serial converter(PL2303) driver / USB SERIAL 컨버터 드라이버)을 구현하실 경우에 시리얼포트번호가 COM1만이 아니라 COM2, COM3 등등 자꾸 바뀌죠? 그 때마다 장치관리자를 열어서 확인할 수도 없고...

물론 예전에 포스팅했던 자료(2010/03/06 - C#에서 시리얼통신(how to use serial communication in C#)를 사용하면 시리얼포트를 알아서 찾은 후 그 시리얼포트로 바로 연결해버리는데요
이게 문제입니다. 만약에 시리얼포트를 두 개 이상 사용게되더라도 어떤 포트를 연결할 것인지 선택할 수 없다는거죠.

그래서 콤보박스에 활성화된 모든 시리얼포트를 등록시킨 후, 포트번호를 고르면 시리얼통신을 연결하도록 하는 프로그램을 만들어보겠습니다.


1. 우선 아래 그림과 같이 콤보박스를 하나 등록합니다.



2. 폼이 로드될 때(창이 열릴 때 콤보박스에 시리얼포트를 추가해야하므로) 아래와 같이 소스를 넣습니다.

저는 폼 이름을 left_hand 라고 만들었기 때문에 public left_hand()에 추가했습니다. 뭐..그냥 InitializeComponent(); 가 포함된 함수를 찾아서 추가해주시면 폼이 열리는 순간 활성화되어있는 시리얼포트를 자동으로 찾아서 추가시켜 줍니다. 자세한 설명은 예전 포스트를 참고해주세요^^(2010/03/06 - C#에서 시리얼통신(how to use serial communication in C#)

3. 자 이렇게만 하고 실행을 해 보면 콤보박스에 시리얼포트들이 추가되어있는 것을 알 수 있습니다.
(...집에 시리얼포트를 연결하는 녀석이 없군요..;; 사진은 다음기회에!)

4. 이제 콤보박스에서 시리얼포트 번호를 선택하면 자동으로 시리얼포트를 연결하도록 만들어보겠습니다.  아래 그림처럼 툴박스에서 serialPort 컨트롤을 찾아서 폼에 드래그 해 주시면 serialPort1이라는 시리얼통신용 컨트롤이 생성됩니다. 뭐..이 녀석에게는 따로 해 줄 일이 없구요^^;(일단은 신호를 보내기만 할 것이기 때문에..;;)

5. 좀전에 생성했던 컨트롤박스를 더블클릭해서 콤보박스에 변화가 생겼을 때(골랐을 때) 이벤트에 대한 함수를 작성하면 됩니다.
몇 줄 안됩니다.



네...전 컨트롤이름을 잘 바꾸지 않습니다-_-;;;헷갈리지 않을 자신 있음!!!
첫째줄: 추가한 serialPort1이라는 컨트롤에 포트이름을 콤보박스에서 선택한 녀석으로 입력하고
둘째줄: 보레이트를 설정해줍니다(굉장히 중요합니다. 보레이트가 안맞으면 명령을 안먹어요.

그리고 try문에서는 serialPort1을 활성화시킵니다!
catch에서 : 만약에 열지 못했다면? 에러메시지를 출력해주는군요...
(이런경우 거의 없습니다만... 폼을 여는순간에 시리얼포트가 연결되어있다가 포트가 빠진 후에 콤보박스에서 선택을 했다거나... 다른 프로그램에서 사용하고있다거나..하면 에러가 납니다^^)


끝!!

저작자 표시 비영리 변경 금지

DreamSpark!!

MS Visual Studio의 최신버젼인 2010 버젼이 대학생(고등학생은 선생님의 확인이 필요함)을 대상으로 무료로 배포되고있습니다.
http://DreamSpark.com  에서 2008버젼 및 다양한 툴들을 학생들에게 무료로 제공하고있는데요,

MSLive 계정을 만들고, 학생 등록(.edu로 끝나는 대학생임을 증명할 수 있는 이메일이 필요함)을 하면 다운로드할 수 있습니다.

학생등록을 하려면 ------------->> click

더보기





로그인을 하면 DreamSpark 홈페이지에 들어가면 아래와 같은 프로그램 목록을 보실 수 있습니다.
VisualStudio 2010을 클릭하시구요~!

아직 로그인을 안했다면 아래와 같이 Sign In 버튼만 활성화되어있겠죠?
학생등록을 안했다면 Verify 버튼이 활성화될겁니다(..아마도?)

로그인을 하고나면? 다운로드는 알아서 하실 수 있겠죠?


저작자 표시 비영리 변경 금지



시리얼 포트에 수신된 바이트를 읽어오는 방법은 굉장히 간단하다

richTextBox2.Text += string.Format("{0:x}", serialPort1.ReadByte());  
richTextBox에 이런식으로 넣으면 확인할 수 있다.

하지만 이 명령어를 아무 곳에다가 넣었다가는 프로그램이 멈춰버리는 현상이 일어난다.

이는, ReadByte()라는 명령어의 특성 때문인데, ReadByte()는 수신된 데이터가 있으면 이를 읽어오지만, 수신된 데이터가 없으면 수신될 때까지 기다리는 녀석이다.
때문에, 시리얼포트로 데이터가 수신돼었다는 것을 확신할 수 있을 때만 사용해야한다.

그럼 언제 데이터수신을 확신할 수 있느냐?


바로 DataRecieved()라는 녀석이다.


시리얼포트에 데이터가 수신되면 호출되는 함수이기때문에, 이 녀석을 이용하면 데이터가 수신되는 것을 확인할 수 있다.


하지만 DataRecieved()는 데이터가 수신되는 순간 호출되기 때문에 내가 원하는 시간에 이 함수를 호출할 수는 없다.

그렇다면, 시리얼포트로 어떠한 데이터가 수신되었고 이 후에 원하는 어떤 시간에 내가 원하는 명령을 줄 순 없을까?
다시말해,

1초에 한 번씩 어떤 함수를 호출해야하는데, 조건이 시리얼포트로 데이터가 수신되었을 때만 호출하는 것이다.
즉, 1초에 한번씩 Count하는데, 시리얼포트에 데이터가 수신되었을 때만 Count를 두 개씩 올려야한다면?


private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            serial1_flag = true;
        }


이와 같이 serial1_flag라는 BOOL타입의 변수를 전역변수로 지정한 다음, DataReceived가 호출되면 이 녀석을 true로 만든다.

그리고 1초에 한 번씩 tick이 걸리는 타이머에서 
if(serial1_flag)
{
do sth you want();
serial1_flag = false;
}


이러면 해결할 수 있다.
저작자 표시 비영리 변경 금지