Universal

 

UART 시스템은 과거로 거슬러 올라가 1840년대 최초의 전신 시스템에서 부터 시작되었다고 볼 수 있습니다.

Morse 코드 신호는 송신기에서 수신기로 전류를 통해 흘러가지만 보통 시각적으로 보기 좋게 하기 위해 종이에 수신된 메시지를 찍도록 하였습니다.

전류가 흐르면 '점'을 찍도록 하고, 전류가 흐르지 않으면 '공백'으로 처리 되었습니다.

 

 

컴퓨터에서는 전류를 감지하는 방법에서 전압을 측정하는 방식으로 바뀌었습니다. RS-232 표준은 Logic high(negative voltage) 가 '점'으로 표시되는 것이며, Logic Low(positive voltage) 가 공백으로 표시되는 것이라 보면 될 것입니다.

하지만 보통의 CPU는 negative voltage를 사용하기 어렵고 전압 레벨도 다르기 때문에, CPU 자체적인 UART 통신은 TTL(the transistor logic) 신호를 사용합니다. TTL 레벨에서는 3.3V 가 '점'으로 표시되며 0V는 '공백'으로 표시됩니다.

이처럼 트랜지스터의 사용으로 쉽게 만들 수 있는 시스템이라 하여 Universal 이라는 이름이 붙여진 것이라 볼 수 있습니다.

 

 

Asynchronous

 

이제는 비동기(Asynchronous)가 의미하는 바를 살펴 봅시다.

송신자가 메시지를 전송하려고 해도 수신자가 받을 준비가 되어 있지 않다면 아무 소용 없는 일 일 것입니다. 병렬 통신의 경우 한 순간에 하나의 글자가 만들어 질 수 있습니다. 하지만 직렬 통신(Serial Communication)의 경우에는 하나의 글자가 만들어 지는데 시간이 걸립니다. 그렇기 때문에 송신자가 글자를 보내면서 데이터를 보내고 있다는 신호를 지속적으로 주게 됩니다. 이것이 동기 통신(Synchronous Communication)입니다. 하지만 동기 통신은 데이터 라인 말고도 동기를 위한 신호선이 추가로 필요합니다. 신호선 하나 추가하는 것이 의외로 복잡한 일일 수 있습니다.

송신자와 수신자가 동일한 시계를 가지고 있다면 어떨까요?

예를 들어 내가 11시 30분부터 10초 단위로 한글자씩 보낼 것이니 잘 받아라 라는 프로토콜(약속) 을 정해 놓고 10초 단위로 한 글자씩 받으면 신호선을 추가하지 않고도 보낼 수 있지 않을까요?

이것이 바로 비동기 통신(Asynchronous Communication) 입니다. UART 에서는 서로 Baud Rate를 정해 놓고 통신을 하기 때문에 동일한 시계를 사용한다고 볼 수 있겠죠.

Baud Rate에 오차가 있으면 어떻게 될까요?

 

 

위 그림에서 보듯이 시간의 오차가 커질 수록 데이터의 오차 확률도 높아진 다는 것을 알 수 있습니다. 위 그림에서 흰색 점이 통신의 확인 시점이라고 보시면 되는데요 5~6% 오차가 발생하는 시점부터 x 에러가 발생하는 것을 확인할 수 있습니다. Baud Rate라고 하는 시간을 정확하게 맞춰야 하는 이유겠죠

 

 

Receiver-Transmitter

 

UART는 하나의 장치에 송신기와 수신기를 붙여 놓은 것이라 볼 수 있습니다. 예전에 Morse Code를 보내는 장치는 송신기에서 데이터를 보내고 수신기에서는 데이터를 받는 것이었습니다.

이러한 장치는 단방향 통신밖에 할수가 없습니다. 그럼 양방향 통신을 하기 위해서는 어떻게 해야 할까요? 하나의 장치만 추가하면 되겠죠?

그래서 송신기와 수신기를 붙여 놓으면 양방향 통신을 할 수 있는 것입니다.

그렇다면 프로토콜을 한번 볼까요?

 

 

처음 Start bit가 있고 마지막에 Stop bit가 있습니다. High로 유지되다가 데이터가 송수신 시작 되는 시점에 Low(Start bit) 가 되고 8비트 데이터를 보낸 후에 Parity 비트를 옵션으로 넣을 수 있습니다.

마지막에는 High(Stop bit) 가 됩니다. 여기에서 Stop bit는 그 다음 데이터와의 시간 간격을 위해서 1~2bit로 설정할 수 있습니다.

