2013. 5. 6. 12:20

우노와 레오나르도중 뭘 살까 고민하던중에 레오나르도가 키보드처럼 인식 시킬 수 있다라고 주어 듣고 샀다가 좀 난감한 일을 격었습니다.

알고보니 설정문제라니-_-;





 

1.값이 안 읽힌다?

원래 .net에서는 시리얼 포트에 'DataReceived'만 연결하면 시리얼 포트에서 값이 넘어오면 이벤트가 발생해야 합니다.

 

 

그런데 'DataReceived'이벤트는 오지 않고.....

그래서 쓰래드를 만들어서 돌리니 쓰래드가 그냥 죽네 ㅡ,.ㅡ;;;

(오류 메시지도 없이 죽는 경우는 처음 봤습니다;;;)

 

이상해서 타이머추가해서 돌려보니 같은 현상..

(어차피 타이머도 쓰래드같은 역활인지라-_-;;;)

 

 

2.해결 방법

이것 때문에 거의 하루를 날려먹고 망연자실하던중 우연이 검색내용중에 '아두이노 기판 종류에 따라 다른 설정이 필요할 수도 있다.'라는 글을 보고 제가 쓰고 있는 레오나르도 기판은 일반적인 기판이 아니라는것이 떠올랐습니다;;;;

(우노를 많이 쓰더라고요;;;;)

 

그래서 검색해보니 바로 나오네요.

(참고 : 아두이노 포럼 - Topic: Serial communication with C# program: SerialDataReceivedEventHandler doesnt work )

 

레오나르도를 사용 할때는 시리얼 포트의 'DtrEnable'속성과 'RtsEnable'속성을 'true'로 설정해야 값을 읽을 수 있습니다.

 

 

 

3.테스트 해보기

그러면 간단하게 테스트용 프로그램을 만들어 봅시다.

 

 

3-1. 스케치 만들기

아두이노에서 시리얼 포트로 값을 내보낼때는 'Serial.print()'나 'Serial.println()'를 사용합니다.

아래와 같이 아두이노의 스케치를 작성하고 업로드 했습니다.

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  
  Serial.print("                             ");
  Serial.print("aa22");
  Serial.println("bb11");
  
  delay(1);
}



데이터를 출력하기전에 빈값을 붙이는 이유는 출력 값이 짤리는 경우가 있기 때문입니다.

컴퓨터에서는 값을 읽어 공백을 제거한후 사용합니다.

 

아두이노의 '시리얼 모니터'를 통해 값이 출력되고 있음으로 확인합니다.

 

 

값이 잘 나오고 있네요.

 

3-2.C#에서 설정하기

시리얼 포트를 생성하고 'DataReceived'이벤트를 연결 합니다.

 

public partial class Form1 : Form
{
	private SerialPort insSerialPort = new SerialPort();

	public Form1()
	{
		InitializeComponent();


		//아두이노 보드가 연결된 포트의 이름
		insSerialPort.PortName = "COM6";
		//아두이노 보드 통신속도
		insSerialPort.BaudRate = 9600;
		//데이터가 왔을때 이벤트
		insSerialPort.DataReceived += new SerialDataReceivedEventHandler(insSerialPort_DataReceived);

		//레오나르도 기판 사용시 필요한 옵션
		insSerialPort.DtrEnable = true;
		insSerialPort.RtsEnable = true;

		//지정한 포트 열기
		insSerialPort.Open();

	}

	private void Form1_Load(object sender, EventArgs e)
	{
		insSerialPort.Open();

	}

	void insSerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
	{
		Debug.WriteLine("아두이노 데이터 : " + insSerialPort.ReadLine());
	}

	private void Form1_FormClosing(object sender, FormClosingEventArgs e)
	{
		//포트가 열려있나?
		if (true == insSerialPort.IsOpen)
		{
			//포트를 닫는다.
			insSerialPort.Close();
		}
	}

}

 

3-3.테스트

귀찬아서 그냥 디버그 메시지로 출력했으니 출력(output)창을 열어 확인해 봅시다.

 

이제야 잘나오네요 ㅡ,.ㅡ;;;

 

 

 

마무리

이래서 '처음 무언가를 할때는 그냥 주는데로 해보는게 좋다' 라는 말이 맞는 말이죠;;;

괜이 나름 커스텀좀 해보겠다고 일반적인 기판아닌거 샀다가 고생했네요 ㅎㅎㅎ

 

뭐.....이런게 피가 되고 살이 되는 거긴 하지만;;;