728x90
반응형
- 시리얼 통신(리눅스)
→ 리눅스에서 두개의 창으로 시리얼 통신을 하기 위한 소스를 작성한다.
→ 우선 포트 설정을 확인한다.
→ 첫번째 체크는 시리얼 포트의 연결을, 두번체 체크는 실행되었을 때 마다 자동으로 연결해 준다.
→ Serial Port와 Serial Port2는 각각 앞에 확인한 포트와 같이 COM10과 COM11로 맞추어 준다.
→ 설정이 끝났으면 지난 주 멀티플렉싱 수업시 사용했던 소스를 수정한다. 아래의 소스를 두개로 만들되 각 포트의 define값만을 다르게 한다.(#define COMPORT1 "/dev/ttyS0" 부분을 #define COMPORT1 "/dev/ttyS1"으로 바꾸어 준다.)
→ 아래는 작성된 소스이다.
- 통신 결과 확인
→ 송신
→ 수신
→ 소스 작성 단계
1. 단계
1) N개의 키가 왼쪽으로부터 오른쪽으로 검색되면서 모든 인접한 두 개의 키가 서로 비교된다. 인접한 두 개의 키 중에서 왼쪽의 키가 더 크면 오른쪽의 키와 자리를 바꾼다.
- A[n-1]에 가장 큰 키가 있게 된다
2) A[0:n-2]가 왼쪽으로 부터 오른쪽 방향으로 가면서 차례로 검색되는데, 이 때 역시 모든 인접한 두개의 키가 서로 비교되고 왼쪽의 키가 큰 경우에 오른쪽의 키와 자리바꿈을 한다.
- A[n-2]에 가장 큰 키가 있게 된다.
2. 최악의 경우 n-1회의 단계를 거치면서 배열 전체가 오름차순으로 정렬된다.
3. 최적화
1) 바로 전 단계에서 키의 자리바꿈이 일어났는지 검사
- 자리바꿈이 전혀 일어나지 않은 경우에는 배열이 이미 정렬된 것 이다.
- 프로그램 작성
_M#]
→ 출력 결과
→ 리눅스에서 두개의 창으로 시리얼 통신을 하기 위한 소스를 작성한다.
→ 우선 포트 설정을 확인한다.
→ Virtual Serial Port Driver 프로그램을 확인해 보면 COM10과 COM11이 pair로 설정되어 있다. 이것을 사용하기 위해 VMware_player에서 Settings에 들어가면 아래와 같이 두개의 Serial Port 장치를 확인할 수 있다.
→ 여기서 Device Status의 Connected와 Connect at power on의 체크 상태를 확인한다.
→ 첫번째 체크는 시리얼 포트의 연결을, 두번체 체크는 실행되었을 때 마다 자동으로 연결해 준다.
→ Serial Port와 Serial Port2는 각각 앞에 확인한 포트와 같이 COM10과 COM11로 맞추어 준다.
→ 설정이 끝났으면 지난 주 멀티플렉싱 수업시 사용했던 소스를 수정한다. 아래의 소스를 두개로 만들되 각 포트의 define값만을 다르게 한다.(#define COMPORT1 "/dev/ttyS0" 부분을 #define COMPORT1 "/dev/ttyS1"으로 바꾸어 준다.)
→ 아래는 작성된 소스이다.
#include<stdio.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<termios.h>
#include<sys/signal.h>
#include<unistd.h>
#define SPEED B19200
#define COMPORT1 "/dev/ttyS0" //리눅스는 1번
void Input_Incomming(int);void my_signal(int arg); // 시그널 처리 함수
char cBuff[255]; // 수신용 버퍼
volatile int iBreak = 0;
int iRet;
struct termios stOldSt1; // 기존 Serial Port1 상태 정보
int main()
{
int iMaxFD = 0;
int iCom1 = 0;
struct termios stNewSt1; // 새로운 Serial Port1 상태 정보
struct sigaction act; // sigaction 구조체 변수 선언
fd_set stRFd; // file descriptor set
iCom1 = open(COMPORT1, O_RDWR|O_NOCTTY); // 시리얼 포트 오픈
if(0 > iCom1) // 시리얼 포트1 오픈 에러
{
perror(COMPORT1);
exit(-1);
}
bzero(&act, sizeof(act));
act.sa_handler = my_signal; // 시그널 처리 함수
act.sa_flags = 0;
sigaction(SIGINT, &act, 0); //
tcgetattr(iCom1, &stOldSt1);
// 시리얼 포트 설정 전에 시그널 핸들러 등록
bzero(&stNewSt1, sizeof(stNewSt1));
stNewSt1.c_cflag = SPEED|CRTSCTS|CS8|CLOCAL|CREAD;
stNewSt1.c_iflag = IGNPAR|ICRNL;
stNewSt1.c_oflag = 0;
stNewSt1.c_cc[VMIN] = 1; // read시 리턴되기 위한 최소 문자 개수 지정
tcflush(iCom1, TCIFLUSH); // 시리얼 포트 수신 큐 초기화
tcsetattr(iCom1, TCSANOW, &stNewSt1); // 시리얼 포트에 새 속성 적용
iMaxFD = iCom1 + 1;
while(1)
{
// Set Descriptor
FD_ZERO(&stRFd);
FD_SET(iCom1, &stRFd);
FD_SET(0, &stRFd);
// block until input
select(iMaxFD, &stRFd, NULL, NULL, NULL);
if(iBreak == 1)
{
break;
}
// 입력을 받는다.
if(FD_ISSET(iCom1, &stRFd))
{
Input_Incomming(iCom1);
}
// 키보드 입력을 보낸다.
if(FD_ISSET(0, &stRFd))
{
memset(cBuff, 0, 255);
iRet = read(0, cBuff, sizeof(cBuff));
cBuff[iRet] = 0;
write(iCom1, cBuff, iRet);
}
}
tcsetattr(iCom1, TCSANOW, &stOldSt1); // 시리얼 포트의 원래 속성 복귀
close(iCom1); // 시리얼 포트 닫음
printf("End program\n"); // End main()
return 0;
}
void Input_Incomming(int iCom1)
{
int iCnt=0;
iRet = read(iCom1, cBuff, 255); // 시리얼 포트로 부터 데이터 수신
while(iRet>iCnt)
{
printf(" %02X ", *(cBuff+iCnt)); // hex 값으로 표시.
++iCnt;
if(0 == (iCnt%16)) // 16개마다 개행.
{
putchar('\n');
}
}
putchar('\n');
putchar('\n');
return ;
}
void my_signal(int arg)
{
iBreak = 1;
printf("\nCtrl-C pressed\n");
return ;
}
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<termios.h>
#include<sys/signal.h>
#include<unistd.h>
#define SPEED B19200
#define COMPORT1 "/dev/ttyS0" //리눅스는 1번
void Input_Incomming(int);void my_signal(int arg); // 시그널 처리 함수
char cBuff[255]; // 수신용 버퍼
volatile int iBreak = 0;
int iRet;
struct termios stOldSt1; // 기존 Serial Port1 상태 정보
int main()
{
int iMaxFD = 0;
int iCom1 = 0;
struct termios stNewSt1; // 새로운 Serial Port1 상태 정보
struct sigaction act; // sigaction 구조체 변수 선언
fd_set stRFd; // file descriptor set
iCom1 = open(COMPORT1, O_RDWR|O_NOCTTY); // 시리얼 포트 오픈
if(0 > iCom1) // 시리얼 포트1 오픈 에러
{
perror(COMPORT1);
exit(-1);
}
bzero(&act, sizeof(act));
act.sa_handler = my_signal; // 시그널 처리 함수
act.sa_flags = 0;
sigaction(SIGINT, &act, 0); //
tcgetattr(iCom1, &stOldSt1);
// 시리얼 포트 설정 전에 시그널 핸들러 등록
bzero(&stNewSt1, sizeof(stNewSt1));
stNewSt1.c_cflag = SPEED|CRTSCTS|CS8|CLOCAL|CREAD;
stNewSt1.c_iflag = IGNPAR|ICRNL;
stNewSt1.c_oflag = 0;
stNewSt1.c_cc[VMIN] = 1; // read시 리턴되기 위한 최소 문자 개수 지정
tcflush(iCom1, TCIFLUSH); // 시리얼 포트 수신 큐 초기화
tcsetattr(iCom1, TCSANOW, &stNewSt1); // 시리얼 포트에 새 속성 적용
iMaxFD = iCom1 + 1;
while(1)
{
// Set Descriptor
FD_ZERO(&stRFd);
FD_SET(iCom1, &stRFd);
FD_SET(0, &stRFd);
// block until input
select(iMaxFD, &stRFd, NULL, NULL, NULL);
if(iBreak == 1)
{
break;
}
// 입력을 받는다.
if(FD_ISSET(iCom1, &stRFd))
{
Input_Incomming(iCom1);
}
// 키보드 입력을 보낸다.
if(FD_ISSET(0, &stRFd))
{
memset(cBuff, 0, 255);
iRet = read(0, cBuff, sizeof(cBuff));
cBuff[iRet] = 0;
write(iCom1, cBuff, iRet);
}
}
tcsetattr(iCom1, TCSANOW, &stOldSt1); // 시리얼 포트의 원래 속성 복귀
close(iCom1); // 시리얼 포트 닫음
printf("End program\n"); // End main()
return 0;
}
void Input_Incomming(int iCom1)
{
int iCnt=0;
iRet = read(iCom1, cBuff, 255); // 시리얼 포트로 부터 데이터 수신
while(iRet>iCnt)
{
printf(" %02X ", *(cBuff+iCnt)); // hex 값으로 표시.
++iCnt;
if(0 == (iCnt%16)) // 16개마다 개행.
{
putchar('\n');
}
}
putchar('\n');
putchar('\n');
return ;
}
void my_signal(int arg)
{
iBreak = 1;
printf("\nCtrl-C pressed\n");
return ;
}
- 통신 결과 확인
→ 송신
→ 수신
[버블 정렬법]
버블 정렬법(bubble sort)은 제 1단계에서 처음 것을 인접한 그 다음 번 위치의 데이터와 비교하여 선택 정렬 때와 같은 요령으로 맞바꾸기한 후 그 중에서 뒤의 데이터와 다시 인접한 그 다음 번 데이터를 끝(n번째)까지 비교하여 가장 뒤에 위치할 데이터를 결정한다.
문제1) 5개의 데이터를 입력해서 버블 정렬법을 사용하여 오름차순 정렬하라.
문제2) 위의 순서도대로 버블소트를 구현할 시 정렬이 완료되었더라도 i, j에 정해진 수만큼 계속 비교를 하게 됩니다. 위의 순서도의 문제점을 보완한 버블소트 프로그램을 작성하시오.
- 버블 정렬 교환정렬이라고도 하며 정렬이 진행되는 모양이 비누거품(bubble)과 같다고 하여 붙여진 이름이다. 나란히 있는 두개의 데이터를 계속하여 바꾸어 나간다. 버블정렬 과정 1. 우선 맨 처음에 모든 원소들의 최대값을 찾으려면 맨 처음 원소와 둘째 원소를 비교한다. 만약 앞의 원소가 뒤의 원소보다 크면 두 원소의 자리를 바꾼다. 2. 둘째 원소와 셋째 원소를 비교해 자리를 바꾼다. 3. 이 과정을 마지막 원소까지 반복하면 맨 마지막 자리에 제일 큰 원소가 자리잡게 된다. 4. 최대값을 가진 원소를 제외하고 나머지에 대해서 이 과정을 반복하면 그 다음으로 큰 원소를 찾아내 마지막에서 둘째 자리에 넣게 된다. 5. 과정을 끝까지 반복하면 모든 원소가 오름차순으로 정리된다.
(참고: 위키 백과) |
→ 소스 작성 단계
1. 단계
1) N개의 키가 왼쪽으로부터 오른쪽으로 검색되면서 모든 인접한 두 개의 키가 서로 비교된다. 인접한 두 개의 키 중에서 왼쪽의 키가 더 크면 오른쪽의 키와 자리를 바꾼다.
- A[n-1]에 가장 큰 키가 있게 된다
2) A[0:n-2]가 왼쪽으로 부터 오른쪽 방향으로 가면서 차례로 검색되는데, 이 때 역시 모든 인접한 두개의 키가 서로 비교되고 왼쪽의 키가 큰 경우에 오른쪽의 키와 자리바꿈을 한다.
- A[n-2]에 가장 큰 키가 있게 된다.
2. 최악의 경우 n-1회의 단계를 거치면서 배열 전체가 오름차순으로 정렬된다.
3. 최적화
1) 바로 전 단계에서 키의 자리바꿈이 일어났는지 검사
- 자리바꿈이 전혀 일어나지 않은 경우에는 배열이 이미 정렬된 것 이다.
- 프로그램 작성
_M#]
→ 출력 결과
728x90
'코스웨어 > 11년 내장형하드웨어' 카테고리의 다른 글
[내장형] 2011년 11월 1일 일일보고서 - 정선주 (6) | 2011.11.01 |
---|---|
[내장형]윤수영-2011.10.31 일일보고서 (4) | 2011.10.31 |
[내장형]심재원_2011.10.31_일일보고서 (3) | 2011.10.31 |
[내장형]이수란_2011.10.28 (8) | 2011.10.28 |
[내장형]최남식-2011년10월26일일일보고서 (9) | 2011.10.26 |
[내장형]이성재_10월25일 일일보고서 (12) | 2011.10.25 |
[내장형]김수만_10월 24일 (6) | 2011.10.25 |
[내장형]이상만_10월 20일(bitmap project / socket 2Way handshake) (10) | 2011.10.21 |