이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

데이터 쓰기와 읽기

시작하기 전에

데이터를 쓰거나 읽을 때 많은 직렬 포트 응용 프로그램에서 고려해야 할 세 가지 중요한 질문이 있습니다.

  • 읽기 또는 쓰기 함수가 MATLAB® 명령줄에 대한 액세스를 차단할 것인가?

  • 데이터가 이진(숫자형) 또는 텍스트 중 어떤 형식으로 전송되는가?

  • 읽기 또는 쓰기 작업이 어떤 조건에서 완료되는가?

쓰기 작업의 경우 이런 질문에 대한 답은 데이터 쓰기에 나와 있습니다. 읽기 작업의 경우 이런 질문에 대한 답은 데이터 읽기에 나와 있습니다.

예제 — 데이터 쓰기 및 읽기 소개

Windows® 플랫폼에서 직렬 포트 COM1에 연결된 Tektronix® TDS 210 2채널 오실로스코프에 대한 식별 정보를 반환하려 한다고 가정하겠습니다. 이를 위해서는 fprintf 함수를 사용하여 기기에 *IDN? 명령을 쓰고 fscanf 함수를 사용하여 그 명령의 결과를 다시 읽어야 합니다.

s = serial('COM1');
fopen(s)
fprintf(s,'*IDN?')
out = fscanf(s)

결과로 얻는 식별 정보는 다음과 같습니다.

out =
TEKTRONIX,TDS 210,0,CF:91.1CT FV:v1.16 TDS2CM:CMV:v1.04

직렬 포트 세션을 종료합니다.

fclose(s)
delete(s)
clear s

MATLAB 명령줄에 대한 액세스 제어하기

읽기 또는 쓰기 작업이 동기식인지 비동기식인지 지정하여 MATLAB 명령줄에 대한 액세스를 제어합니다.

동기 작업은 읽기 또는 쓰기 함수의 실행이 완료될 때까지 명령줄에 대한 액세스를 차단합니다. 비동기 작업은 명령줄에 대한 액세스를 차단하지 않고 읽기 또는 쓰기 함수가 백그라운드에서 실행되는 동안 명령을 추가로 실행할 수 있습니다.

동기비동기라는 용어는 직렬 포트가 하드웨어 레벨에서 작동하는 방식을 설명할 때 종종 사용됩니다. RS-232 표준은 비동기 통신 프로토콜을 지원합니다. 이 프로토콜을 사용하여 각 장치는 자체적인 내부 클록을 사용합니다. 데이터 전송은 바이트의 시작 비트를 사용하여 동기화되는 반면, 한 개 이상의 정지 비트는 바이트의 끝을 나타냅니다. 시작 비트와 정지 비트에 대한 자세한 내용은 직렬 데이터 형식 항목을 참조하십시오. RS-232 표준에서는 전송되는 비트가 전부 공통 클록 신호로 동기화되는 동기 모드도 지원합니다.

하드웨어 레벨에서는 대부분의 직렬 포트가 비동기식으로 작동합니다. 하지만 여러 읽기 및 쓰기 함수에서 디폴트 동작을 사용하여 동기 직렬 포트의 작동을 모방할 수 있습니다.

참고

이 설명서에서 동기비동기라는 용어를 사용할 때는 읽기 또는 쓰기 작업이 MATLAB 명령줄에 대한 액세스를 차단할지 여부를 지칭하는 것입니다. 즉, 하드웨어가 아닌 소프트웨어의 동작 방식을 설명하는 용어입니다.

데이터를 비동기로 쓰거나 읽을 때의 두 가지 주요 장점은 다음과 같습니다.

  • 쓰기 또는 읽기 함수가 실행 중인 동안 다른 명령을 실행할 수 있습니다.

  • 지원되는 모든 콜백 속성을 사용할 수 있습니다(이벤트와 콜백 항목 참조).

