(u_u)

pythonでmbedとシリアル通信をする

Categories: [blog]
Tags: [ubuntu], [platformIO], [ubuntu18.04], [Mbed], [mbed os], [serial], [pyserial], [thread]

あけましておめでとうございます。
pythonでmbedとシリアル通信をするとき、ループの処理が重いと転送の間隔が空いてしまい、リアルタイムに制御できないときがあります。
その時はSerialを別Threadにすることで解決できました。

import threading
import serial
from time import sleep

def portIsUsable(portName):
    global mbedSerial
    try:
        serial.Serial("/dev/ttyACM0", 115200)
        return True
    except:
        return False

def sendSerial():
    while True:
        mbedSerial = serial.Serial("/dev/ttyACM0", 115200)
        mbedSerial.write(bytes([leftMotorSpeed, rightMototSpeed]))
        mbedSerial.close()
        sleep(0.01)

while(not(portIsUsable("/dev/ttyACM0"))):
    None

serialThread = threading.Thread(target=sendSerial)
serialThread.start()

mbed

#include "mbed.h"

RawSerial pc(USBTX, USBRX); //rtosの機能を使うときはSerialではなくRawSerialを使えとの情報をみてこうしています。
char leftSpeed = 255, rightSpeed = 255;

void serialRx(){
  while (1) {
    if (pc.readable()) {
      rightSpeed = pc.getc();
      leftSpeed = pc.getc();
      led = !led; //LEDが点滅してることでシリアル通信をしていることが伺えます。
    }
  }
}

void motor(){
    while(1){
        //モータで使う処理
    }
}

int main(void){
    Thread serialRxThread;
    Thread mototThread;
    serialRxThread.start(&serialRx);
    motorThread.start(&motor);
    while(1){
    }
}