그래서 8비트 데이터를 보낸다고 했을 때 최소 10bit 에서 12bit까지 시간을 소모할 수 있습니다. 여기에서 시간이라 표시한 의미는 알겠죠? Baud Rate 에 따라서 위의 그림에서 하나의 칸의 시간을 결정할 수 있는 것입니다. 즉 9600bps 라고 하는 것은 1초에 9600칸 또는 bit를 보낼 수 있다는 것을 의미합니다.

 

출처 : http://www.mcublog.co.kr/1841


'Hardware' 카테고리의 다른 글

SPI(Serial Peripheral Interface Bus)  (0) 2015.08.04
I2C(Inter Integrated Circuit)  (0) 2015.08.04
How to Build an 8-Bit Computer by spel3o  (0) 2015.03.14
led는 안다리가 짧은게 vcc  (0) 2015.01.03
간단한 레귤레이터 만들기 11V->5V  (0) 2014.12.30

웹서버 설치


localhost/index.html

컴퓨터에 브라우저와 서버를 동시에 설치한 상태.

1. localhost : 웹브라우저가 설치된 이 컴퓨터의 웹서버

2. index.html : 웹 브라우저가 index.html파일을 요청

3. 웹서버가 default파일에 index.html을 읽어 보내줌.

4. 다른 주소를 칠 경우, 존재하지 않는다고함.


opentutorials.org/index.html

1. 웹브라우저가 웹서버 opentutorials.org에 index.html파일을 요청한다.

2. 웹서버는 htdocs(특수 디렉토리:document root-웹서버가 문서를 찾는 최상위 디렉토리)파일에서 index.html을 읽어옴.

3. 웹서버가 웹브라우저에게 내용을 전달.






HTML


'서버의 정석' 카테고리의 다른 글

웹 어플리케이션 만들기1  (0) 2015.07.20

웹어플리케이션을 만드는 순서


수업목표 : 프로그래밍이란?


->웹을 수단으로 설명


- 다양한 기술

- 낮은 진입장벽


client와 server



Client 

 

Server 

 HTML

 

 미들웨어(PHP)

 CSS

 인터넷

 데이터베이스(MySQL) 

 Javascript

 

 

 웹브라우저 

 

 웹서버 


->이것들이 어떻게 주고받아 인터넷을 구성하는가가 목적


웹어플리케이션을 만드는 순서

구상->기획->디자인->개발->테스트


Start Small!! 왜??

1. 완성이 목표다.

2. 필요한것을 만들자.

3. 복잡도 - 체크박스 : 기능하나 추가에 2의 n승 =>지수폭발






서버와 클라이언트


클라이언트 컴퓨터

뭽브라우저가 설치된 컴퓨터


서버 컴퓨터

웹서버가 설치된 컴퓨터


1.주소로 클라이언트 컴퓨터가 서버 컴퓨터에게 요청을 한다.

2.서버컴퓨터가 웹페이지를 읽어 보내준다.

이렇게 서버와 클라이언트로 웹을 동작한다.



'서버의 정석' 카테고리의 다른 글

웹 어플리케이션 만들기2  (0) 2015.07.20

추상클래스(abstract class)


추상 - 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업.

구체화 - 상속을 통해 클래스를 구현, 확장하는 작업.


abstract class Player{

boolean pause;

int currentPos;


Player(){

pause = false;

currentPos = 0;

}


abstract void play(int pos)


abstract void stop();


void play(){

play(currentPos);

}


void pause(){

if(pause){

pause = false;

play(currentPos);

} else{

pause = true;

stop();

}

}

}

1.추상클래스란?

추상 메서드(미완성 메서드)를 포함하고 있는 클래스

- 인스턴스를 생성 할 수 없다.

- 추상 클래스의 손자 클래스에서 추상메서드의 구현부를 완성해야 한다.

- 기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.


2.추상메서드

- 선언부만 있고 구현부가 없는 메서드.

- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용.

- 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현 해 주어야 한다.

abstract class Player{

absract void play (int pos);

abstract void stop();

}


class AudioPlayer extends Player{

void play(int pos)

void stop();

}


abstract class AbstractPlayer extends Player{

void play(int pos)

}



인터페이스(interface)


1.인터페이스란?

- 실제 구현된 것이 전혀없는 설계도.

- 추상메서드와 상수만을 멤버로 가질 수 있다.

- 클래스 작성에 도움을 줄 목적으로 사용된다.

- 구성요소는 추상메서드와 상수만 가능하다.

- 다중상속이 허용된다.

- Object클래스와 같은 최고 조상이 없다.

- 서로 관계없는 클래스들에게 관계를 맺어줄 수 있다.

'JAVA의 정석' 카테고리의 다른 글

7.객체지향개념2 - 다형성(polymorphism)  (0) 2015.07.20

다형성(polymorphism)


1.다형성이란?