예를 들어, 직렬 포트에는 별개의 읽기 핀과 쓰기 핀이 있기 때문에 데이터를 동시에 읽고 쓸 수 있습니다. 이 점은 아래 도식에 잘 설명되어 있습니다.

데이터 쓰기

이 섹션에서는 다음 세 부분으로 나누어 직렬 포트 장치에 데이터를 쓰는 작업에 대해 설명합니다.

다음 표에는 데이터 쓰기와 관련된 함수가 나와 있습니다.

데이터 쓰기와 관련된 함수

함수 이름설명

fprintf

장치에 텍스트 쓰기

fwrite

장치에 이진 데이터 쓰기

stopasync

비동기 읽기 및 쓰기 작업 중지

다음 표에는 데이터 쓰기와 관련된 속성이 나와 있습니다.

데이터 쓰기와 관련된 속성

속성 이름설명

BytesToOutput

현재 출력 버퍼에 있는 바이트 수

OutputBufferSize

출력 버퍼의 크기(단위: 바이트)

Timeout

읽기 또는 쓰기 작업 완료 대기 시간

TransferStatus

비동기 읽기 또는 쓰기 작업이 진행 중인지 여부 표시

ValuesSent

장치에 쓴 값의 총 개수

출력 버퍼와 데이터 흐름

출력 버퍼는 장치에 쓸 데이터를 저장하기 위해 직렬 포트 객체가 할당하는 컴퓨터 메모리입니다. 장치에 데이터를 쓸 때 데이터 흐름은 다음 두 단계를 따릅니다.

  1. 쓰기 함수에서 지정한 데이터가 출력 버퍼로 전송됩니다.

  2. 출력 버퍼에 있는 데이터가 장치로 전송됩니다.

OutputBufferSize 속성은 출력 버퍼에 저장할 수 있는 최대 바이트 수를 지정합니다. BytesToOutput 속성은 현재 출력 버퍼에 있는 바이트 수를 나타냅니다. 이런 속성의 디폴트 값은 다음과 같습니다.

s = serial('COM1');
get(s,{'OutputBufferSize','BytesToOutput'})
ans = 
    [512]    [0]

출력 버퍼의 크기보다 더 많은 데이터를 쓰려고 하면 오류가 반환되고 아무런 데이터도 쓰이지 않습니다.

예를 들어, fprintf 함수를 사용하여 TDS 210 오실로스코프에 문자열 명령 *IDN?를 쓴다고 가정하겠습니다. 아래 도식에 표시한 것처럼 이 문자열은 먼저 출력 버퍼에 6개의 값으로 기록됩니다.

*IDN? 명령은 종결자가 자동으로 작성되므로 6개의 값으로 구성됩니다. 더욱이, fprintf 함수에 대한 디폴트 데이터 형식은 하나의 값이 1바이트에 상응하도록 되어 있습니다. 바이트와 값에 대한 자세한 내용은 바이트와 값. fprintf를 살펴보십시오. 종결자에 대해서는 텍스트 데이터 쓰기 항목에 설명되어 있습니다.

아래 도식에 표시된 것처럼 문자열은 출력 버퍼에 쓰인 후 직렬 포트를 통해 장치에 쓰입니다.

텍스트 데이터 쓰기

fprintf 함수를 사용하여 장치에 텍스트 데이터를 씁니다. 많은 장치에서, 텍스트 데이터를 쓴다는 것은 장치 설정을 변경하고 데이터 또는 상태 정보를 반환하도록 장치를 준비하는 등의 기능을 수행하는 문자열 명령을 쓴다는 의미입니다.

예를 들어, Display:Contrast 명령을 실행하면 오실로스코프의 디스플레이 대비를 변경할 수 있습니다.

s = serial('COM1');
fopen(s)
fprintf(s,'Display:Contrast 45')

