센서는 멀쩡한데 보드가 못 알아듣는다 · 클럭 없는 직렬 — UART · 실습
깨진 글자에서 보율을 되찾는다
목표
포착된 표본 열에서 UART 프레임을 직접 해독하고, 송신 클럭이 어긋난 포착에서 실제 비트 시간을 되재어 읽히는 문장을 되살립니다. 그 과정에서 패리티와 프레이밍 오류가 각각 무엇을 잡고 무엇을 놓치는지 숫자로 셉니다.
왜 중요한가
UART 에는 클럭 선이 없습니다. 양쪽이 같은 비트 시간을 믿고 있어야 하는데 그 믿음을 확인할 방법이 프레임마다 한 번, 시작 비트뿐입니다. 그래서 클럭이 어긋나면 프레임 뒤쪽부터 무너지고, 증상은 "글자가 깨진다" 로만 올라옵니다. 이 실습은 그 신고를 몇 퍼센트 어긋났는가라는 숫자로 바꾸는 연습입니다. 값을 고치는 것이 아니라 시간 축을 고친다는 점이 핵심이고, 그 시간 축의 근거는 포착 파일 안에 이미 들어 있습니다.
단계
1. 표본 열에 시간 축을 세운다 — 머리말의 표본 속도로 표본 번호를 시각으로 바꾸고 개요를 남깁니다.
2. 임계값을 올리면 모서리가 움직인다 — rising_edges 를 구현하고 두 임계값의 검출 시각 차이를 잽니다.
3. 프레임 해독기를 쓴다 — 시작 모서리에서 (k + 0.5) 비트 시간 떨어진 표본을 읽는 decode 를 구현합니다.
4. 정상 포착을 읽는다 — 프레이밍 오류 0으로 문장을 얻습니다.
5. 표본을 솎아 판독이 무너지는 곳을 찾는다 — 1·4·10·25·50 간격으로 다시 해독합니다.
6. 명목 보율로 읽었을 때의 증상 — 어긋난 포착의 프레이밍 오류와 가장 짧은 펄스를 잽니다.
7. 비트 시간을 되재어 문장을 되살린다 — 거친 값에서 시작해 긴 기준선으로 좁힙니다.
8. 패리티가 놓친 것을 센다 — 조용히 틀린 프레임이 몇 개인지 셉니다.
참고
- 재료는
/opt/fixtures/serialbus/uart/아래 세 편입니다:hello-9600.csv(정상),drift-8n1.csv,drift-8e1.csv. 읽기 전용이며 고치지 마세요. 형식 설명은 같은 폴더 위의/opt/fixtures/serialbus/README.md에 있습니다. - 포착 파일을 읽는 함수는
capture.py같은 파일 하나에 두고 단계마다 다시 쓰지 마세요. 정답지도 그렇게 합니다. - 파일의
n열은 표본 번호입니다. 시각은n / sample_rate_hz초이고, 파일에 시각 열은 없습니다. - 흔한 실수 하나: 데이터 비트를 높은 자리부터 모으는 것. UART 는 낮은 자리부터입니다.
- 흔한 실수 둘: 비트당 표본 수를 정수로 반올림하는 것. 9600 Bd 를 500 kHz 로 받으면 52.083 이고, 반올림하면 프레임 끝에서 어긋납니다.
- 추가 설치도 인터넷도 필요 없습니다. python3 만 씁니다.
- 예상 70분이므로 기본 60분이 끝나기 전에 +시간으로 연장하세요(최대 180분). 세션이 끝나면
/root가 사라지므로 남기고 싶은 것은 따로 보관하세요.
단계 8개
- 표본 열에 시간 축을 세운다
- 임계값을 올리면 모서리가 움직인다
- 프레임 해독기를 쓴다
- 정상 포착을 읽는다
- 표본을 솎아 판독이 무너지는 곳을 찾는다
- 명목 보율로 읽었을 때의 증상
- 비트 시간을 되재어 문장을 되살린다
- 패리티가 놓친 것을 센다