MAX3232CUE +T DATASHEET
'Datasheet > 모듈' 카테고리의 다른 글
음성칩 ap8942 Datasheet (0) | 2009.10.06 |
---|---|
음성칩 ap89042 Datasheet (0) | 2009.10.06 |
MAX4454 DATASHEET (0) | 2009.09.16 |
TW8806 DATASHEET (0) | 2009.08.23 |
LM2576-D / LM2576-5.0 (0) | 2009.08.21 |
음성칩 ap8942 Datasheet (0) | 2009.10.06 |
---|---|
음성칩 ap89042 Datasheet (0) | 2009.10.06 |
MAX4454 DATASHEET (0) | 2009.09.16 |
TW8806 DATASHEET (0) | 2009.08.23 |
LM2576-D / LM2576-5.0 (0) | 2009.08.21 |
음성칩 ap89042 Datasheet (0) | 2009.10.06 |
---|---|
MAX3232CUE +T DATASHEET (0) | 2009.09.16 |
TW8806 DATASHEET (0) | 2009.08.23 |
LM2576-D / LM2576-5.0 (0) | 2009.08.21 |
LM7805 CT Datasheet (0) | 2009.08.08 |
항상 avr만을 하다 2440임베디드 리눅스 프로젝트에 참여하게 되었습니다.
제가 맡은 분야는 웹서버 및 OLED 디바이스 드라이버 부분 입니다.
여기서는 웹서버 포팅 후 사용자 인증 시스템 제작에 관한 부분 입니다.
펌웨어만을 하다가 cgi 라는 서버사이드프로그램은 처음 만져보아 막막하였습니다.;;
html 이야 기본은 알고 있었지만 cgi 라 하여 생소하였습니다.
임베디드 리눅스 상에 perl 이나 php asp 와 같은 서버사이드프로그램들은 대부분 포팅되어 있지 않아
어쩔수 없이 apache 기반에 cgi를 사용하게 되었습니다.
몇몇의 사이트 검색 결과 boa webserver 에 php를 붙여 사용하신다는 분도 kelp 에서 본 기억이 있긴 합니다만 열악한 환경상의 임베디드 기반 시스템에 db 및 php 스크립트와 같은 덩치큰(?) 프로그램을 사용하기엔 힘이 듭니다;;
리눅스 상의 cgi 는 c를 기반으로 프로그래밍 하게 됩니다.
컴파일 역시 arm linux gcc를 이용하여 하게 됩니다.
================
2009년 2월 9일 추가
================
웹서버로 apache 를 선택하였습니다.
그 이유는 쉬운 포팅과 cgi의 기본 지원을 들 수 있습니다. 물론 gohead webserver 와 자주 사용되는 boa webserver 도 있지만 대중적으로 사용되는 apache webserver에 한표를 두었습니다.
webserver porting을 마친 후 바로 cgi 프로그래밍에 들어갔습니다.
우선 apache의 환경 설정 부분에서 cgi- script를 사용 가능하도록 수정 후 index.html 을 제작하여
로그인 부분 ui를 꾸몄습니다.
그 후 폼으로부터 입력된 id와 password 를 파싱하는 login.cgi 를 제작하였습니다.
로그인 될 아이디와 패스워드는 임베디드보드 안에 따로 디비를 두기에 공간이 충분치 않아 account.dat 파일을
제작하여 보관하도록 하였습니다. 다음 부분은 로그인 부분의 소스 입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000 //login retry
#define RNUM 30 //retry number
#define TRUE 1
#define FALSE 0
int main(int argc, char *argv[])
{
FILE *fp;
int fd; //file description
int i;
int index = 0;
int len1, len2, len;
char std[10][16];
char *tmp;
char *id;
char *password;
char *buf;
char *str1, *str2;
printf("Content-type:text/html\n\n");
len = atoi(getenv("CONTENT_LENGTH"));
str1 = (char*)malloc(20);
str2 = (char*)malloc(20);
buf = (char*)malloc(len);
int tryNum =RNUM;
int lFlag=0;
fread(buf, 1, len, stdin);
int ab = 0;
//printf("len=%d<br>", len);
//printf("buf=%s<br>", buf);
tmp = (char*)strtok(buf, "&=");
str1 = (char*)strtok(NULL, "&=");
tmp = (char*)strtok(NULL, "&=");
str2 = (char*)strtok(NULL, "&=");
printf("ID : %s<br>", str1);
printf("PW : %s<br>", str2);
printf("<html><head>PLANETINT LOGIN SYSTEM</head>");
printf("<body>");
fp = fopen("../account.dat", "rt");
if(fp == NULL) {
printf("<h2>DB ERROR</h2>\n");
return;
}
while(feof(fp) == 0)
{
fscanf(fp,"%s", &std[index][0]);
// printf("<h2>account info %s</h2>", std[index]);
index++;
}
index=0;
while(tryNum > 0)
{
if(!strcmp(str1,std[index]) && !strcmp(str2,std[index+1]))
{
printf("<h2> login success </h2>");
lFlag = TRUE;
printf("<h2>account id info %s</h2>", std[index]);
printf("<script language=\"javascript\">\n");
printf("location.href=\"../index.html\"\n");
printf("</script>\n");
break;
}
else
{
printf("<h2>tryNum: %d</h2>", tryNum);
tryNum--;
lFlag = FALSE;
index++;
printf("<h2>account pw info %s</h2>", std[index]);
}
}
if(!lFlag)
{
printf("<h2> login false </h2>");
}
printf("</body></html>");
fclose(fp);
}
소스를 보면 아시겠지만 폼으로부터 전달되는 아이디와 패스워드를 파싱하여 str1 / str2 에 저장한 후
어카운트 파일을 모두 읽어와 저장한 부분과 매치되는지 반복문을 이용하여 전체 탐색하도록 한 부분 입니다.
중간 중간 디버깅을 위한 printf문이 들어가 있네요 ㅎㅎ 로그인 완료시 자바스크립을 이용하여 다른창으로 이동하도록 location 을 넣었습니다.
로그인 소스를 살펴보시면 아시다시피 버그가 눈에 뛸 것 입니다 ㅎㅎㅎ
이부분은 차 후 어드민 로그인 단 한계정만을 사용할 것이기에 귀찮아서 수정하지 않을꺼랍니다 ㅡㅡ;;;
LN2440SBC 메모리 맵 (0) | 2009.11.10 |
---|---|
리눅스 시리얼 프로그래밍 예제 (0) | 2009.11.10 |
RTC 없이 보드 시간 동기화 (0) | 2009.11.10 |
패킷 교환 네트워크에서의 지연과 손실 (0) | 2009.11.10 |
임베디드 보드 Web을 이용한 네트워크 설정 기능 구현하기 (0) | 2009.09.10 |
앞서 사용자 인증 부분에 대하여 제작을 하였습니다.
풀 소스 공개는 차후 정리가 되는 대로 올리도록 하겠습니다.
여기서는 리눅스 보드에 web을 이용한 네트워크 설정 기능을 만들어 보도록 하겠습니다.
우리가 실생활에서 많이 사용되는 공유기를 보면 대부분 192.168.0.1 이런식으로 접속하여 사용자 인증 을 한 후 공유기 설정을 건드릴 수 있었습니다.
dhcp 기능을 활성화 시킨다던지 고정아이피 세팅을 한다던지 vlan 을 설정한다던지 이런식으로 말이지요.
여기서 제가 구현하고자 하는 기능은 간단히 cgi webserver를 이용한 아이피 및 서브넷 설정 게이트웨이 설정 등의 부분 입니다. 제가 시간이 많지 않은 관계로 짬이 날때마다 글을 이어 올리도록 하겠습니다.
일단 제가 생각하는 webserver를 이용한 아이피 설정의 기능 구현은 이런 형식으로 할 생각합니다.
사용자로부터 입력을 받을 폼을 만듭니다. ip 나 sebnet gateway 등의 정보를 입력 받을 수 있으며 리눅스 보드로 부터 현재 설정되어 있는 네트워크 정보를 받아 폼에 표시를 해 줍니다.
사용자로부터 새로운 아이피 및 여타 변경된 네트워크 정보를 받아 submit 버튼을 통하여 cgi 로 넘어온 정보를 파싱하여 제가 만든 배열에 정보를 담아 놓습니다.
그 후 현재 변경하고자 하는 부분의 이더넷 링크를 다운 시킨 후 새로운 네트워크 정보를 입력하여 다시 업링크 시켜 줍니다. 다시 사용자에게 변경된 정보를 폼으로 하여금 보여질 수 있도록 정보를 받아와 표시해줍니다.
==================
2009년 02월 10일
==================
여기까지 제가 구현하고자 하는 부분에 대한 알고리즘을 생각해보았습니다. 다음으로 하나하나 구현을 해보도록 하겠습니다.
리눅스상에서 아이피 확인 및 설정을 하기 위해서는 ifconfig 라는 명령어를 자주 접하게 될 것입니다.
ifconfig 를 통하여 각 이더넷 모듈별로 설정된 아이피 확인 및 서브넷마스크 확인 전송된 패킷량 등 여러 정보를 접하실 수 있습니다.
일단 구현하고자 하는 네트워크 설정 페이지를 만듭니다. html 로 만들게 된다면 초기 현재 설정되어 있는 정보를 받아오지 못하므로 cgi 를 이용하여 c로 만들어야 합니다.
networkset.c 라는 파일을 vi 에디터로 생성하여 기본 인클루드 파일 선언 후 cgi 페이지로 인식 할 수 있도록 해줍니다. 다음 c에서 바로 정보를 보기엔 힘든 부분이 있어 시스템함수를 이용하여 따로 작성한 쉘스크립을 불러왔습니다.
쉘스크립의 내용은 다음과 같습니다.
ifconfig eth0 > network.info
chmod 4777 network.info
sleep 1
쉘스크립이 시작되면 ifconfig eth0 의 명령에 대한 출력을 network.info 라는 파일로 저장합니다.
그 후 network.info 에 4777의 권한을 줍니다.( 유저권한에서 실행 가능할 정도면 될 듯 합니다만 임베디드 시스템에 들어갈 부분이기에 보안에 대한 내용은 잠시 접어두겠습니다 ;;;)
다음 sleep 명령을 이용하여 1초간의 딜레이를 주었습니다.
이런식으로 네트워크 정보를 받아오며 생성된 network.info 파일을 c에서 파싱합니다.
akw 를 이용하여 shell 에서 파싱하는 방법이 쉽습니다만.. 제작한 하드웨어의 커널에 awk 를 포함하지 않아 그냥 진행하며 다른 방법을 사용한 것 입니다 ㅡㅡ;;;
c에서 파일을 파싱하여 ip 및 subnetmask 정보를 얻은 후 gateway 정보를 얻어야 합니다. 여러 방법이 있겠지만 실력이 미천한 저는 route 쉘스크립을 만들어 파일로 저장 후 위와 같은 방법으로 파싱하여 정보를 얻어 냈습니다;;
다 끝내고 생각한 방법이지만 이렇게 할바에 커널에 awk 를 올리는 것이 한결 간편했을 거라는 생각이 드는군요 ㅠㅠ 뭐같은 linux gcc 때문에 몇번의 짜증이 솟구쳤지만 이차저차 기본 기능은 구현이 되는군요 -_-
===================
2009년 02월 11일
===================
어제에 이어 오늘도 작업을 시작하였습니다.
먼저 ip 정보 및 subnetmask 정보를 ifconfig 를 이용하여 파싱하였습니다.
먼저 ip 정보를 sed 를 이용하여 파싱하였습니다. sed에 대한 사용설명은 여기를 참조하시면 됩니다.
http://stone.backrush.com/sunfaq/ljs007.html
먼저 ifconfig 와 sed 를 이용하여 ip 주소를 파싱해보도록 하겠습니다.
간단히 쉘 스크립을 하나 만듭니다.
#> vi getinfo.s
/sbin/ifconfig | sed '/^ *$/d' | sed -ne 's/inet addr:\([0-9.]*\).*/\1/p;' > ip.info
이 명령어는 ifconfig 의 실행 결과 중 inet 이라는 문자열을 담고있는 열을 삭제 후 addr을 제외한 그 이후 값을 화면에 출력하며 ip.info 라는 파일로 저장하는 커맨드 입니다.
실행을 시켜보면
xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx
라고 ip 주소 및 local host 의 주소가 표시될 것 입니다.
이 중 우리가 필요한 값은 ip주소 값 입니다. 일단 냅두고..
다음으로 필요한 값은 subnetmask 값 입니다.
subnetmask 는 ip 주소가 나온 줄 바로 아래줄에 있군요
이것도 역시 ifconfig 와 sed, grep 를 이용하여 파싱하여 보겠습니다.
/sbin/ifconfig eth0 | grep Mask | sed "s/^.*Mask://g" > subnet.info
위 커맨드는 ifconfig eth0 의 결과 값중 grep를 이용하여 mask 문자열이 들어간 줄을 파싱하여 sed 를 이용 Mask: 다음에 나오는 subnet mask 값을 파싱하여 subnet.info 라는 파일로 저장하게 하는 커맨드 입니다.
저 역시 리눅스는 익숙치 않아 sed 에 대하여 약 20분 정도 공부를 한 후 만들었습니다 -_-;;
다음으로 우리가 필요로 하는 ip값고 subnetmask 값이 파일 두개로 출력이 되었습니다.(물론 처음 파일에 필요없는 호스트 정보도 포함되었군요) 이 파일을 하나로 합쳐 c언어로 파싱하기 좋게 하나로 만들겠습니다.
cat 커맨드를이용하면 쉽게 가능 할 것 같네요..
cat subnet.info ip.info | sort | uniq > ifinfo.info
두개의 파일을 하나로 합쳐 ifinfo.info 파일에 저장을 하도록 합니다.
여기까지 우리가 얻고자 하는 ip subnetmask gateway address, remote ip 중 두가지를 구하였습니다.
다음은 gateway address 를 구해보도록 하겠습니다.
gateway address 는 route 라는 커맨드를 이용하여 확인 및 설정 가능 합니다.
#> route | grep default > gw.info
게이트웨이 정보 중 default 라는 문자열이 들어있는 줄을 필터링하여 얻어냅니다. 몇몇 쓰레기 값도 들어가는 군요.(필요없는 값)
다음 아까 만들었던 ifinfo.info 라는 파일과 gateway 정보가 담긴 파일을 cat 커맨드를 이용하여 파일을 합칩니다.
cat ifinfo.info gw.info | sort | uniq > network.info
두개의 파일을 하나로 합쳐 network.info 라는 파일에 저장을 합니다.
이 파일에는 지금까지 우리가 얻으려 하였던 ip 와 subnet, gateway 정보 등이 들어 있습니다.
이 파일을 이용 할 c언어로 돌아옵니다.
파일을 열고 network.info 파일을 fscanf()를 이용하여 전체 읽어들인 후 문자열 배열에 넣고
원하는 값을 호출하여 사용하면 됩니다.
저는 폼을 만들어 밸류값에 들어가도록 하여 사용 하였습니다.
아래는 sorce 입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define TRUE 1
#define FALSE 0
#define ON 1
#define OFF 0
#define MAX 12000;
int main(int argc, char *argv[])
{
FILE *fp;
printf("Content-type:text/html \n\n");
int i = 0;
int index = 0;
int r = 0;
unsigned int delay = MAX;
char ipinfo = 0;
char subnetinfo = 0;
char gwinfo = 0;
char remote = 0;
char std[100][100];
char tmp;
setuid(0); // 유저에게 루트권한을 부여합니다.
printf("<html>");
printf("<head> <center>PLANETINT Network Setting </center></head>");
printf("<body>");
//printf("<h1>get network info</h1>");
r == system("./getinfo.s"); //시스템 함수를 이용하여 getinfo.s 스크립(각 정보를 파싱하는 스크립)을 실행합니다.
if( r == -1 )
{
printf("<h1> Fail the get network info</h1>");
}
else
{
//printf("<h1> Success get Network info </h1>");
}
//printf("REMOTE_ADDR = %s \n", getenv("REMOTE_ADDR"));
fp = fopen("./network.info" , "rt"); // 파싱한 정보들을 모아놓은 network.info 파일을 엽니다.
if(fp == NULL)
{
printf("<h1>DB ERROR</h1>");
return;
}
while(feof(fp) == 0)
{
fscanf(fp,"%s", &std[index][0]); // 배열에 파일을 모두 읽어 저장합니다.
//printf("<h1> %s </h1>", std[index]);
index++;
}
sleep(0.5); // 0.5초간의 딜레이 --;; 가끔 컴퓨터가 느려져 스크립이 제대로 실행되지 않은 상태에서 값을 읽어오는 경우가 있어 0.5초의 딜레이를 줬습니다.
//printf("<p> <h1> Host : %s</h1></p>",std[0]);
//printf("<p> <h1> I P : %s</h1></p>",std[1]);
//printf("<p> <h1> SUB : %s</h1></p>",std[2]);
//printf("<p> <h1> G W : %s</h1></p>",std[4]);
printf("<center><form name=\"nset\" action=./cgi-bin/netset.cgi method=\"post\">");
printf("<p> IP ADDR <br> <input type=\"text\" name = \"ipset\" maxlength=\"15\" value=\"%s\"> </p>",std[1]); // 각 정보를 폼에 뿌려줍니다.
printf("<p> SUBNET <br> <input type=\"text\" name = \"sebnet\" maxlength=\"15\" value=\"%s\"> </p>",std[2]);
printf("<p> GATEWAY <br> <input type=\"text\" name = \"gateway\" maxlength=\"15\" value=\"%s\"> </p>",std[4]);
printf("<p> SystemIP <br> <input type=\"text\" name = \"systemip\" maxlength=\"15\" value=\"%s\"> </p>",getenv("REMOTE_ADDR")); // 환경변수를 이용하여 리모트 주소를 구해 폼에 뿌려줍니다.
printf(" <input type=\"submit\" name=\"networkchange\" value=\"Change\">");
printf("<input type=\"reset\" name=\"netinit\" value=\"Reset\">");
printf("</form>");
printf("</center> </body>");
printf("</html>");
fclose(fp);
return 0;
}
아주 간단한 소스로 값을 파싱하여 만들 수 있었습니다.
여기에 변경된 값을 받아 처리를 해주는 함수를 만들면 웹상에서 네트워크 설정 기능이 완성이 됩니다.
LN2440SBC 메모리 맵 (0) | 2009.11.10 |
---|---|
리눅스 시리얼 프로그래밍 예제 (0) | 2009.11.10 |
RTC 없이 보드 시간 동기화 (0) | 2009.11.10 |
패킷 교환 네트워크에서의 지연과 손실 (0) | 2009.11.10 |
임베디드 리눅스 cgi + apach webserver 사용자 인증 시스템 만들기 (0) | 2009.09.10 |
| ||||||
| ||||||
| ||||||
| ||||||
| ||||||
| ||||||
| ||||||
| ||||||
장곶회집 - 낙조를 바라보며 식사할 수 있는 곳 |
개업한지 7년된 장곶회집은 낙조가 유명한 강화도 중에서도 1년 12달 낙조를 볼 수 있는 장화리에 위치한 곳이다. 강화도에서 잡은 회와 사장님이 직접 재배한 채소로 반찬거리를 만들어 더욱 깔끔한 맛을 느낄 수 있다. 장곶회집에는 야외에 평상에서 자연의 시원한 바람과 함께 식사 할 수 있으며, 황토로 지은 원두막이 5채가 있어 사계절 언제나 편하게 쉬었다 갈 수 있는 곳이다. 장곶회집 내에는 장화리에서 촬영한 낙조사진이 한쪽 벽면을 차지하고 있는데, 유명사진작가들의 작품이다. 멋과 맛, 자연과 낭만, 편안함을 모두 느낄 수 있는 곳이기에 한번 온 손님은 단골손님이 된다. - 메뉴 : 밴댕이회 / 꽃게탕 / 매운탕 - 전화 : 032-937-8266 - 교통 : 서울이나 인천에서 48번 국도이용-강화대교지나 검문소 앞에서 강화역사관 방면 좌회전-광성보, 덕진진지나 마니산방면 우회전-마니산 입구 지나 6km지점 좌측 |
연안식당 - 40년 손맛이 담긴 가마솥백반으로 유명한 곳 |
강화도에서 제일 높은 산인 마니산(469.4m)은 능선을 따라 바위와 관목이 산제되어 있어 산행이 험하나 마니산 정문에서 첨성단까지는 포장길과 계단으로 되어 있어 초보 산행도 가능하다. 새벽산행을 하고 나서 아침 식사를 하기 위한 여행객들이 많이 찾는 곳으로 마니산 입구 하도초등학교 앞 연안식당이 있다. 주인 할머니가 직접 차려주시는 백반은 강화도 토속음식인 순무김치와 서너가지의 반찬, 무쇠가마솥에 지은 밥, 콩나물과 시래기가 들어간 구수한 된장국등이 나오는데,40대와 50대의 사람들은 어릴적 향수를 불러온다. 100원때 부터 시작 하셨다는 할머님의 말씀에서도 볼 수 있듯이 인심좋은 시골백반집인연안 식당은 지금도 10년전 가격 그대로를 고수하고 있다. 식후에 주는 누루지 한 조각은 어릴적 시골에서 할머니가 해주시던 바로 그 맛이다. - 메뉴 : 가마솥백반/ 꽃게장 / 꽃게탕 / 자연산굴 - 전화 : 032-937-1009 - 교통 : 서울이나 인천에서 48번 국도이용-강화대교지나 검문소 앞에서 강화역사관 방면 좌회전-광성보, 덕진진지나 마니산방면 우회전-마니산 입구지나 화도버스터미널 앞 좌측 |
성진물텀벙 - 인천의 대표음식인 아구탕으로 20여년! |
물텀벙이라는 말은 아귀의 인천사투리로 옛날에 어부들이 아귀를 잡으면 버렸는데, 서민들이 해장국으로 사용하던 것이 지금은 별미로 자리잡고 있다.성진물텀벙은 28년전 처음 용현동에 자리잡고 금화식당으로 간판을 걸고 사장님이 직접 개발한 방법으로 아구찜과 아구탕을 만들어 판매하였는데, 그 맛이 일품이라 한번 먹어본 사람은 단골 손님이 될 정도이다. 지금은 성진물텀벙을 중심으로 7-8개의 물텀벙집이 생겨 물텀벙촌을 이루고 있다. 항상 직접 장을 보신다는 사장님의 고집에 맞게 항상 최고 품질의 아귀만을 사용하며 가격도 10여년전 그대로 받고 있다. - 메뉴 : 아구찜/ 아구탕 - 전화 : 032-883-1771, 883-6690 - 교통 : 서울에서 국철이용 도원역 하차-용현동사거리 행 버스 이용-용현 사거리 하차-도보 1분 인천 터미널이나 인천예술회관 앞에서 만수로 이용(인천항 방면)-만수로와 신현로 만나는 지점(용현사거리)-주유소 맞은편 |
우리옥 - 인천광역시 지정 맛집 |
강화읍 중앙시장 내에 있는 우리옥은 백반을 전문으로 하는 곳으로 이 곳에서 2대째 대물림을 하는 48년 전통이 있는 음식점이다.우리옥의 백반은 우리옥에서 직접 만든 구수한 콩비지와 사장님의 남편이 직접 농사 지으신 채소를 재료로 강화도의 토속음식인 순무김치, 취나물, 감자조림, 버섯볶음, 인삼무침등 10여가지의 찬, 무쇠가마솥에서 지은 밥, 그 가마솥에서 끌인 숭늉등 우리옥에서만 맛 볼 수 있는 것이 많다. 특히, 우리옥의 음식에 들어가는 된장, 고추장등은 사장님이 직접 담그신 것으로 옛맛 그대로를 내기 위해 매년 담그신다고 한다.불고기, 병어회, 석화등도 강화도 내의 다른 곳보다 저렴하게 먹을 수 있다. 우리옥에서 가까운 곳에 고려궁지(사적 제133호)와 성공회강화성당(대한성공회 최초 성당)등의 유적지와 강화인삼센터, 풍물시장등이 있어 어릴적 추억을 떠 올리며 가볼만한 곳이다. - 메뉴 : 대구찌개 / 불고기 / 병어회 / 석화 - 전화 : 032-932-2427 - 교통 : 서울이나 인천에서 48번 국도 이용-고려궁지 앞 삼거리(중앙시장)앞-시계방과 약국사이 골목으로 들어와 40m전방에서 우측 (중앙시장 입구에서 상인들에게 물어보면 편?/font> |
돈대횟집 - 매운탕과 밴댕이 무침은 바로 이곳! |
15년 전통의 돈대횟집은 강화도 외포리 선착장 앞의 먹거리 장터 내에 있는데 처음에는 장터 앞 건물에 있다가 먹거리 장터가 생기면서 장터 내로 들어오게 되었다. 강화 선착장 앞에서 가장 오래된 곳으로 강화 앞 바다에서 나는 농어, 숭어등의 활어회와 강화특산품인 밴댕이회와 무침, 매운탕등을 전문으로 한다. 특히 매운탕은 다른 곳보다 새우를 많이 넣어 시원한 맛을 더욱 느낄 수가 있으며, 밴댕이무침은 사장님이 직접 개발한 방법으로 만드는데, 매콤하면서 단맛이 좋아 서울이나 경기도에서도 단골손님이 있을 정도이다. 강화도에서 석모도를 들어가기 위해서는 외포리 선착장에서 배를 타고 가야 하는데, 석모도 가는 길에 소문 듣고 오는 손님이 많다. - 메뉴 : 밴댕이회 / 활어 / 밴댕이무침 / 꽃게탕 - 전화 : 032-932-2816 - 교통 : 서울이나 인천에서 48번 국도 이용-강화대교 지나 강화인삼센터 앞에서 좌회전-외포리 선착장앞지나 먹거리장터 내에서 오른쪽 끝 |
[펌] 웃긴글 모음 (0) | 2009.11.09 |
---|---|
맛대맛에 등장한 330곳의 전국 맛집 (0) | 2009.08.29 |
언제나 나의 발이되어주는 애마 (0) | 2009.08.10 |
우리집 귀염둥이 꼬맹이 ㅋ (0) | 2009.08.10 |
[09.07.22] 오늘의 일거리 (0) | 2009.07.22 |
[펌] 웃긴글 모음 (0) | 2009.11.09 |
---|---|
인천의 소문난 맛집 (0) | 2009.08.29 |
언제나 나의 발이되어주는 애마 (0) | 2009.08.10 |
우리집 귀염둥이 꼬맹이 ㅋ (0) | 2009.08.10 |
[09.07.22] 오늘의 일거리 (0) | 2009.07.22 |
MARK |
Length |
OffSet |
Type |
Data |
CheckSum |
: |
1바이트 |
2바이트 |
1바이트 |
0~255바이트 |
1바이트 |
① MARK
HEX파일의 모든 레코드는 ":" 문자(아스키코드 "3A")로 시작해야 한다. 이를 레코드 마크(MARK)라고 한다.
② Length
각 레코드에 포함된 바이너리 데이터의 길이이다. Length 필드의 크기가 1바이트이므로 Data 필드는 0~255바이트의 문자를 지녀야 한다. 예컨데, 레코드의 Data가 10개이면 10 = 0x0A 이므로 Length 필드에는 "0A"의 텍스트파일 형식으로 기입된다. 따라서, 실재 Length필드는 ASCII문자 2바이트를 필요로 한다. 이하, Offset, Type, Data, CheckSum 모두 마찬가지이므로 주의하도록 하자.
③ Offset
바이너리파일의 처음위치로부터 해당 레코드의 데이터가 위치하는 상대적 위치를 말한다. Offset은 2바이트(=16비트)의 값을 가지므로 8, 16비트 CPU의 경우 어떠한 어드레스라도 OffSet 필드를 이용해서 직접 어드레싱이 가능하다. 그러나, 20, 32비트 CPU의 경우엔 16비트의 OffSet만으로는 직접 어드레싱이 불가능하므로 간접 어드레싱해야 하는데, 이를 구별하기 위해 필요한 필드가 Type필드이다.
④ Type
레코드타입을 뜻함. 00의 경우 데이터 어드레스, 01의 경우 HEX파일이 종료됨을 뜻하는 레코드를 의미한다. 8, 16비트 CPU의 HEX 파일은 이 두가지 경우만 필요하지만, 20, 32비트 CPU에서는 추가적인 레코드를 필요로 한다. 이들 추가 레코드 타입에 대해서는 첨부된 자료를 참고하도록 하자.
⑤ Data
바이너리 데이터이다. 하나의 레코드 안에 포함될 수 있는 데이터의 개수는 0 ~255개까지이다. 그보다 데이터 수가 많을 경우에는 적당한 개수만큼 분할하여 레코드를 생성해야 한다.
⑥ CheckSum
HEX파일로 수신한 디바이스에서 올바른 바이너리 파일 변환을 위해 각 레코드가 오류없이 수신되었는지 체크하는 필드이다. CheckSum을 구하는 방법은 ② ~ ⑤의 필드를 바이트 단위로 쪼개어 모두 더한 다음 2의 보수(2's Complement)를 취하면 된다. 그 값이 1바이트를 넘을 경우 상위바이트의 값은 버리고 최하위 1바이트 부분만을 취한다.
이제 바이너리 파일이 어떻게 HEX 파일로 변환되는지 실습해 보도록 하자.
먼저, 바이너리 파일의 일부분을 열어봤다.
02 01 55 78 7F E4 F6 D8 FD 75 81 16 02 00 84 8F 0C 8E 0B 8D 0A 8C 09 ... |
이를 HEX 파일로 변환하면 다음과 같다.
:03000000020155A5 |
megaboot 입니다. (0) | 2009.08.23 |
---|---|
표준 CRC16 TABLE 입니다. (2) | 2009.08.23 |
AVR ATmega128 Rsgister 정리 입니다. (0) | 2009.08.23 |
AVR Calculate (0) | 2009.08.09 |
AVR 디버깅 방법론 (1) | 2009.08.08 |
UC-232A Driver (0) | 2009.10.07 |
---|---|
성게양 종이모형( 페이퍼 크래프트) 입니다 (0) | 2009.08.24 |
페이퍼 크래프트...새 만들기... (0) | 2009.08.24 |
현대 제네시스 쿠페 종이 모형 (0) | 2009.08.24 |
월E 페이퍼 크래프트 입니다. (0) | 2009.08.24 |
UC-232A Driver (0) | 2009.10.07 |
---|---|
성게군 종이모형( 페이퍼 크래프트) 입니다 (0) | 2009.08.24 |
페이퍼 크래프트...새 만들기... (0) | 2009.08.24 |
현대 제네시스 쿠페 종이 모형 (0) | 2009.08.24 |
월E 페이퍼 크래프트 입니다. (0) | 2009.08.24 |