다수의 직렬 포트 장치는 텍스트 기반 명령만 허용하기 때문에 fprintf는 기본적으로 %s\n 형식을 사용하여 데이터를 씁니다. 하지만 fprintf 함수 도움말 페이지에 설명되어 있는 것처럼, 다른 여러 가지 형식을 지정할 수 있습니다.

장치로 전송된 값의 개수를 확인하려면 ValuesSent 속성을 사용하십시오.

s.ValuesSent
ans =
    20

장치로 전송되는 명령에서 각각의 \nTerminator 속성값으로 바뀌기 때문에 ValuesSent 속성값은 종결자를 포함합니다.

s.Terminator
ans =
LF

Terminator의 디폴트 값은 라인 피드 문자입니다. 장치에 필요한 종결자는 해당 문서에 설명되어 있습니다.

동기 쓰기 작업과 비동기 쓰기 작업 비교.  기본적으로, fprintf는 동기식으로 작동하며 실행이 완료될 때까지 MATLAB 명령줄을 차단합니다. 장치에 텍스트 데이터를 비동기식으로 쓰려면 asyncfprintf에 대한 마지막 입력 인수로 지정해야 합니다.

fprintf(s,'Display:Contrast 45','async')

비동기 작업은 MATLAB 명령줄에 대한 액세스를 차단하지 않습니다. 그 밖에도, 비동기 쓰기 작업 진행 중에 다음 작업을 수행할 수 있습니다.

  • 직렬 포트에 읽기 작업용 핀과 쓰기 작업용 핀이 따로 있기 때문에 비동기 읽기 작업 실행 가능

  • 지원되는 모든 콜백 속성 사용 가능

어떤 비동기 작업이 진행 중인지 확인하려면 TransferStatus 속성을 사용하십시오. 진행 중인 비동기 작업이 없는 경우 TransferStatusidle입니다.

s.TransferStatus
ans =
idle

fprintf로 쓰기 작업 완료하기.  fprintf를 사용한 동기 또는 비동기 쓰기 작업은 다음과 같은 경우에 완료됩니다.

  • 지정된 데이터가 다 기록되었을 때

  • Timeout 속성으로 지정된 시간이 경과하면

stopasync 함수를 사용하여 비동기 쓰기 작업을 중지합니다.

종결자 쓰기 규칙.  Terminator 속성값은 cmd에 있는 모든 \n을 대체합니다. 따라서 디폴트 형식 %s\n을 사용할 때 장치에 작성되는 모든 명령은 이 속성값으로 끝납니다. 장치에 필요한 종결자에 대해서는 장치 설명서를 참조하십시오.

이진 데이터 쓰기

fwrite 함수를 사용하여 장치에 이진 데이터를 씁니다. 이진 데이터를 쓴다는 것은 숫자형 값을 쓴다는 의미입니다. 이진 데이터를 쓰는 일반적인 응용 예로는 임의 파형 발생기와 같은 기기에 보정 데이터를 쓰는 경우를 들 수 있습니다.

참고

일부 직렬 포트 장치는 텍스트 기반 명령만 허용합니다. 이런 명령에서는 SCPI 언어 또는 다른 공급업체의 특정 언어를 사용할 수도 있습니다. 따라서 모든 쓰기 작업에 fprintf 함수를 사용해야 할 수도 있습니다.

기본적으로, fwriteuchar 정밀도를 사용하여 값을 변환합니다. 하지만 이 함수에 대한 함수 도움말 페이지에 설명되어 있는 것처럼 다른 여러 가지 정밀도를 지정할 수 있습니다.

기본적으로, fwrite는 동기식으로 작동합니다. 장치에 이진 데이터를 비동기식으로 쓰려면 asyncfwrite에 대한 마지막 입력 인수로 지정해야 합니다. 동기 및 비동기 쓰기 작업에 대한 자세한 내용은 텍스트 데이터 쓰기 항목을 참조하십시오. fwrite에서 쓰기 작업을 완료하기 위해 사용하는 규칙에 대한 설명은 함수 도움말 페이지를 참조하십시오.

