파이썬에서 시리얼 통신

개요



개인적으로 임베디드 개발에서는 디버깅이 어렵다고 느끼고 있으며 대부분의 경우 시리얼 통신을 실시하여 PC에 어떠한 데이터를 보내 확인한다. 그러나 직렬 통신 자체가 이상한 경우 프로그램의 어느 경로를 통과했는지 등은 LED를 빛나게 확인할 수밖에 없다. 또한 Arduino IDE에는 직렬 통신을 사용하여 데이터를 수신하고 표시하고 데이터를 전송할 수있는 도구가 포함되어 있지만 데이터 전송은 문자로 보내지므로 원시 데이터를 보내기가 어렵습니다. ?).

따라서 앞으로 Python에서 직렬 통신을 수행하고 LED를 사용하여 직렬 통신이 올바르게 수행되는지 확인하십시오.

Arduino Uno의 프로그램



Arduino Uno에서 다음 프로그램을 실행합니다.

main.c
#include "serial.h"


int putc(unsigned char c) {
    if (c == '\n') {
        serial_send_byte('\r');
    }
    return serial_send_byte(c);
}

unsigned char getc() {
    return serial_recv_byte();
}

void setout();
void turnon();
void turnoff();

int main(void) {

    serial_init();
    setout();     // シリアルの初期化


    putc('D');       // 1文字出力
    char c = getc(); // 1文字入力を待つ

    turnon();        // LEDを点灯
    putc(++c);       // 受信した文字をインクリメントし,シリアルで出力
    putc('E');       // 1文字出力
    c = getc();      // 1文字入力を待つ

    turnoff();      // LEDを消灯
    putc(++c);      // 受信した文字をインクリメントし,シリアルで出力
    putc(++c);      // 受信した文字をインクリメントし,シリアルで出力
    while(1){}

코멘트에서 알 수 있듯이 Arduino는 단일 문자를 출력 한 다음 수신 -> 전송을 두 번 반복하여 처리를 종료합니다. 그런 다음 첫 번째 수신에서 LED가 켜지고 두 번째 수신에서 LED가 꺼집니다. 따라서, 만일 송수신할 수 없는 경우에서도, LED의 점등/소등으로 어디까지 프로그램이 실행되었는지를 알 수 있다.

파이썬에서 시리얼 통신



파이썬에서 직렬 통신을 수행하기 위해 pyserial를 pip로 설치하십시오.
pip3 install pyserial

그런 다음 Arduino 프로그램에 따라 데이터를 송수신합니다.

test.py
import serial
import time

ser = serial.Serial('/dev/cu.usbmodem142101', 9600, timeout = 1)


while True:
    data: bytes = ser.read();
    if len(data) > 0:
        break

int_data = int.from_bytes(data, 'big')
print(data)
print("data1 = {}".format(int_data)) # Dを読む

time.sleep(0.5)

ser.write(bytes([65])) # aを書く
time.sleep(0.5)
data: bytes = ser.read() # bを読む

int_data = int.from_bytes(data, 'big')
print(data)
print(len(data))
print("data2 = {}".format(int_data))
time.sleep(0.5)
data: bytes = ser.read() # Eを読む
print(data)
time.sleep(0.5)
ser.write(bytes([67])) # cを書く
time.sleep(0.5)
data: bytes = ser.read() # d
print(data)

특히 해설은 필요 없다고 생각하지만, 시리얼 통신은 느리기 때문에, 송수신 중에 0.5초의 슬립을 넣고 있다. 이것을 넣지 않으면 실행이 너무 빨리 보이지 않습니다.


이 구현은 다음 명령으로 시도 할 수 있습니다.
>git clone https://github.com/hiro4669/iosv.git
>cd iosv
>cd serial_py
>make
>make write
>python3 test.py

좋은 웹페이지 즐겨찾기