2011년 01월 26일
Unsigned char -> 유니코드CString
#include <afxconv.h>
USES_CONVERSION;
CString strTemp;
strTemp = A2W( (char*)cData );
# by | 2011/01/26 23:31 | VC++ | 트랙백 | 덧글(0)
#include <afxconv.h>
USES_CONVERSION;
CString strTemp;
strTemp = A2W( (char*)cData );
# by | 2011/01/26 23:31 | VC++ | 트랙백 | 덧글(0)
# by | 2011/01/21 14:29 | ANDROID | 트랙백 | 덧글(0)
UNICODE
UCS(Universal Code System)
ISO/IEC 10646-1(Universal Multiple-Octet Coded Character Set)
■ Unicode란?
- 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 제안된 국제적인 문자코드규약
- 사용 중인 플랫폼, 프로그램, 언어에 관계없이 문자마다 고유한 숫자를 제공한다
■ 유래
- 미국에서는 32부터 127까지의 숫자를 이용하는 ASCII코드가 있었다. 공간(NULL, BS, CR, …)이 32개였고 “A”는 65번이었다. 이 아스키코드는 7비트로 저장이 되는데, 당시 대부분의 컴퓨터는 8비트를 이용하고 있었기에 모든 ASCII코드를 저장할 수 있었을 뿐만 아니라 남는 부분도 있었다.
- 물론 영어만 사용한다면 충분하겠지만 바이트는 8비트로 이루어졌기 때문에, 대부분의 사람들이 ‘128~255’는 그들 나름대로 점유해버렸다. IBM-PC는 OEM Character Set을 가졌고, 다른 나라들은 서로 다른 Character Set 을 가지고 되어서 당시에는 문서교환을 신뢰하기 힘들었다.
- 게다가 아시아의 문자들은 개수만 수만가지가 넘기 때문에 8비트로 도저히 처리할 수가 없었다. 아시아 문자에 대해서는 DBCS(Doucle Byte Character Set)라는 복잡한 시스템이 해결을 한다. 1바이트에 저장하는 문자도 있지만 2바이트에 저장하는 문자도 있었다. 문자열의 바뀜이 빈번해 질수록 혼란감이 가중됐다. 이 때 유니코드가 탄생한다.
- Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys 및 기타 여러회사에서 유니코드를 채택하였다
■ 역사
- 1884 : ISO TC97/SC2 동경회의서 국제 문자코드의 표준화 추진을 위한 Working Group 구성
- 1986 : TC97의 후신인 JTC1에서 각 국에 판(plane) 할당
- 1989 : 요르단 암만회의에서 한중일 한자어에 대한 통합 논의
- 1990 : 한자 통함을 위한 CJK-JRG 구성, 한글 2350자를 기본 다국어 문자판(BMP)에 수록
- 1991 : 유니코드 1.0 ― 프랑스 르노회의에서 미국 유니코드안을 수용, 대폭적인 구조 수정
각 국의 문자판에 관한 논의 배제, KSC-5657의 한글 추가, 한중일 통합한자 수록
- 1992 : 서울회의에서 구조 변경 확정,
한글 완성자 및 새로운 방식의 조합형 한글 구현 방식 추가
옛 한글 완성자(1673자) 삭제
- 1993 : 유니코드 1.1 ― 그리스 아테네 회의에서 최종 확정
- 1996 : 유니코드 2.0 ― 11172자의 모든 현대 한글이 포함되었다.
- 1998 : 유니코드 2.1
- 2000 : 유니코드 3.0
- 2001 : 유니코드 3.1 ― 보충언어판이 처음으로 소개되었다.
- 2002 : 유니코드 3.2
- 2003 : 유니코드 4.0
- 2005 : 유니코드 4.1
- 2006 : 유니코드 5.0
■ 유니코드 인코딩
- UCS-2 : ISO/IEC 10646의 용어로 5,536코드를 정의하며, 2바이트로 표현된다.
1개의 언어판, BMP만이 이에 해당된다.
- UCS-4 : ISO/IEC 10646의 용어로 4바이트로 표현된다.
모두 128개의 언어판 그룹(128*256)
- UTF-7 : 메일 시스템을 통한 전송을 위해 7bits ASCII로 변경, 1bit는 부호코드
- UTF-8 : 사이즈를 줄이기 위해 영문은 1byte 다른 언어는 2bytes 이상으로 표현
- UTF-16 : 16비트, 2바이트를 사용하여 모든 언어의 character code를 표현 (UCS-2와 거의 동일)
- UTF-32 : 32비트, 4바이트로 모든 유니코드 문자를 표현한다.
■ 일반 Unicode 와 UTF-8 Unicode
- 일반 유니코드
: 모든 글자를 2Bytes로 표현한다.
: 전 세계 모든 글자들을 한꺼번에 표현할 수 있다.
: 인터넷에 HTML파일로 올릴 수 없다.
- UTF-8 유니코드
: 영문/숫자/기호는 1Byte로, 한글과 한자 등은 3Bytes로 표현합니다.
: 전 세계 모든 글자들을 한꺼번에 표현할 수 있다.
: 웹 페이지 작성에 사용할 수 있다.
: 가변 길이므로 영어,유럽어 저장시 공간을 덜 차지한다
■ 한글 텍스트 문서를 유니코드로 변환하기
- 이엠에디터(EmEditor)
: 저장 시 Encoding을 Unicode나 UTF-8로 지정한 후 “저장”
- 메모장(Notepad)
: 저장 시 Encoding을 Unicode나 UTF-8로 지정한 후 “저장”
- 울트라에디트(Ultraedit)
: 메뉴의 File-Conversions(변환) 에서 ASCII To Unicode 혹은 ASCII To UTF-8을 선택
■ UNICODE 관련 API
- Windows Data Types for Strings
// Generic types
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef unsigned char TCHAR;
#endif
typedef TCHAR * LPTSTR, *LPTCH;
// 8-bit character specific
typedef unsigned char CHAR;
typedef CHAR *LPSTR, *LPCH;
// Unicode specific (wide characters)
typedef unsigned wchar_t WCHAR;
typedef WCHAR *LPWSTR, *LPWCH;
- Conventions for Functions
BOOL SetWindowText(
HWND hwnd,
LPCTSTR lpText
);
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
// Windows (ANSI) Prototype
BOOL SetWindowTextA(
HWND hwnd,
LPCSTR lpText
);
// Unicode Prototype
BOOL SetWindowTextW(
HWND hwnd,
LPCWSTR lpText
);
- Unicode and Character Set Functions
Return | Function | Description |
int | GetTextCharset | HDC 현재 글의 Character set을 가져온다 |
Int | GetTextCharsetInfo | HDC 현재 선택된 문자의 Character set을 가져온다 |
BOOL | IsDBCSLeadByte | 지정된 문자가 Lead Byte 인지 알아본다 |
BOOL | IsDBCSLeadByteEx | 해당 Code Page를 사용하여 지정된 문자가 Lead Byte 인지 알아본다 |
BOOL | IsTextUnicode | Buffer 가 Unicode형식과의 유사한지 구분한다 |
int | MultiBYteToWideChar | MultiByte를 Unicode로 변환한다 |
BOOL | TranslateCharsetInfo | |
int | WideCharToMultiByte | Unicode를 MultiByte로 변환한다 |
- 문자열 조작 함수
일반 함수명 | T타입 함수명 | 기능 |
strcpy | wcscpy | 문자열 복사 |
strncpy | wcsncpy | 특정 길이 문자열 복사 |
strcat | wcscat | 문자열 추가 |
strstr | wcsstr | 문자열 검색 |
strchr | wcschr | 문자 검색 |
strrchr | wcsrchr | 역순 문자 검색 |
strcmp | wcscmp | 문자열 비교 |
stricmp | _wcsicmp | 대소문자 구분 없이 문자열 비교 |
mkdir | _wmkdir | 디렉터리 생성 |
fopen | _wfopen | 파일 열기 |
참고
MSDN http://msdn.microsoft.com/
조엘 온 소프트웨어 http://www.joelonsoftware.com/
MonoStyle http://tong.nate.com/pktoto/
유니코드 페이지 http://www.kristalinfo.com/K-Lab/unicode/unicode-kr.html/
그 외 다수
# by | 2010/11/03 23:22 | VC++ | 트랙백 | 덧글(0)
1) 변수 선언
- char나 short int를 쓸 수 없어서 매크로를 만들어 놨다. : TCHAR 이러면 상황에 따라서 두 가지로 컴파일이 된다. 유니코드는 short int로, ansi는 char로 컴파일이 된다. 그러므로 앞으로는 TCHAR을 쓰는 게 좋다. 윈도우 CE에서 작업할 때 기존의 소스를 포팅하려면 char를 전부 수정해줘야 하는 문제가 생긴다. - 포인터 변수일 경우는 (정수는 문제가 되지 않기 때문에 char *를 말한다) TCHAR*로 써줘야 한다. 그래서 이것도 다음과 같이 매크로로 만들어 놓았다. - LPCTSTR : 상수형이다. c가 있으면 TCHAR* 상수형이다 - LPTSTR : TCHAR* 버퍼형이다. 즉 배열을 잡아서 써야한다. 그렇지만 LPCTSTR은 상수형이므로 바로 "HOWON"과 같이 쓸 수 있다. -LPCSTR, LPSTR : 이것들은 T가 없으므로 여전히 char*로만 컴파일이 된다. 그래서 쓰지 않는다.2) 상수 선언
- 문자열 상수 " "를 말한다. "abc"면 \0까지 포함해서 4byte인데 이걸 유니코드에서 컴파일하면 여전히 4바이트이다. 그래서 유니코드 상수로 하여 L"abc"로 하면 8바이트가 된다. 그러나 이렇게 하면 지금 당장 컴파일이 안되므로 역시 매크로를 만들어 왔다. - _T, TEXT : _T("abc") 이렇게 쓰면 컴파일될 때 현재 상황은 "abc"가 되고 유니코드로 컴파일하면 L"abc"가 된다. TEXT는 API용이고 _T는 MFC용이다.3. 함수사용
- strcpy는 char*를 인자로 받는다. 그래서 유니코드에서는 이 함수를 쓰지 못한다. 그래서 유니코드용 문자열 복사 함수를 만들어 놓았다. wcscpy(short int* ) 그런데 지금 코딩할 때는 이걸 쓸 수 없으므로 역시 매크로를 만들어 놓았다. : _tcscpy 이 함수는 지금 컴파일 하면 strcpy가 되고 나중에는 wcscpy가 된다. strcat, strlen등도 마찬가지이다. 즉, _tcslen, _tcscpy 이렇게 _tcs만 앞에 붙인다. 그런데 atoi함수같은 경우는 _ttoi, sprintf는 _stprintf이다. 즉 간혹 두 번 째에 t가 나올 경우가 있다. - MSDN찾는 방법 strcpy : 위는 ansi, 두번째는 유니코드용, 밑에 TCHAR Routine에 _tcscpy가 나온다. - API에 CreateWindow가 있다면 CreateWindowA는 ANSI용이고 CreateWindowW는 유니코드용이다. 이렇게 두개 함수가 있으므로 그냥 사용하면 된다. - PTSTR과 LPTSTR은 같은 의미이다. 윈3.1때는 포인터에 NearPointer 2바이트가 있었고, 4바이트짜리 포인터가 있었다. 그래서 long형이 아닌 걸 만들어 놓았다. 지금은 세그먼트가 없으므로 LPCTSTR이나 PCTSTR차이가 없다. 그래서 PTSTR은 사용하지 않는다. - char temp sz[100]; for(i = 0; i♣ 윈도우 문자열 함수
# by | 2010/11/03 23:16 | VC++ | 트랙백 | 덧글(0)
| 유니코드에 대비한 프로그램을 작성하는 여섯가지 원칙 |
MBCS는 한 문자를 표현하는데 여러 바이트를 사용하는 것을 말한다. 일반적인 영문자의 경우 모두 한 바이트로 표시되지만, 한글과 같은 경우에는 두 바이트를 사용한다. 또한 두 바이트를 사용하더라도 인코딩 규칙에 따라서 서로 다른 두 바이트가 생성된다. 따라서 인코딩 규칙이 맞지 않는 경우에는 제대로 된 문서를 읽을 수 없는 불편함이 있다. 이러한 불편함을 해결하기 위해서 나온 것이 유니코드다. 유니코드에 대해선 이미 많은 문서에서 소개가 되었기 때문에 별도로 설명하진 않겠다. 혹시 좀 더 자세한 내용이 궁금하다면 http://www.jinsuk.pe.kr/Unicode/Unicode_intro-kr.html를 방문해 보도록 하자.
Windows NT에 기반한 운영체제의 경우 커널 코드가 유니코드를 통해서 작성 되었다. 문자열을 입력 받는 API의 경우 유니코드 버전이 기본적으로 사용된다. 만약 MBCS 버전의 API를 호출한다면 내부적으로 MBCS문자열을 유니코드로 변경한 후에 다시 유니코드 버전의 API를 호출하게 된다. 따라서 MBCS 버전의 프로그램을 작성하는 것은 NT 기반의 운영체제에서는 비효율 적이다. 이러한 점 때문에 최근에는 대부분의 업체에서 NT 기반의 프로그램은 유니코드 버전을 출시하고 있다. 유니코드와 MBCS 빌드에 상관없이 유연하게 컴파일 되는 프로그램을 만들기 위해서 지켜야할 여섯 가지 기본 원칙에 대해서 알아보자.
첫째, 문자열 타입은 T형을 쓴다. T형의 경우 유니코드, MBCS 빌드에 상관없이 적절한 타입으로 변환되기 때문에 빌드가 변경된다고 해서 따로 타입을 수정해 주는 불편함이 없다. char를 사용할 장소에 TCHAR를, char *를 사용해야 한다면 LPTSTR을, const char *을 사용해야 한다면 LPCTSTR을 사용하도록 한다.
둘째, 문자열 리터럴은 항상 TEXT 매크로로 묶어 둔다. 문자열 리터럴은 프로그램 내에서 사용되는 문자열 상수를 의미한다. 그런데 이러한 문자열 상수의 경우 유니코드 빌드에선 앞에 L을 붙여서 wchar_t형이 되어야 한다. 즉, 보통의 경우엔 "%s\n"과 같이 사용하면 되지만, 유니코드 빌드에선 L"%s\n"로 변경해 주어야 한다. 이러한 작업을 일일이 빌드가 바뀔 때 마다 해주는 것은 매우 번거롭고 오류가 많이 나는 일이다. 이러한 작업을 도와주는 것이 TEXT 매크로다. 위에 언급된 문자열 상수의 경우에도 TEXT("%s\n")과 같이 사용하면 MBCS 빌드에선 "%s\n"이, 유니코드 빌드에선 L"%s\n"이 된다. 매크로가 알아서 처리해 준다. 따라서 문자열 리터럴은 항상 TEXT 매크로로 묶어주도록 하자.
셋째, CRT 문자열 함수는 T타입 함수를 사용한다. T형과 마찬가지로 이러한 함수들은 빌드에 따라 적절한 인자를 입력으로 받는다. 예를 들자면 문자열을 복사하는 strcpy에 대응하는 함수로는 _tcscpy가 있다. _tcscpy는 유니코드 빌드에선 인자를 wchar_t로 받고, MBCS빌드에선 인자를 char로 받는다. 따라서 _tcscpy를 사용하고 인자를 T형을 사용한다면 빌드가 변경된다고 해서 직접 수정해야 하는 부분이 없다. 아래 표에는 일반적으로 자주 사용하는 문자열 함수들과 거기에 대한 T타입 함수를 표시해 두었다. 표를 살펴보면 알겠지만 변환 규칙은 무척 간단하다. str로 시작하는 함수는 _tcs로 치환 하면 되고, 그렇지 않은 함수들은 앞에 _t를 붙이면 된다. 물론 그렇지 않은 함수들도 일부 있다. 그러한 함수들은 MSDN을 이용하면 손쉽게 T타입 함수명을 알 수 있다.
| 일반 함수명 | T타입 함수명 | 기능 |
| strcpy | _tcscpy | 문자열 복사 |
| strncpy | _tcsncpy | 특정 길이 문자열 복사 |
| strcat | _tcscat | 문자열 추가 |
| strstr | _tcsstr | 문자열 검색 |
| strchr | _tcschr | 문자 검색 |
| strrchr | _tcsrchr | 역순 문자 검색 |
| strcmp | _tcscmp | 문자열 비교 |
| stricmp | _tcsicmp | 대소문자 구분 없이 문자열 비교 |
| mkdir | _tmkdir | 디렉터리 생성 |
| fopen | _tfopen | 파일 열기 |
넷째, 길이와 크기를 구분한다. 문자열에는 길이와 크기가 있다. MBCS 빌드에서 기본적인 문자 단위로 사용되는 char형의 경우 그 크기가 1바이트 이기 때문에 크기와 길이가 동등한 의미를 가진다. 이러한 이유로 기존의 MBCS 빌드에서 사용하던 많은 코드가 크기와 길이를 정확하게 구분하지 않고 혼용해서 사용하고 있다. 하지만 유니코드 환경으로 넘어오면 크기와 길이는 항상 달라진다. 따라서 함수의 인자가 길이와 크기 중 어떠한 것을 요구하는지 판단해서 정확하게 사용하도록 해야 한다.
다섯째, std::string을 사용하는 경우다. std::string의 경우 ANSI 문자열을 표현하도록 선언된 클래스다. 유니코드 문자열을 표현하는데 사용할 수 있는 타입으로 std::wstring이 있다. 이 둘을 빌드 타입이 변경될 때 마다 바꿔줘야 하는 것은 번거로운 일이다. 이쯤되면 std::tstring이 없는지 궁금해 질 것이다. 하지만 std::tstring은 없다. 없으면 우리가 만들어야 한다. std::string의 경우 std::basic_string<char>로 선언된 것이고, std::wstring의 경우 std::basic_string<wchar_t>로 선언된 것이다. 따라서 우리는 아래와 같이 std::tstring을 정의할 수 있다.
| 1 | namespace std { typedef basic_string<TCHAR> tstring; } |
| tstring; } " originalCode="namespace std { typedef basic_string tstring; } ">view plain | print | copy to clipboard | ? |
namespace std { typedef basic_string<TCHAR> tstring; }
마지막으로 일부 함수나 메시지 인자의 경우 반드시 char나, wchar_t로 취급해야 하는 경우가 있다. 이러한 경우 부득이하게 빌드에 따라서 문자열을 변환해서 사용해야 하며 빌드가 변경되면 반드시 코드를 수정해야 한다. 따라서 처음 작성시에 안전하게 두 가지 빌드로된 버전을 모두 작성해 놓거나 아니면 다른 빌드에서 컴파일 할 경우 에러가 나도록 처리해 두면 편리하다. 아래와 같은 전처리기를 사용하면 쉽게 작성할 수 있다. 유니코드 빌드에선 _UNICODE가 선언된다는 점을 기억해 두자.
| 1 | #ifdef _UNICODE |
| 2 | // 유니코드 빌드에서 수행할 내용 |
| 3 | #else |
| 4 | // MBCS 빌드에서 수행할 내용 |
| 5 | #endif |
| view plain | print | copy to clipboard | ? |
#ifdef _UNICODE // 유니코드 빌드에서 수행할 내용 #else // MBCS 빌드에서 수행할 내용 #endif
만약 현재 프로그램이 MBCS 기반이고 유니코드 부분을 지금은 신경 쓰지 않아도 된다면 #error 전처리기를 사용하면 된다. 이렇게 하면 유니코드로 빌드 할 경우 컴파일 오류가 발생하기 때문에 어떤 부분이 수정되어야 하는지 바로 찾을 수 있기 때문에 편리하다.
| 1 | #ifdef _UNICODE |
| 2 | // 유니코드 부분은 작성 필요 |
| 3 | #error 이 프로그램은 유니코드 빌드로 컴파일되지 않습니다. |
| 4 | #else |
| 5 | // MBCS 빌드에서 수행할 내용 |
| 6 | #endif [출처] 유니코드에 대비한 프로그램을 작성하는 여섯가지 원칙 |작성자 찬란한빛 |
# by | 2010/11/03 23:08 | VC++ | 트랙백 | 덧글(0)
(1) Unicode text와 문자열
Windows 98 API는 부분적으로 유니코드 문자열을 지원하였다. Windows 2000과 NT API는 유니코드와 ANSI 문자열을 지원한다. 그러나 Windows CE는 Unicode만 지원한다.
MBCS : Multi-Byte Character String. 특수문자 다음에 나오는 문자는 서로 다른 문자체계의 문자임을 알려 주는 구분자로 사용.
Unicode : Wide byte character 방식. ANSI 문자의 경우 상위 바이트는 NULL이 되며, 압축 알고리즘에서는 이 반복적으로 발생되는 NULL을 최적화한다.
(2) 일반 문자열과 문자 데이터
유니코드 데이터 형인 wchar_t를 사용할 수도 있으나, tchar.h를 include 시키고, TCHAR 데이터형을 사용하여 definition에 따라 char나 wchar_t형으로 적절히 변환할 수 있다.
#define _UNICODE // TCHAR을 wchar_t 형으로 대치
#define _MBCS // TCHAR을 char 형으로 대치
문자열 포인터는 LPSTR 데이터형 대신 LPTSTR 데이터형을 사용하여 definition에 따라 char *나 wchar_t * 형으로 적절히 변환할 수 있다.
(3) 상수문자열
LPTSTR lpszStr = "My string"; // 문자열을 ANSI 문자열로 간주,
// 데이터형 불일치로 에러 발생
LPTSTR lpszStr = _T("My string"); // _UNICODE가 정의되어 있으면 _T()는 유니코드
// 문자열 상수로 변환하고, _MBCS가 정의되어 있으면
// ANSI 문자열 상수로 변환한다.
LPTSTR lpszStr = TEXT("My string"); // 상동
LPWSTR lpszStr = L("My string"); // 유니코트 문자열로 지정하는 매크로 함수 L()
(4) 문자열 버퍼 길이 계산
#define _UNICODE
TCHAR szBuffer[200]; // szBuffer의 크기는 400 bytes
DWORD dwlen;
dwlen = sizeof(szBuffer); // 400 bytes
dwlen = sizeof(szBuffer) / sizeof(TCHAR); // 실제 저장 가능한 유니코드 문자 개수는 200개
(5) 표준 문자열 라이브러리 함수
표준 C 런타임 함수 strlen()에 해당하는 유니코드 함수는 wcslen()이지만, _tcslen()을 사용하면 definition 정의에 따라 컴파일시에 적절히 변환된다.
기능 ANSI 함수 유니코드 함수 일반 문자열 함수
================================ ============ ============= ==================
문자열의 길이를 반환하는 함수 strlen() wcslen() _tcslen()
두 문자열을 접합하는 함수 strcat() wcscat() _tcscat()
문자열에서 문자를 찾는 함수 strchr() wcschr() _tcschr()
두 문자열을 비교하는 함수 strcmp() wcscmp() _tcscmp()
문자열을 복사하는 함수 strcpy() wcscpy() _tcscpy()
부분 문자열을 찾는 함수 strstr() wcsstr() _tcsstr()
문자열을 역순으로 저장하는 함수 strrev() _wcsrev() _tcsrev()
================================ ============ ============= ==================
(6) ANSI 문자열과 Unicode 문자열 간의 변환
mbstowcs(WCHAR *des, char *src, int BufferSize) :
Multi-Byte String을 Wide Character String(유니코드)으로 변환.
wcstombs(char *des, WCHAR *src, int BufferSize) :
# by | 2010/11/03 23:03 | VC++ | 트랙백 | 덧글(0)

