본문으로 건너뛰기

직렬 장치와 Arduino

Serial* 기본 제공 함수는 COM 포트로 표시되는 모든 장치와 통신합니다. USB로 연결한 Arduino, ESP32 또는 Raspberry Pi Pico, USB-직렬 변환기, GPS 수신기, 직렬 모드의 바코드 스캐너, 영수증 또는 라벨 프린터, G-code를 받는 3D 프린터나 CNC 컨트롤러, 실험 장비, 직접 만든 단추 상자, 매크로 패드, 회전 노브 또는 LED 컨트롤러가 이에 해당합니다. 장치는 텍스트 줄을 주고받으며, 스크립트는 그 줄을 Input.Observer가 할 수 있는 다른 모든 동작으로 바꿉니다.

활용 예:

  • 단추 상자 또는 매크로 패드. Arduino가 단추를 읽어 B1, B2, ...를 출력합니다. 직렬 모니터가 각 줄을 바로 가기 키, 미디어 키 또는 창 명령으로 바꿉니다.
  • 볼륨 또는 스크롤 노브. 가변 저항이나 로터리 인코더가 위치를 출력하면, 모니터가 볼륨을 설정하거나 스크롤합니다.
  • 상태 표시등. 제스처나 단축키가 LED 스트립을 구동하는 보드에 LED 255 0 0을 보내, 기록이 켜져 있거나 빌드가 실패했음을 불빛으로 알립니다.
  • 센서. 타이머가 보드에 온도나 조도를 요청하여 표시하거나, 파일에 기록하거나, 화면을 어둡게 합니다.
  • 스캐너와 판독기. 판독기가 보내는 모든 바코드나 RFID 태그가 입력된 텍스트, 검색 또는 파일 조회가 됩니다.
  • 기계. 명령마다 SerialWriteTextLine을 한 번씩 호출하여 프린터나 플로터에 G-code 줄을 보냅니다.

포트 찾기​

Windows는 각 장치에 COM3 같은 이름을 부여합니다. 장치 관리자의 포트(COM & LPT) 아래에 표시되며, Arduino IDE에서는 보드 메뉴에 표시됩니다. 스크립트로도 목록을 가져올 수 있습니다.

n = SerialEnumeratePorts();
if (n == 0) UtilityPrint("No COM ports. Is the board plugged in?");
for (i = 0; i < n; i = i + 1) {
UtilityPrint(SerialGetEnumeratedPortAt(i));
}

목록은 번호순으로 정렬되므로 COM3이 COM10보다 앞에 옵니다. 장치를 다른 USB 소켓으로 옮기면 번호가 바뀔 수 있습니다.

속도, 프레이밍, 줄 끝​

  • 속도(baudRate)는 장치와 일치해야 합니다. Arduino 스케치의 Serial.begin(...)에 있는 숫자로, 보통 9600 또는 115200입니다.
  • 프레이밍은 거의 항상 데이터 비트 8개, 패리티 없음, 정지 비트 1개입니다: 8, SerialParity.None, SerialStopBits.One. 상수를 쓰십시오. 정지 비트 인수에 숫자 1을 그대로 쓰면 정지 비트 1.5개를 뜻합니다.
  • 줄 끝. 받은 줄은 지정한 terminator에서 끝나며, 이 종결자는 줄에서 제거됩니다. 빈 텍스트는 CR LF를 뜻하며, Arduino의 Serial.println이 보내는 형식입니다. LF만으로 줄을 끝내는 장치에는 "\n"을, CR만으로 끝내는 장치에는 "\r"을 사용하십시오. SerialWriteTextLine은 보내는 내용을 같은 종결자로 끝내며, 호출이 직접 포트를 열면 CR LF로 끝냅니다. CR LF를 사용하면 Serial.readStringUntil('\n')으로 읽는 Arduino 스케치는 끝에 CR이 붙은 줄을 받으며, trim()으로 제거할 수 있습니다. "\n"을 사용하면 제거할 CR이 없습니다.
  • 신호. 포트를 열면 Arduino IDE와 마찬가지로 DTR 및 RTS 신호가 켜집니다. 이로 인해 대부분의 Arduino Uno와 Nano 보드, 그리고 같은 재설정 회로를 가진 다른 보드가 다시 시작됩니다.