흔히 나타나는 오류 해결하기

다음 표에서 흔히 나타나는 fprintf 오류를 파악할 수 있습니다.

오류발생 시점문제 해결

??? Error using ==> serial.fwrite at 199 OBJ must be connected to the hardware with FOPEN.

쓰기 작업을 수행하는데 직렬 포트 객체가 장치에 연결되어 있지 않을 때

fopen을 사용하여 장치에 대한 연결을 설정합니다.

??? Error using ==> serial.fwrite at 199 The number of bytes written must be less than or equal to OutputBufferSize-BytesToOutput.

출력 버퍼가 기록되는 데이터를 모두 수용할 수 없을 때

OutputBufferSize 속성으로 출력 버퍼의 크기를 지정합니다.

??? Error using ==> serial.fwrite at 192 FWRITE cannot be called. The FlowControl property is set to 'hardware' and the Clear To Send (CTS) pin is high. This could indicate that the serial device may not be turned on, may not be connected, or does not use hardware handshaking

  • 직렬 객체에서 FlowControl 속성을 hardware로 설정할 때

  • 장치가 연결되어 있지 않거나, 연결된 장치가 데이터를 수신할 준비가 되지 않았을 때

원격 장치의 상태와 흐름 제어 설정을 확인하여 하드웨어 흐름 제어로 인해 MATLAB에서 오류가 발생하는지 여부를 알아보십시오.

데이터 읽기

이 섹션에서는 다음 세 부분으로 나누어 직렬 포트 장치에서 데이터를 읽는 작업에 대해 설명합니다.

다음 표에는 데이터 읽기와 관련된 함수가 나와 있습니다.

데이터 읽기와 관련된 함수

함수 이름설명

fgetl

장치에서 텍스트 한 줄을 읽고 종결자를 삭제함

fgets

장치에서 텍스트 한 줄을 읽고 종결자를 포함함

fread

장치에서 이진 데이터를 읽음

fscanf

장치에서 데이터를 읽고 텍스트 형식으로 지정

readasync

장치에서 데이터를 비동기식으로 읽음

stopasync

비동기 읽기 및 쓰기 작업 중지

다음 표에는 데이터 읽기와 관련된 속성이 나와 있습니다.

데이터 읽기와 관련된 속성

속성 이름설명

BytesAvailable

입력 버퍼에서 사용 가능한 바이트 수

InputBufferSize

입력 버퍼의 크기(단위: 바이트)

ReadAsyncMode

비동기 읽기 작업이 지속적으로 수행되는지 또는 수동으로 수행되는지 여부를 지정

Timeout

읽기 또는 쓰기 작업 완료 대기 시간

TransferStatus

비동기 읽기 또는 쓰기 작업이 진행 중인지 여부 표시

ValuesReceived

장치에서 읽은 값의 총 개수

입력 버퍼와 데이터 흐름

입력 버퍼는 장치에서 읽을 데이터를 저장하기 위해 직렬 포트 객체가 할당하는 컴퓨터 메모리입니다. 장치에서 데이터를 읽을 때 데이터 흐름은 다음 두 단계를 따릅니다.

  1. 장치에서 읽는 데이터는 입력 버퍼에 저장됩니다.

  2. 입력 버퍼의 데이터는 읽기 함수에서 지정한 MATLAB 변수로 반환됩니다.

InputBufferSize 속성은 입력 버퍼에 저장할 수 있는 최대 바이트 수를 지정합니다. BytesAvailable 속성은 입력 버퍼에서 현재 읽을 수 있는 바이트 수를 나타냅니다. 이런 속성의 디폴트 값은 다음과 같습니다.

s = serial('COM1');
get(s,{'InputBufferSize','BytesAvailable'})
ans = 
    [512]    [0]

