BASIC4MCU | 질문게시판 | 답변 : 시리얼 통신 관련 질문드립니다. ㅜ
페이지 정보
작성자 master 작성일2024-04-18 06:39 조회3,977회 댓글6건본문
#include <SoftwareSerial.h>
#include <Wire.h> // Wire 라이브러리 추가
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,OLED_RESET);
SoftwareSerial gpsSerial(6,7); // RX,TX
const int switchPin=3;
//
int switchState=LOW,lastSwitchState=LOW;
int numBaudRates=sizeof(baudRates)/sizeof(baudRates[0]);
long currentBaudRate,baudRates[]={1200,2400,4800,9600,19200,38400,57600,115200};
unsigned long lastDebounceTime=0,debounceDelay=50,switchDelay=200,lastSwitchTime=0;
//
void setup(){
Serial.begin(9600);
gpsSerial.begin(baudRates[0]);
currentBaudRate=baudRates[0];
pinMode(switchPin,INPUT);
if(!display.begin(SSD1306_SWITCHCAPVCC,0x3C)){ Serial.println(F("SSD1306 allocation failed")); for(;;); }
display.display(); delay(2000); display.clearDisplay();
display.setFont(); display.setTextSize(0); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0);
}
//
void loop(){
static int n=0;
unsigned long currentTime=millis();
int reading=digitalRead(switchPin);
if(reading !=lastSwitchState)lastDebounceTime=millis();
//
if(currentTime-lastDebounceTime>debounceDelay){
if(reading!=switchState){ switchState=reading; if(switchState==HIGH)toggleBaudRate(); }
}
while(gpsSerial.available()>0){
int i=gpsSerial.read(); Serial.write(i); display.write(i);
if(i=='\n'){ display.display(); if(++n>3)n=0; display.setCursor(0,n); }
}
}
//
void toggleBaudRate(){
static int index=0;
currentBaudRate=baudRates[index];
gpsSerial.begin(currentBaudRate);
Serial.print("Changed Baud Rate to "); Serial.println(currentBaudRate);
display.clearDisplay();
display.setCursor(0,0); display.print("Baud Rate: "); display.println(currentBaudRate);
display.display();
index=(index+1)%numBaudRates;
}
댓글 6
조회수 3,977카르니코스님의 댓글
카르니코스 작성일
오! 감사합니다.
근데 나오긴 나오는데 제자리에서만 계속 나오네요...;
시리얼 모니터처럼 아래로 계속 스크롤 되게 할 수는 없을까요?
---------------------------------------------------------------------------------
어... 시리얼 모니터 상에서
$GNRMC,,V,,,,,,,,,,M*4E
$GNVTG,,,,,,,,,M*2D
$GNZDA,,,,,,*56
$GPTXT,01,01,01,ANTENNA OK*35
$GNGGA,,,,,,0,00,25.5,,,,,,*64
$GNGLL,,,,,,V,M*79
$GPGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5*02
$BDGSA,A,1,,,,,,,,,,,,,25.5,25.5,25.5*13
$GPGSV,1,1,00*79
$BDGSV,1,1,00*68
이렇게 나오고 있는줄 알았는데, 소스 수정 후
$GPGSA,A,1,,,,,,,,,,,,,25.5,25.5,5*
BA,,,,,$GNGGA,,,,,,0,00,25.5,,,,,,*64
$GNGLL,,,,,,V,M*79
$GPGSA,A,1,,,,,,,,,,,,,25.5,25.5,5*
BS,,,,,$GNGGA,,,,,,0,00,25.5,,,,,,*64
$GNGLL,,,,,,V,M*79
$GPGSA,A,1,,,,,,,,,,,,,25.5,25.5,.0
D,1,,,2$GNGGA,,,,,,0,00,25.5,,,,,,*64
$GNGLL,,,,,,V,M*79
$GPGSA,A,1,,,,,,,,,,,,,25.5,25.5,5*
BSA,,,,$GNGGA,,,,,,0,00,25.5,,,,,,*64
$GNGLL,,,,,,V,M*79
$GPGSA,A,1,,,,,,,,,,,,,25.5,25.5,5*
이렇게 불규칙하게 표시되고 있습니다 ㅜ
카르니코스님의 댓글
카르니코스 작성일
while (gpsSerial.available()>0) {
char c = gpsSerial.read();
if (c == '$') { // 줄바꿈 문자 처리
currentLine += lineHeight;
if (currentLine >= SCREEN_HEIGHT) { // 화면 끝에 도달했는지 검사
currentLine = 0; // 커서 위치 초기화
display.clearDisplay(); // 화면 클리어
}
display.setCursor(0, currentLine); // 커서를 새 줄로 이동
} else {
if (display.getCursorX() + 6 >= SCREEN_WIDTH) { // 현재 라인에서 추가 문자가 화면을 넘어가는지 검사
currentLine += lineHeight;
if (currentLine >= SCREEN_HEIGHT) {
currentLine = 0;
display.clearDisplay();
}
display.setCursor(0, currentLine); // 커서를 새 줄로 이동
}
display.print(c); // 문자 출력
}
}
// 화면 갱신
display.display();
이렇게 했더니 의도대로 문자가 겹치지 않고 구분할 수 있게 스크롤 되고 있긴 한데 모든 신호가 표시되지 않고 불규칙하게 중간중간 소실되는게... 처리과정에서 무슨 문제가 있는건지 모르겠네요ㅜㅜ
master님의 댓글
master 작성일
OLED 가로폭 문자수가 제한되는데
GPS에서 긴 문장이 넘어오면 표시 할 수가 없겠죠
카르니코스님의 댓글
카르니코스 작성일아두이노 프로그램 시리얼 모니터 상에서도 짤려서 나오는데 그거랑 관련이 있으려나요?..
master님의 댓글
master 작성일
//Serial.begin(9600);
Serial.begin(115200);
시리얼모니터 통신속도를 높여보세요
카르니코스님의 댓글
카르니코스 작성일
감사합니다.
하드웨어 시리얼로 처리하는 방식으로 바꾸니
이상없이 잘 나오네요. 답변 감사했습니다.