각종 CHIP

CH341 칩을 이용해서 UART,I2C,SPI 통신하기 2편(UART)

원원 2024. 12. 8. 18:37

안녕하세요. CH341 칩을 이용해서 UART통신을 해보겠습니다.

CH341뿐만아니라 다른 usb to uart 칩이면 사용하는방법은 다르지않습니다.

* 하드웨어 구성
CH341에서 uart통신을 해야하므로 2,3번을 연결해줍니다
CH341과 다른 usb to uart칩을 이용해서 연결을 합니다. (RX, TX, GND)



* 프로그램 구성
사용하는 언어는 C# Winform입니다. C#에서 UART통신은 System.Io.Ports 네임스페이스를 이용하면 됩니다. 

대략적인 구성은 위와같습니다. 시리얼 통신 프로그램(테라텀)과 여기서 만드는 프로그램과 통신을 할건데 통신통로는 uart입니다.


* Serial port open하기
Serial port를 선언하고 baudrate, stop bit, com port번호, parity 등등 설정을하고 open함수를 호출하면 됩니다.
uart통신에대한 자세한 설명 :https://wowon.tistory.com/269
이 중에  baudrate만 일반적으로 바꿔서 사용하고 나머지는 자주쓰는 옵션이 있습니다.
(parity : 사용안함, databits : 8bit, stopbits : 1bit)
Serialport에서도 기본설정이 위와같이 되어있습니다. 그래서 프로그램는 baudrate만 설정하게 해놨습니다.


*Serial port write하기

open 이후에 write함수를 호출하면 됩니다. 전달인자는 배열로도 가능하고 string으로도 가능합니다


*Serial port Read하기
Read방식에는 원할때 한번만 읽는 falling 방식과 계속 읽는 interrupt 방식이 있습니다.
falling 방식은 원할때 read를 해주면 됩니다.

interrupt방식은 DataReceived에 이벤트핸들러를 등록하고 거기에서 read함수를 호출하면 됩니다.


*프로그램테스트
UART_TEST 프로그램에서 send를 누르면 teraterm으로 데이터를 보내고, teraterm에서 데이터를 입력하면 UART_TEST가 데이터를 수신합니다.


*소스코드설명(소스코드는 아래쪽에 있습니다)
(1) 업로드한 소스코드에서 Form1.cs는 UI가 있는 코드이고 uart관련코드는 Uart.cs에 클래스를 따로 만들었습니다.

(2) Receive 방식
uart = new Uart(serialPort1,Uart.DataReceiveMode.EventBased);
전달인자로 데이터를 읽을때 falling방식으로 읽을지 interrupt방식으로 읽을지 선택하게 했습니다.
                if (_mode == DataReceiveMode.EventBased)
                {
                    _serialPort.DataReceived += SerialPort_DataReceived;
                }
interrupt방식일때만 DataReceived이벤트핸들러를 등록합니다.

(3) comport 갱신
comport combobox를 클릭할때마다 port가 갱신되도록 했습니다.



*소스코드(Commits : uart update)
https://github.com/yhunterr/CH341_com_csharp