입력 버퍼의 크기보다 더 많은 데이터를 읽으려고 하면 오류가 반환되고 아무런 데이터도 읽히지 않습니다.

예를 들어, fscanf 함수를 사용하여 이전에 TDS 210 오실로스코프에 썼던 *IDN? 명령의 텍스트 기반 응답을 읽는다고 가정하겠습니다. 아래 도식에 표시된 것처럼 먼저 직렬 포트를 통해 텍스트 데이터를 입력 버퍼로 읽어옵니다.

읽기 작업에 따라서는 장치에서 반환하는 바이트 수가 얼마인지 모를 수도 있습니다. 따라서 InputBufferSize 속성을 충분히 큰 값으로 미리 설정한 후에 직렬 포트 객체에 연결해야 할 수도 있습니다.

아래 도식에 표시된 것처럼 데이터는 입력 버퍼에 저장된 후 fscanf에서 지정한 출력 변수로 전송됩니다.

텍스트 데이터 읽기

fgetl, fgetsfscanf 함수를 사용하여 장치에서 데이터를 읽고 텍스트 형식으로 지정합니다.

예를 들어, 오실로스코프에 대한 식별 정보를 반환한다고 가정하겠습니다. 이를 위해서는 기기에 *IDN? 명령을 쓰고 그 명령의 결과를 다시 읽어야 합니다.

s = serial('COM1');
fopen(s)
fprintf(s,'*IDN?')
out = fscanf(s)
out =
TEKTRONIX,TDS 210,0,CF:91.1CT FV:v1.16 TDS2CM:CMV:v1.04

많은 직렬 포트 장치에서 반환되는 데이터가 텍스트를 기반으로 하기 때문에 fscanf는 기본적으로 %c 형식을 사용하여 데이터를 읽습니다. 하지만 fscanf 함수 도움말 페이지에 설명되어 있는 것처럼, 다른 여러 가지 형식을 지정할 수 있습니다.

종결자를 포함하여, 장치에서 읽는 값의 개수를 확인하려면 ValuesReceived 속성을 사용하십시오.

s.ValuesReceived
ans =
    56

동기 읽기 작업과 비동기 읽기 작업 비교.  ReadAsyncMode 속성을 사용하여 읽기 작업이 동기인지 비동기인지 지정합니다. ReadAsyncModecontinuous 또는 manual로 구성할 수 있습니다.

ReadAsyncModecontinuous인 경우(디폴트 값) 직렬 포트 객체가 지속적으로 장치를 쿼리하여 데이터를 읽을 수 있는지 계속 확인합니다. 데이터를 사용할 수 있는 경우 데이터는 입력 버퍼에 비동기로 저장됩니다. 입력 버퍼에서 MATLAB으로 데이터를 전송하려면 fgetl 또는 fscanf와 같은 동기식(차단) 읽기 함수 중 하나를 사용하십시오. 입력 버퍼에서 데이터를 사용할 수 있는 경우 이런 함수는 데이터를 빠르게 반환합니다.

s.ReadAsyncMode = 'continuous';
fprintf(s,'*IDN?')
s.BytesAvailable
ans =
    56
out = fscanf(s);

ReadAsyncModemanual인 경우 직렬 포트 객체는 데이터를 읽을 수 있는지 확인하기 위해 장치를 지속적으로 쿼리하지 않습니다. 데이터를 비동기식으로 읽으려면 readasync 함수를 사용하십시오. 그런 다음, 동기식 읽기 함수 중 하나를 사용하여 입력 버퍼에서 MATLAB으로 데이터를 전송하십시오.

s.ReadAsyncMode = 'manual';
fprintf(s,'*IDN?')
s.BytesAvailable
ans =
    0
readasync(s)
s.BytesAvailable
ans =
    56
out = fscanf(s);