# by | 2010/08/05 19:57 | AVR ATmega | 트랙백 | 덧글(0)
Serial To Analog Convertor Module Manual

● 개 요
● 사 양
-12-Bit Resolution
-5V Operation
-Input Data : 3Wire Cascadable Serial Interface
-Output Voltage : 0~2.5V
● 적용분야
-Digital Calibration
-Industrial Process Control
-Automatic Test Equiment
-Sensor Network
소비자가 : 60,000 원
문의 : 에너바이오텍 (TEL:031-908-4616)
DATASHEET
Serial_To_Analog_Convertor_Module_Manual.pdf (한글)
Serial_To_Analog_Convertor_Module_Manual(English).pdf (영문)
# by | 2010/06/30 13:50 | AVR ATmega | 트랙백 | 덧글(0)
먼지센서(NIDS)


nAver = nSum / 300;
printf("[AV[%d ms] : %d %%]\r\n", nSum, nAver);
}
# by | 2010/06/24 10:14 | AVR ATmega | 트랙백 | 핑백(3) | 덧글(0)
Zigbee무선모뎀을 이용하여 무선으로 온습도를 수신하고
이를 Segment에 표시함
# by | 2010/05/04 09:39 | AVR ATmega | 트랙백 | 덧글(0)
◀ 이전 페이지 다음 페이지 ▶