본문 바로가기
코스웨어/15년 스마트컨트롤러

20150501-2번-강동조-USART복습/ HEXA VIEW

by 알 수 없는 사용자 2015. 5. 3.
728x90
반응형

1교시 H/W


복습 USART


USART 송신절차(설정)
1. 제어레지스터에 대해 필요한 통신 모드 설정(동기/비동기 모드 선택 데이터 비트수 및 정지 비트 수 등)

2. Baud Rate Register에 사용자 전송 속도에 맞는 값 설정

3. UCSR B Register의 TXEN bit set하여 TxD핀이 USART송신 단자로 사용될 수 있도록 한다

이걸 코드화 한다면...

UBRR0L:          ;
UBRR0H:          ;

UCSA0
      B0
      C0

USART 송신 절차(전송)
1. 전송할 Data를 송신 버퍼 UDR에 써 준다

2. UCSR A Register의 UDRE or TXC bit 를 체크하여 송신 버퍼에 데이터를 슬 수 있는지 검사(UDRE 플래그 비트는 송신 버퍼가 비어 있는 것을 나타내지만 TXC 플래그 비트는 송신 버퍼 뿐만 아니라 송신 Shift Register까지 비어 있는 상태를 나타냄)

3. 인터럽트 이용시 UCSRB레지스터에 대응하는 인터럽트 Enable bit를 set

USART 수신
제어 레지스터에 필요한 통신모드를 설정한다.

Baud Rate 레지스터에 사용자 전송속도에 맞는 설정 값을 설정

UCSR B의 RXEN 비트를 Set하여 RxD 핀이 수신 단자로 동작 하도록 함

수신 버퍼(UDR)의 값을 읽기 전에 수신 데이터가 전송되어 수신 버퍼에 저장되어 있는지 UCSR A 레지스터의 RXC플래그 비트 검사(RXC=1: 아직 읽지 않은 수신 데이터가 수신 버퍼에 있다)

RXC 비트는 수신 버퍼를 읽으면 자동 Clear 됨

C#
불과 5년전쯤만해도 무시받았지만 요즘에는 C#도 보급화되어 많이사용되고 있다
단점: 조금 묵직하다는 느낌이 들것이다

시험정보
평가 목적
*온도 및 조도 정보의 ADC 변환 기술 능력 평가
*character LCD 제어 능력 평가
*시리얼 통신에 대한 처리 능력 평가
 평가방법 : 보고서(실기) 객관식 10문항(핑기, 4지선다. 60분)
-평가내용: ADC변환 기술 character LCD 제어 시리얼 통신 기술
평가 기준
*실기: ADC변환(30점), character LCD 제어(30점) 시리얼 통신(30점)
*필기:ADC용어(2점) ADC Register(3점)Timing Diagram(3점) USART
평가 활용
*실기 50점 이하: 보고서 재작성 및 재 평가
*필기 5점이하: 관련 내용 보고서 작성 제출및 재시험


C# 기본사용법









 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _20150430_1
{
    public partial class Form1 : Form
    {
        String rxd;
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Portopen_Click( object sender, EventArgs e)
        {
            serialPort1.Open();
            btn_Portopen.Enabled = false;
            btn_PortClose.Enabled = true;
            btn_On.Enabled = true;
            btn_Off.Enabled = true;
            timer1.Enabled = true;

        }

        private void Form1_Load( object sender, EventArgs e)
        {
            serialPort1.BaudRate = 9600;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = System.IO.Ports. StopBits.Two;
            serialPort1.Handshake = System.IO.Ports. Handshake.None;
            serialPort1.Parity = System.IO.Ports. Parity.None;
            btn_PortClose.Enabled = false;
            btn_On.Enabled = false;
            btn_Off.Enabled = false;
        }

        private void btn_PortClose_Click( object sender, EventArgs e)
        {
            serialPort1.Close();
            btn_Portopen.Enabled = true;
            btn_PortClose.Enabled = false;
            btn_On.Enabled = false;
            btn_Off.Enabled = false;
            timer1.Enabled = false;
        }

        private void On_Click( object sender, EventArgs e)
        {
            serialPort1.WriteLine( "a");
        }

        private void Off_Click( object sender, EventArgs e)
        {
            serialPort1.WriteLine( "b");
        }

        private void textBox1_TextChanged( object sender, EventArgs e)
        {
            textBox1.Text = serialPort1.ReadLine();
            //textBox1.Text = textBox1.Text + serialPort1.ReadLine();   
         /*이코드를 작성하게되면 text칸에 적을시 계속 누적이되어 적을수 있다 */
            //textBox1.Text += serialPort1.ReadLine();
        }

        private void serialPort1_DataReceived( object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            rxd = serialPort1.ReadLine();
        }

        private void timer1_Tick( object sender, EventArgs e)
        {
            textBox1.Text = rxd;
        }
    }
}