비동기 작업은 MATLAB 명령줄에 대한 액세스를 차단하지 않습니다. 그 밖에도, 비동기 읽기 작업 진행 중에 다음 작업을 수행할 수 있습니다.

  • 직렬 포트에 읽기 작업용 핀과 쓰기 작업용 핀이 따로 있기 때문에 비동기 쓰기 작업 실행 가능

  • 지원되는 모든 콜백 속성 사용 가능

어떤 비동기 작업이 진행 중인지 확인하려면 TransferStatus 속성을 사용하십시오. 진행 중인 비동기 작업이 없는 경우 TransferStatusidle입니다.

s.TransferStatus
ans =
idle

fscanf를 사용한 읽기 작업을 완료하기 위한 규칙.  fscanf를 사용한 읽기 작업은 다음 시점에 MATLAB 명령줄에 대한 액세스를 차단합니다.

  • Terminator 속성으로 지정된 종결자를 읽으면

  • Timeout 속성으로 지정된 시간이 경과하면

  • 지정된 값을 지정된 개수만큼 읽었을 때

  • 입력 버퍼가 다 찰 때

이진 데이터 읽기

fread 함수를 사용하여 장치에서 이진 데이터를 읽습니다. 이진 데이터를 읽는다는 것은 숫자형 값을 MATLAB으로 반환한다는 의미입니다.

예를 들어, 오실로스코프의 커서 및 표시 설정을 반환한다고 가정하겠습니다. 이를 위해서는 CURSOR? 명령과 DISPLAY? 명령을 기기에 쓰고 그런 명령의 결과를 다시 읽어야 합니다.

s = serial('COM1');
fopen(s)
fprintf(s,'CURSOR?')
fprintf(s,'DISPLAY?')

ReadAsyncMode 속성의 디폴트 값은 continuous이므로 장치에서 데이터를 사용할 수 있게 되는 즉시 데이터가 비동기식으로 입력 버퍼로 반환됩니다. 읽는 값의 개수를 확인하려면 BytesAvailable 속성을 사용하십시오.

s.BytesAvailable
ans =
    69

데이터를 MATLAB으로 반환하려면 동기식 읽기 함수를 사용하십시오. 하지만 fgetl, fgets 또는 fscanf를 사용하는 경우 입력 버퍼에 두 개의 종결자가 저장되어 있으므로 함수를 두 번 실행해야 합니다. 한 번의 함수 호출에서 모든 데이터를 MATLAB으로 반환하려면 fread를 사용하십시오.

out = fread(s,69);

기본적으로, fread는 배정밀도 배열로 된 숫자형 값을 반환합니다. 하지만 fread 함수 도움말 페이지에 설명되어 있는 것처럼 다른 여러 가지 정밀도를 지정할 수 있습니다. 숫자형 데이터를 텍스트로 변환하려면 MATLAB char 함수를 사용하십시오.

val = char(out)'
val =
HBARS;CH1;SECONDS;-1.0E-3;1.0E-3;VOLTS;-6.56E-1;6.24E-1
YT;DOTS;0;45

동기 및 비동기 읽기 작업에 대한 자세한 내용은 텍스트 데이터 읽기 항목을 참조하십시오. fread에서 읽기 작업을 완료하기 위해 사용하는 규칙에 대한 설명은 함수 도움말 페이지를 참조하십시오.

예제 — 텍스트 데이터 쓰기와 읽기

이 예제에서는 텍스트 데이터를 쓰고 읽어 직렬 포트 기기와 통신하는 방법을 보여줍니다.