장치와 통신하는 세 가지 방법​

  • 질문 하나, 응답 하나. 열려 있지 않은 포트에 SerialWriteTextLine이나 SerialGetTextLine을 호출하면 그 호출 한 번 동안 호출의 baudRate, 8-N-1로 포트를 엽니다. 포트가 이미 열려 있으면 baudRate 인수는 무시됩니다. 포트가 열릴 때 다시 시작되지 않는 장치에 적합합니다. 직렬 장치에 질문하기를 참조하십시오.

  • 열어 둔 포트. SerialOpenPort는 SerialClosePort를 호출할 때까지 지정한 설정으로 포트를 열어 두고, 장치가 보내는 모든 줄을 모아 SerialGetTextLine으로 읽을 수 있게 합니다. 대부분의 Arduino Uno와 Nano 보드는 포트가 열릴 때마다 다시 시작되므로, Load 전역 이벤트([구성 로드됨])에서 포트를 한 번 열고 제스처와 단축키가 그 포트에 쓰게 하십시오. SerialOpenPort는 포트가 없거나 분리되었거나 다른 프로그램에서 열려 있으면 false를 반환하며, Input.Observer가 이미 열어 둔 포트나 모니터가 사용 중인 포트이면 작업을 오류로 중지합니다.

    // Load global event: open the port once, at the sketch's speed. An Uno or Nano
    // restarts every time its port opens, so a port opened per command would lose
    // the command while the board boots.
    if (!SerialOpenPort("COM4", 115200, SerialParity.None, 8, SerialStopBits.One, "")) {
    UtilityPrint("COM4 isn't available: unplugged, or open in the Arduino IDE's Serial Monitor?");
    }

    // Any gesture or hotkey: send a command line and read the board's reply.
    // (The sketch reads a line with Serial.readStringUntil('\n') and answers OK.)
    if (SerialWriteTextLine("COM4", "LED 255 0 0", 115200)) {
    reply = SerialGetTextLine("COM4", 1, 115200);
    if (reply != "OK") UtilityPrint(StringFormat("Board said: {0}", reply, ""));
    }
  • 모니터. SerialMonitorCreate는 SerialMonitorDelete를 호출할 때까지 장치가 보내는 줄마다 백그라운드에서 스크립트를 실행합니다. 해당 줄은 ContextGetSerialTextLine()입니다. 직렬 장치의 단추를 미디어 키에 매핑하기와 다음 예제를 참조하십시오.

    // Arduino side: a potentiometer on A0, one reading per line.
    // void setup() { Serial.begin(115200); }
    // void loop() { Serial.println(analogRead(A0)); delay(50); }
    // Empty text as the terminator means CR LF, which Serial.println sends.
    SerialMonitorCreate("knob", "COM4", 115200, SerialParity.None, 8, SerialStopBits.One, "",
    "line = ContextGetSerialTextLine(); if (StringIsNumber(line, true)) MultimediaSetVolume(AudioEndpoint.Playback, StringToNumber(line, true) / 1023.0);");
노트

모니터에 대해 알아 둘 점.

  • 줄은 도착한 순서대로 한 번에 하나씩 실행됩니다. 다음 줄의 스크립트는 이전 줄의 스크립트가 끝나면 시작됩니다. 최대 256줄이 대기하며, 이를 넘으면 가장 오래된 줄부터 버려집니다.
  • 모든 작업을 중지하면 줄에 대해 실행 중인 스크립트가 중지되고 대기 중인 줄이 버려집니다. 모니터 자체는 계속 실행됩니다. 모든 작업 중지 단축키는 더 나아가 모든 모니터를 삭제하고 해당 포트를 닫습니다.
  • 모니터 자신의 스크립트를 포함한 모든 스크립트가 SerialWriteTextLine으로 모니터링 중인 포트에 보낼 수 있으므로, 모니터가 장치에 응답할 수 있습니다. SerialGetTextLine은 모니터링 중인 포트를 읽을 수 없습니다. 모든 줄은 모니터로 갑니다.
  • 각 모니터 이름은 하나의 포트에 속합니다. 이 포트의 모니터 이름으로 SerialMonitorCreate를 호출하면 해당 모니터가 바뀝니다. 이름이 이미 다른 포트를 모니터링하고 있거나, 포트가 SerialOpenPort로 열려 있거나, 다른 모니터가 포트를 사용 중이면 작업이 오류로 중지됩니다. 포트가 없거나 분리되었거나 다른 프로그램에서 열려 있으면 false를 반환합니다.
  • 장치를 분리하면 모니터가 종료되고 콘솔의 시스템 탭에 한 줄이 기록됩니다. 장치를 다시 연결해도 모니터는 자동으로 다시 시작되지 않습니다. SerialMonitorCreate를 다시 실행하십시오(단축키에서, 또는 다음 시작 시 Load 이벤트에서).
경고

COM 포트는 한 번에 한 프로그램만 열 수 있습니다. Arduino IDE의 시리얼 모니터나 시리얼 플로터가 열려 있으면 Input.Observer가 포트를 열 수 없고, Input.Observer가 포트를 열고 있으면 IDE가 스케치를 업로드할 수 없습니다. 업로드하기 전에 포트를 닫으십시오(SerialClosePort 또는 SerialMonitorDelete).