2교시 S/W

fread 와 fwrite에 용량을결정하는 두개의 인자는 순서가 바뀌어도 상관이d없다
fread는 파일로부터 읽어서 buf에 저장이되고 fwrite는 버퍼에 입력을하여 파일에 저장을한다

읽어들일때 return 값을 확인을한다


HEXA파일 비쥬얼 스튜디오와 우리코드의 문제를 확인해보자
#include <stdio.h>

int main(int argc, char * argv[])
{
     unsigned int uiCnt;
     unsigned int uiLine;
     unsigned int uiLen;     //uiLen byte만큼 출력해라.
     FILE * st_File_Dsc;
     unsigned char ucData[16];

     if(argc != 2)
     {
          printf("사용법 : %s 파일 이름 확장자\n", argv[0]);
          return 100;
     }

     st_File_Dsc = fopen(argv[1], "rb");
    
     if(st_File_Dsc == 0)
     {
          printf("파일을 열수 없습니다:[%s] \n",argv[1]);
          return 200;
     }



     printf("===================================================================== \n");
     printf("  ADRESS                      HEXA                          ASCII     \n");
     printf("===================================================================== \n");

    
     for (uiLine = 0; uiLine < 20; uiLine ++)
     {
          fread(ucData, sizeof(ucData), 1, st_File_Dsc);     //적음으로써 아스키코드가들어간다
          /***********Address 값 출력 부분***********/
          printf(" %08X ",uiLine * 16);               //주소가 16진수이므로 10씩 증가한다.
          /***********Hexa 값 출력 부분***********/
          for (uiCnt = 0; uiCnt < 16; uiCnt++)
          {
               printf("%02X ", ucData[uiCnt]);   
          }
          /***********ASCII 값 출력 부분***********/
          for (uiCnt = 0; uiCnt < 16; uiCnt++)
          {    
               if (ucData[uiCnt] < 32)          //제어문이면
               {                                        //.을 출력해라.
                    putchar('.');
               }
               else if (ucData[uiCnt] > 127)     //한글이면
               {                                            //.을 출력해라.
                    putchar('.');
                   
               }

               else                    //제어문과  한글이 아니면
               {                       //1byte의 ASCII Code를 출력해라.
                    printf("%c",ucData[uiCnt]);
               }
          }
          putchar('\n');
     }
    
     fclose(st_File_Dsc);
     return 0;
}



틀린부분 수정
#include <stdio.h>