조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는것.

Tv t = new Tv();

CaptionTv c = new CaptionTv();


=> Tv t = new CaptionTv();

Tv가 조상타입, CaptionTv가 자손타입.


2.반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.


3.참조변수의 형변환

- 서로 상속관계에 있는 타입간의 형변환만 가능하다.

- 자손 타입에서 조상타입으로 형변환하는 경우, 형변환 생략가능.

- 조상타입에서 자손타입으로 형변환 불가.

class Car{}

class FireEngne extends Car{}


Car car = null;

FireEngine fe = new FireEngine();

FireEngine fe2 = null;


car = fe; //(Car 생략가능)

fe2 = (FireEngine) car;



4.instanceof연산자

- 참조변수가 참조하는 인스턴느의 실제타입을 체크하는데 사용.

- instanceof의 연산결과가 true이면, 해당타입으로 형변환이 가능하다.


5.참조변수와 인스턴스변수의 연결

참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를  넘겨 줄 수 있다.


class Product{}

class Tv extends Product {}

class Computer extends Product {}

class Audio extends Product {}


Tv tv = new tv();

Computer com = new Computer();


void buy (Tv t) {

money-=t.price;

bonusPoint += t.bonusPoint;

}


위와 같이 한다면 모든 제품을 등록할 때마다 buy함수를 추가해 주어야 한다.

따라서 위의 buy 메서드는 다음과 같이 바꿀 수 있다.


Product p1 = new Tv;();

Product p2 = new Computer();

Product p3 = new Audio();


void buy(Product p){

money-=p.price;

bonusPoint += p.bonusPoint;

}

매개변수가 Product타입의 참조변수라는 것은, 메서드의 매개변수로 Product클래스의 자손타입의 참조변수면 어느 것이나 매개변수로 받아들일 수 있다는 뜻이다.

6.조상타입의 배열에 자손들의 객체를 담을 수 있다.

Product p1 = new Tv();

Product p2 = new Computer();

Product p3 = new Audio();


위의 코드를 다음과 같이 배열에 넣어보자.


Product p[] = new Product[3];

p[0] = new Tv();

p[1] = new Computer();

p[2] = new Audio();


'JAVA의 정석' 카테고리의 다른 글

7.객체지향개념2 - 추상클래스와 인터페이스  (0) 2015.07.20

7.20~26일 공부계획



 

 2

4

 JAVA

 최소21p

 21p

 21p

21p 

21p 

 서버

 10강

10강 

10강 

10강 

10강 


체크사항


노트에 요약정리 하였는가?


다음날을 위한 시험문제를 만들었는가?(각 10문제씩)

'공부일지' 카테고리의 다른 글

venv환경만들기  (0) 2015.10.11

자바에서 10진수를 16진수로 변환시

출처 : http://ismydream.tistory.com/144

프로그래밍/JAVA 2013/09/10 02:23

자바에서 10진수를 16진수로 변환시


자바에서 10진수를 16진수로 변환해서 출력하게 되면 아래와 같은 결과가 표시됩니다.

우선 자바에서 사용된 소스코드는 아래와 같습니다.

숫자를 int 형 변수에 담을 때와 double 형 변수에 담을 때의 출력값이 다르게 표시됩니다.

int 형 변수에는 익히 봐왔던 결과가 출력됩니다.

for( int i=1; i<20; i++){

System.out.print( i + ": \t");

System.out.println( Integer.toHexString(i));

}

========================================================

1:  1

2:  2

3:  3

4:  4

5:  5

6:  6

7:  7

8:  8

9:  9

10:  a

11:  b

12:  c

13:  d

14:  e

15:  f

16:  10

17:  11

18:  12

19:  13


따라서 double 일때의 결과값에 대해 살펴보겠습니다.