기기는 COM1 포트에 연결된 Tektronix TDS 210 2채널 오실로스코프입니다. 따라서 다음 명령 중 다수는 이 기기 특유의 명령입니다. 오실로스코프의 채널 2에 사인파가 입력되며, 사용자가 수행할 작업은 입력 신호의 피크 간(Peak-to-peak) 전압을 측정하는 것입니다.

  1. 직렬 포트 객체 만들기 — 직렬 포트 COM1과 관련된 직렬 포트 객체 s를 만듭니다.

    s = serial('COM1');
  2. 장치에 연결 — s를 오실로스코프에 연결합니다. ReadAsyncMode 속성의 디폴트 값은 continuous이므로 기기에서 데이터를 사용할 수 있게 되는 즉시 데이터가 비동기식으로 입력 버퍼로 반환됩니다.

    fopen(s)
  3. 데이터 쓰기와 읽기 — fprintf를 사용하여 기기에 *IDN? 명령을 쓰고 fscanf를 사용하여 명령의 결과를 다시 읽습니다.

    fprintf(s,'*IDN?')
    idn = fscanf(s)
    idn =
    TEKTRONIX,TDS 210,0,CF:91.1CT FV:v1.16 TDS2CM:CMV:v1.04

    측정 소스를 확인할 필요가 있습니다. 가능한 측정 소스로는 오실로스코프의 채널 1과 채널 2가 포함됩니다.

    fprintf(s,'MEASUREMENT:IMMED:SOURCE?')
    source = fscanf(s)
    source =
    CH1

    이 오실로스코프는 채널 1에서 측정값을 반환하도록 구성되어 있습니다. 입력 신호가 채널 2에 연결되어 있기 때문에, 이 채널에서 측정값을 반환하도록 기기를 구성해야 합니다.

    fprintf(s,'MEASUREMENT:IMMED:SOURCE CH2')
    fprintf(s,'MEASUREMENT:IMMED:SOURCE?')
    source = fscanf(s)
    source =
    CH2

    피크 간(Peak-to-peak) 전압을 반환하도록 오실로스코프를 구성한 다음, 이 측정값을 요청합니다.

    fprintf(s,'MEASUREMENT:MEAS1:TYPE PK2PK')
    fprintf(s,'MEASUREMENT:MEAS1:VALUE?')

    fscanf를 사용하여 입력 버퍼에서 MATLAB으로 데이터를 전송합니다.

    ptop = fscanf(s,'%g')
    ptop =
    2.0199999809E0
  4. 연결 끊기 및 정리 — 더 이상 s가 필요하지 않으면 기기에서 연결을 끊고 메모리와 MATLAB 작업 공간에서 제거하십시오.

    fclose(s)
    delete(s)
    clear s

예제 — textscan을 사용하여 입력 데이터 구문 분석하기

이 예제에서는 textscan 함수를 사용하여 장치에서 읽는 데이터의 구문을 분석하고 형식을 지정하는 방법을 보여줍니다. textscan은 문자열을 하나 이상의 변수로 구문 분석하는데 각 변수마다 자체적으로 지정된 형식이 있는 경우에 특히 유용합니다.

기기는 직렬 포트 COM1에 연결된 Tektronix TDS 210 2채널 오실로스코프입니다.

  1. 직렬 포트 객체 만들기 — 직렬 포트 COM1과 관련된 직렬 포트 객체 s를 만듭니다.

    s = serial('COM1');
  2. 장치에 연결 — s를 오실로스코프에 연결합니다. ReadAsyncMode 속성의 디폴트 값은 continuous이므로 기기에서 데이터를 사용할 수 있게 되는 즉시 데이터가 비동기식으로 입력 버퍼로 반환됩니다.

    fopen(s)
  3. 데이터 쓰기와 읽기 — fprintf를 사용하여 기기에 RS232? 명령을 쓰고 fscanf를 사용하여 명령의 결과를 다시 읽습니다. RS232?는 RS-232 설정을 쿼리하여 전송 속도, 소프트웨어 흐름 제어 설정, 하드웨어 흐름 제어 설정, 패리티 유형 및 종결자를 반환합니다.

    fprintf(s,'RS232?')
    data = fscanf(s)
    data =
    9600;0;0;NONE;LF

    textscan 함수를 사용하여 data 변수를 5개의 새 변수로 구문 분석하고 형식을 지정합니다.

    C = textscan(a, '%d%d%d%s%s','delimiter',';'); 
    
    [br, sfc, hfc, par, tm] = deal(C{:});
    
    br =
            9600
    sfc =
         0
    hfc =
         0
    par = 
        'NONE'
    tm = 
        'LF'
  4. 연결 끊기 및 정리 — 더 이상 s가 필요하지 않으면 기기에서 연결을 끊고 메모리와 MATLAB 작업 공간에서 제거해야 합니다.

    fclose(s)
    delete(s)
    clear s