int main(int argc, char * argv[])
{
     unsigned int uiCnt;
     unsigned int uiLine;
     unsigned int uiLen;     //uiLen byte만큼 출력해라.
     FILE * st_File_Dsc;
     unsigned char ucData[16];

     if(argc != 2)
     {
          printf("사용법 : %s 파일 이름 확장자\n", argv[0]);
          return 100;
     }

     st_File_Dsc = fopen(argv[1], "rb");
    
     if(st_File_Dsc == 0)
     {
          printf("파일을 열수 없습니다:[%s] \n",argv[1]);
          return 200;
     }



                         printf("========================="
                                "========================="

                                 "=================== \n");
     printf("  ADRESS                      HEXA                          ASCII     \n");
                         printf("========================="

                                "========================="
                                 "=================== \n");

    
     for (uiLine = 0; uiLine < 20; uiLine ++)
     {
          fread(ucData, sizeof(ucData), 1, st_File_Dsc); 
   /* 위에코드를 적음으로써 셋팅만 해놓은 HEX VIEW에 데이터가 들어간다 */
          /***********Address 값 출력 부분***********/
          printf(" %08X ",uiLine * 16);               //주소가 16진수이므로 10씩 증가한다.
          /***********Hexa 값 출력 부분***********/
          for (uiCnt = 0; uiCnt < 16; uiCnt++)
          {
               printf("%02X ", ucData[uiCnt]); 
               if(uiRet < uiCnt)
               {
                    break;
               }

          }
          /***********ASCII 값 출력 부분***********/
          for (uiCnt = 0; uiCnt < 16; uiCnt++)
          {    
               if (ucData[uiCnt] < 32)          //제어문이면
               {                                        //.을 출력해라.
                    putchar('.');
               }
               else if (ucData[uiCnt] > 127)     //한글이면
               {                                            //.을 출력해라.
                    putchar('.');
                   
               }

               else                    //제어문과  한글이 아니면
               {                       //1byte의 ASCII Code를 출력해라.
                    printf("%c",ucData[uiCnt]);
               }

               if(uiRet < uiCnt)
                    break;              
          }
          if(uiRet < uiCnt)
                    break;

           
          putchar('\n');
     }
    
     fclose(st_File_Dsc);
     return 0;
}

         /* 초록색 if문이 들어감으로써 16번 다돌지 않고 스톱을 하는걸 확인할수 있다 */


마지막 문제점 발견이 되었다 마지막 부분 아스키코드부분이 HEXA에 있기때문이다 이부분을 수정해보자

 

#include <stdio.h>

int main(int argc, char * argv[])
{
     unsigned int uiCnt;
     unsigned int uiLine;
     unsigned int uiLen;     //uiLen byte만큼 출력해라.
     FILE * st_File_Dsc;
     unsigned char ucData[16];

     if(argc != 2)
     {
          printf("사용법 : %s 파일 이름 확장자\n", argv[0]);
          return 100;
     }

     st_File_Dsc = fopen(argv[1], "rb");
    
     if(st_File_Dsc == 0)
     {
          printf("파일을 열수 없습니다:[%s] \n",argv[1]);
          return 200;
     }



     printf("===================================================================== \n");
     printf("  ADRESS                      HEXA                          ASCII     \n");
     printf("===================================================================== \n");

    
     for (uiLine = 0; uiLine < 20; uiLine ++)
     {
          fread(ucData, sizeof(ucData), 1, st_File_Dsc);     //적음으로써 아스키코드가들어간다
          /***********Address 값 출력 부분***********/
          printf(" %08X ",uiLine * 16);               //주소가 16진수이므로 10씩 증가한다.
          /***********Hexa 값 출력 부분***********/
          for (uiCnt = 0; uiCnt < 16; uiCnt++)
          {
               printf("%02X ", ucData[uiCnt]); 
               if(uiRet < uiCnt)
               {
                    break;
               }

          }
          /***********ASCII 값 출력 부분***********/
          for (uiCnt = 0; uiCnt < 16; uiCnt++)
          {    
               if (ucData[uiCnt] < 32)          //제어문이면
               {                                        //.을 출력해라.
                    putchar('.');
               }
               else if (ucData[uiCnt] > 127)     //한글이면
               {                                            //.을 출력해라.
                    putchar('.');
                   
               }

               else                    //제어문과  한글이 아니면
               {                       //1byte의 ASCII Code를 출력해라.
                    printf("%c",ucData[uiCnt]);
               }

               if(uiRet < uiCnt)
                    break;              
          }
          if(uiRet < uiCnt)
                    break;
           
          putchar('\n');
           if(uiCnt != 16)        /* 이걸 적음으로써 모든것의 브레이크를 걸수 있다 */
          {
               break;
          }
     }
    
     fclose(st_File_Dsc);
     return 0;
}

        

 

 


 





728x90