M5Stack의 SoftwareSerial

M5Stack에서는 SoftwareSerial을 사용합시다.



M5Stack (나는 M5Stic-C를 사용했지만)에서 SoftwareSerial의 주요입니다.

배경



Arduino로 코드 쓸 수 있는 M5Stack에서는, 원래 하드웨어 컨트롤인 시리얼 포트가 3개 있어, 곤란하지 않기 때문에 일부러 프로그램 리소스를 사용할 것 같은 SoftwareSerial은 어떻게 든 생각할지도 모릅니다.
하지만, 적어도 Arduino 베이스로 코드 쓰고 있는 경우, 한 번에 어느 정도 긴 데이터 길이를 UART 로 수신했을 경우, 곤란한 일이 일어날 것인지가 묻는가 생각합니다.

그래, 뭔가 결손하는 것입니다.

이 현상은 M5Stack의 문제라고 하는 것보다 Arduino쪽에 있는 것 같고, 레퍼런스로서는 64Byte의 링 버퍼가 확보되고 있는 것 같지만, 실제로는 16Byte 정도부터 수상해지고 있습니다.
(진짜는 조금 조사하지 않지만, 실제로 32Byte 정도에서 조금 조금 결손하고, 40Byte 넘어 오면 2/3 정도는 제대로 잡히지 않게 되었습니다.

먼저 결론부터



네.
여기에 이른 경위라든지 여러가지 쓰고 싶습니다만, 자신의 비망록적으로도, 우선 대응 방법을 기술합니다.

EspSoftwareSerial 라이브러리 설치



먼저 M5의 ESP32에 제공되는 SoftwareSerial 라이브러리를 설치합니다.
(Arduino 표준이라도 할 수 있을지 모르겠지만, 나는 뭔가 잘못했는지 좋지 않았습니다)

Arduino IDE: 스케치 > 라이브러리 포함 > 라이브러리 관리 >
검색 항목에 "EspSoftwareSerial"을 입력하면 나온다.

이것을 설치.
(이미지는 이미 설치한 후입니다)

코드 no 추기 개소


#include <SoftwareSerial.h>
#define swrxPin 32
#define swtxPin 33
SoftwareSerial mySerial;
readBuf[64];  //64じゃなくても良いですが、十分に受信したい数値で
int read_cnt = 0;

void setup(){
  pinMode(srxPin, INPUT);
  pinMode(stxPin, OUTPUT);
  mySerial.begin(9600, SWSERIAL_8N1, swrxPin, swtxPin , false, 256);
}

void loop(){
  if(mySerial.available()){
    readBuf[read_cnt] = mySerial.read();
    reac_cnt++;
  }

  // あとは受信したいデータ長までのread_cntのカウントクリアとか、受信したreadBufの処理とか。

}

SoftwareSerial의 이점은 무엇입니까?



그렇습니다, 이것이 중요합니다.
UART 긴 데이터를 수신하는 것이 목적으로, 왜 이것으로 잘 작동합니까?
하드웨어 컨트롤의 Serial 포트의 버퍼 사이즈를 바꾸려면 Arduino IDE의 HerdwareSerial.h를 재기록하지 않으면 안된다든가,
또 그것을 해도 M5에서는 작동하지 않았기 때문에, 링 버퍼를 자유롭게 설정할 수 있는 SoftwareSerial이라면 어떨까라고 생각한 것입니다.

SoftwareSerial에서는 시작시 지정



mySerial.begin (9600, SWSERIAL_8N1, swrxPin, swtxPin, false, 256);

마지막 "256"이 해당 링 버퍼의 지정 옵션입니다.

단점은



그것은 물론, 하드웨어 처리 맡겨지지 않기 때문에, 몇 사이클인가 버리게 될까라고 생각합니다.
그러나, M5Stack의 ESP32Core는 240MHz 동작하고 있기 때문에, 실용상 115200bps 이하이면 우선 문제 없을까라고 생각합니다.

그 이상의 보다 풍부한 통신을 한다면 더 다른 통신을 사용하면 좋을까.

끝까지 감사합니다.
Mahalo!

좋은 웹페이지 즐겨찾기