예제 — 이진 데이터 읽기

이 예제에서는 TDS 210 오실로스코프 화면 표시를 MATLAB으로 다운로드하는 방법을 보여줍니다. 화면 표시 데이터는 Windows 비트맵 형식을 사용하여 디스크로 전송 및 저장됩니다. 이 데이터는 보존 가능한 작업 기록을 제공하며, 이는 중요한 신호와 오실로스코프 파라미터를 쉽게 문서화할 수 있는 방법입니다.

전송되는 데이터의 양이 상당히 클 것으로 예상되므로 기기에서 데이터를 사용할 수 있게 되는 즉시 데이터를 비동기식으로 입력 버퍼로 반환합니다. 따라서 전송 중에 다른 작업을 수행할 수 있습니다. 또한, 오실로스코프는 최고 19,200의 전송 속도로 구성됩니다.

  1. 직렬 포트 객체 만들기 — 직렬 포트 COM1과 관련된 직렬 포트 객체 s를 만듭니다.

    s = serial('COM1');
  2. 속성값 구성 — 충분한 크기의 바이트 수를 허용하도록 입력 버퍼를 구성하고, 전송 속도는 오실로스코프에서 지원하는 가장 높은 값으로 구성합니다.

    s.InputBufferSize = 50000;
    s.BaudRate = 19200;
  3. 장치에 연결 — s를 오실로스코프에 연결합니다. ReadAsyncMode 속성의 디폴트 값은 continuous이므로 기기에서 데이터를 사용할 수 있게 되는 즉시 데이터가 비동기식으로 입력 버퍼로 반환됩니다.

    fopen(s)
  4. 데이터 쓰기와 읽기 — 화면 표시를 비트맵으로 전송하도록 오실로스코프를 구성합니다.

    fprintf(s,'HARDCOPY:PORT RS232')
    fprintf(s,'HARDCOPY:FORMAT BMP')
    fprintf(s,'HARDCOPY START')

    모든 데이터가 입력 버퍼로 전송될 때까지 기다린 후 데이터를 부호 없는 8비트 정수로 MATLAB 작업 공간으로 전송합니다.

    out = fread(s,s.BytesAvailable,'uint8');
  5. 연결 끊기 및 정리 — 더 이상 s가 필요하지 않으면 기기에서 연결을 끊고 메모리와 MATLAB 작업 공간에서 제거하십시오.

    fclose(s)
    delete(s)
    clear s

비트맵 데이터 보기

비트맵 데이터를 보려면 다음 단계를 따르십시오.

  1. 디스크 파일을 엽니다.

  2. 데이터를 디스크 파일에 씁니다.

  3. 디스크 파일을 닫습니다.

  4. imread 함수를 사용하여 데이터를 MATLAB으로 읽어옵니다.

  5. imagesc 함수를 사용하여 데이터를 스케일링하고 표시합니다.

참고로, fopen, fwritefclose 함수의 파일 I/O 버전이 사용됩니다.

fid = fopen('test1.bmp','w');
fwrite(fid,out,'uint8');
fclose(fid)
a = imread('test1.bmp','bmp');
imagesc(a)

오실로스코프가 두 가지 색만으로 화면 표시 데이터를 반환하므로 그에 맞는 컬러맵을 선택해야 합니다.

mymap = [0 0 0; 1 1 1];
colormap(mymap)

다음 도식은 결과 비트맵 이미지를 보여줍니다.