본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]김동화_2011년 10월 27일 일일보고서

by 알 수 없는 사용자 2011. 10. 27.
728x90
반응형
- 시리얼 통신(리눅스)
 → 리눅스에서 두개의 창으로 시리얼 통신을 하기 위한 소스를 작성한다.
 → 우선 포트 설정을 확인한다.

 → 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, 0255);
      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