for(double d1 = 1.0 ; d1< 10.0 ; d1++) {  

  System.out.println(d1+" :  "+Double.toHexString(d1));  


========================================================

1.0 : 0x1.0p0

2.0 : 0x1.0p1

3.0 : 0x1.8p1

4.0 : 0x1.0p2

5.0 : 0x1.4p2

6.0 : 0x1.8p2

7.0 : 0x1.cp2

8.0 : 0x1.0p3

9.0 : 0x1.2p3


출력된 결과를 유심히 보면서 

과연 출력된 값의 의미가 뭘까 궁금했습니다.

우선 

0x1.0p0 를 보면 맨 앞의 두글자 0x 는 16진수를 나타내는 문자이며 1.0p0 는 10진수 1이 16진수로 변경된 숫자 입니다.

어떻게 10진수 1이 1.0p0 로 변경된걸까

우선 16진수를 10진수로 변경하는 공식은 1.0p0 가 a.bpc 라고 할때

(( a * 16 ^ 0 ) + ( b * 16 ^ -1 )) *  2 ^ c 입니다.

따라서 ((1 * 16 ^0) + ( 0 * 16 ^ -1)) * 2^0 이게 됩니다.


조금 복잡하게는 10진수 7인 0x1.cp2 는

(( 1 * 16 ^0 ) + ( 12 * 16 ^ -1 )) * 2 ^ 2 이게 됩니다.

( 1 + 12 / 16 ) * 4 = ( 4 / 4 + 3 / 4 ) * 4

= 7 이게 됩니다.


import java.util.Scanner;


class Basic23{

      static int dec;

      static int[] num= new int[5];

      public static void main(String[] args){

            Menu m=new Menu();

            m.start();

            Calc f=new Calc();

            switch(m.choice){

            case 1 : 

                  for(int i=0;i<5;i++){

                  num[i]=f.bi();

                  } break;

            case 2 :

                  for(int i=0;i<5;i++){

                  num[i]=f.octal();

                  } break;

            case 3 :

                  for(int i=0;i<5;i++){

                  num[i]=(char)f.hex();

                  } break;

            default : System.out.println("error!");

            }

            for(int i=0;i<5;i++){

                  System.out.print(Integer.toHexString(num[4-i]));

            }

            return;

       }

}


class Menu extends Basic23

{

      int choice=0;

      

      public void start(){

            Scanner userInputScanner = new Scanner(System.in);

            System.out.println("Dec to Another");

            System.out.println("Input a decimal number:");

            dec= userInputScanner.nextInt();

            System.out.println("Menu");

            System.out.println("1.Dec to Bi");

            System.out.println("2.Dec to Octal");

            System.out.println("3.Dec to Hex");

            choice= userInputScanner.nextInt();

      }

}


class Calc extends Basic23{

      public int bi(){

            dec = dec/2;

            return dec==1 ? 1 : (dec%2);

      }

      public int octal(){

            int temp=dec;

            if(temp>=8) {dec=dec/8; return temp%8;}

            else {dec=dec/8; return temp;}

      }

      public int hex(){

            int temp=dec;

            if(temp>=16){ dec=dec/16;

                  return temp%16;

                  }

                  

            else {dec=dec/16;

                  return temp;

                  }

                  

      }

}



  1. 1514756 1.jpg
    1
    Import the Scanner class. You can either choose to import thejava.util.Scanner class or the entire java.util package. To import a class or a package, add one of the following lines to the very beginning of your code: 
    import java.util.Scanner; // This will import just the Scanner class.
    import java.util.*; // This will import the entire java.util package.
    
    Ad
  2. 1514756 2.jpg
    2
    Initialize a new Scanner object by passing the System.in input stream to the constructor. System.in is the standard input stream that is already open and ready to supply input data. Typically this stream corresponds to keyboard input. 
    Scanner userInputScanner = new Scanner(System.in);
    
  3. 1514756 3.jpg
    3
    You can now read in different kinds of input data that the user enters. The Scanner class supports getting primitives such as int, byte, short, long in addition to getting strings. Here are some methods that are available through the Scanner class:
    • Read a byte - nextByte()
    • Read a short - nextShort()
    • Read an int - nextInt()
    • Read a long - nextLong()
    • Read a float - nextFloat()
    • Read a double - nextDouble()
    • Read a boolean - nextBoolean()
    • Read a complete line - nextLine()
    • Read a word - next()
    Here is an example of a program that uses different methods of the Scanner class to get different types of input: 
    import java.util.Scanner;
     
    public class ScannerExample {
        public static void main(String[] args) {
            // Initiate a new Scanner
            Scanner userInputScanner = new Scanner(System.in);
     
            // Testing nextLine();
            System.out.print("\nWhat is your name? ");
            String name = userInputScanner.nextLine();
     
            // Testing nextInt();
            System.out.print("How many cats do you have? ");
            int numberOfCats = userInputScanner.nextInt();
     
            // Testing nextDouble();
            System.out.print("How much money is in your wallet? $");
            double moneyInWallet = userInputScanner.nextDouble();
     
            System.out.println("\nHello " + name + "! You have " + numberOfCats
                    + (numberOfCats > 1 ? " cats" : " cat")
                    + " and $" + moneyInWallet + " in your wallet.\n");
        }
    }


이러한 코드가 있다고 하면 


이러한 오류가 뜨는 경우가 있다. 


이럴때의 해결책 >>>


컴파일시 javac (파일명).java - encoding (인코딩명)


ex) javac 1.java - encoding UTF8  << 인코딩 형식을 UTF-8 로 했을 경우


+ Recent posts