
(모듈)DTR
(모듈)RX[송신부] ----- (MCU) TX [PA9를 브레드 보드 60번에 연결]
(모듈)TX[수신부] ----- (MCU) RX [PA10를 브레드 보드 55번에 연결]
(모듈)VCC
(모듈)CTS
(모듈)GND ----- (브레드 보드) 마이너스
(MCU)GND ----- (브레드 보드) 마이너스


Asynchronous : 비동기
Synchronous : 동기
huart는 UART_HandleTypeDef라는 구조체에서 huart1으로 선언되어 있다.
구조체의 변수인 huart1에 접근 및 값을 채워준다.
HAL_UART_Transmit()의 매개변수를 보면 위와 같다. UART_HandleTypeDef는 포인터 변수 *huart를 가리키므로 &huart1을 해야 한다.
[ huart1의 주소값은 &(huart1.Instance)의 주소값과 같은걸로 보아 HAL_UART_Transmit()은 구조체의 정보를 가져와 사용한다. ]
HAL_UART_Transmit(UART번호, 출력할 문자열, 문자 갯수, Timeout)
최종적인 코드는 위와 같다.
이런식으로도 표현이 가능하구나~
//Direct Write
HAL_UART_Transmit(&huart1, "anyang", 6, 1000);
//Select Write
uint8_t tx_data = 'anyang'
HAL_UART_Transmit(&huart1, &rx_data, 6, 1000);
//String Write
uint8_t *tx_data = 'anyang'
HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data), 1000);
비동기 방식 = 클럭 없음(시간이 조금 불정확해도 사용이 가능)
동기 방식 = 클럭 있음(시간을 정확하게 쪼개서 사용)
UART(Universal Asynchronous Receiver Transmit) : 비동기 모드로서 사용되는 시리얼 통신
USART(Universal Synchronus Receiver Transmit) : 동기 모드로서 사용되는 시리얼 통신
Q : 동기 방식에서는 시간을 쪼갠다고 했는데 어떻게 쪼개는건가요?
Baud Rate를 이용하여 쪼갭니다. 예를 들어 Baud Rate가 9600이라면 1초를 9600번 쪼갠것과 같은 의미를 가집니다.
Q : Baud Rate가 작아진다면 어떤 현상이 발생하나요?
Baud Rate를 줄이게 된다면 송신하는 속도가 느려질 수도 있습니다.
추가적으로 송신과 수신의 Baud Rate를 맞춰야지만 원활한 통신이 가능합니다. 그리고 디버그를 할 때는 9600보다는 115200를 선호합니다.
데이터를 송수신 할 때는 시작부분에 Start bit, 끝 부분에 Stop bit를 둬서 바이트의 경계를 나눕니다.
<출처 : http://www.ktword.co.kr/word/abbr_view.php?m_temp1=2304 >
Word Length는 Start bit 이후에 데이터를 8bit를 보낼것인지 9bit를 보낼것인지 결정해주는 역할을 합니다.
(마무리는 항상 Stop bit입니다.)
TX에서 Word Length를 8bit로 설정하고, RX에서 Word Length를 9bit로 설정한다면 오류가 날 가능성이 있다.
시리얼 통신은 노이즈, 오류가 많은 편이다.
++ 동기와 비동기 방식은 또 뭘까?
++ strlen과 sizeof의 차이점
++
uint8_t *tx_data = "jiseong\r\n";
while (1)
{
HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data), 1000);
sizeof를 했더니 "jise"까지만 출력되는걸 확인할 수 있었다. 하지만 strlen을 하면 "jiseong"전부 다 나온다 이유가 뭘까?
++uart 데이터시트를 읽어보는게 좋을거 같다.
++https://kgkang.tistory.com/279
++https://m.blog.naver.com/musk95/221872674042