개인적으로 준비중인 프로젝트가 있는데, 센서 모트와 호스트 PC가 시리얼 통신을 하는 부분이 있었습니다.
리눅스로 QT프로그래밍을 사용해서 UI를 만들까 하다가... 워낙 .NET을 좋아하는지라... .NET으로 구현해보자고 생각을 하고...일단 콘솔에서 되는 아주 간단한 코드를 하나 짜봤습니다.
워낙 기초적인 것이니...그냥 초보자분들만 시리얼통신할 때 이렇게 하는구나라고만 생각해주세요 ^^;;
[아래부터는 CODE]
using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports; // SerialPort 클래스 사용을 위해서 추가
using System.Threading; // Thread 클래스 사용을 위해서 추가
namespace ConsoleTest
{
class PortSample
{
private SerialPort port; // 시리얼포트 선언
private Thread reader, writer ; // 시리얼을 통해서 데이터를 읽고, 쓸 스레드 준비
public PortSample()
{
try
{
port = new SerialPort("COM1", 115200, Parity.None, 8); // 이건 제 설정에 맞춰서 함
/* 아래처럼 개별적으로 설정가능합니다.(UI구성시 입력폼으로 받아서 설정하면 되겠지요)
port = new SerialPort();
port.PortName = "COM1";
port.BaudRate = 115200;
port.Parity = Parity.None;
port.DataBits = 8;
port.StopBits = StopBits.One;
*/
port.Open(); // 설정된 포트를 엽니다.
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
public void Start()
{
reader = new Thread(new ThreadStart(Read)); // Read()를 수행하는 스레드 reader 생성
reader.IsBackground = true; // read는 백그라운드에서 수행하고,
reader.Start(); // reader 스레드를 실행
writer = new Thread(new ThreadStart(Write)); // Write()를 수행하는 스레드 writer 생성
writer.Start(); // write는 실제적으로 콘솔창에 입력해야 하므로 foreground로 수행하게 합니다.
}
// Writer thread for Serial port
public void Write()
{
for(;;)
{
port.WriteLine(Console.ReadLine()); // 계속 반복하면서 입력된 데이터가 있으면 열려잇는 포트로 데이터 전송
Thread.Sleep(200); // 200ms마다 스레드를 잠재워서 다른 스레드가 수행가능하게 합니다.(요건 스레드 프로그래밍을 해보셨으면 아시리라 생각...=_=
}
}
// Reader thread for Serial port
public void Read()
{
for(;;)
{
Console.Write(port.ReadExisting()); // 열려있는 포트에서 데이터가 존재하면 읽어봐서 콘솔창에 뿌립니다.
Thread.Sleep(200); // 위와 마찬가지 이유로 sleep시킴
}
}
static void Main(string[] args)
{
PortSample ps = new PortSample(); // 해당 객체를 생성하고, start시킵니다.
ps.Start();
}
}
}
뭐...허접한 코드입니다. codeproject에 있는거랑 같다고 보시면 됩니다.
혹시나 이 사이트에서 시리얼통신에 대한 기초적인 궁금증을 가지신 분이 있을까해서 올립니다~
그럼 수고하세요~