RS232
- ํ๋กํ ์ฝ์ ์ง๋ ฌํต์ ์ ์ํ ๊ท๊ฒฉ์ผ๋ก์ ํ๋ฒ์ ํ๋์ ๋นํธ์ฉ๋ง ์ ์ก
- ํต์ ๊ฑฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก 15m์ด์ง๋ง ํต์ ์๋๊ฐ ๋์์ง์๋ก ๊ฑฐ๋ฆฌ๊ฐ ์งง์์ง๊ณ ๋ฎ์์๋ก ์ข ๋ ๋ฉ๋ฆฌ๊น์ง ๊ฐ๋๋ค.
- ์๋ฆฌ์ผํต์ ์ ๋ ธ์ด์ฆ๊ฐ ๋ง์ด ํ๊ธฐ๋๋ฌธ์ ์ฐ๋ ๊ธฐ ๊ฐ์ด ๋ง์
โ ์์๋ฌธ์/์ข
๋ฃ๋ฌธ์๋ฅผ ๋ฃ๋๊ฒ ์ข๋ค
- ์์๋ฌธ์๋ hex์ฝ๋
0x02
- ์ข
๋ฃ๋ฌธ์๋ hex์ฝ๋
0x0D, 0x0A
portName์ ๋ฉ๋ชจ์ฅ๊ฐ์๊ฑฐ์์ ์ฝ์ด๋๋ฆฌ๊ฒํ๊ณ ๋ฉ๋ชจ์ฅ์ ๋ด์ฉ์ ๋ฐ๊พธ๋ ํ์
private void ReadyToSerialPort() { try { // ReadAllText()ํจ์ - ์ค๋ฐ๊ฟ์ ํตํด์ ์ฒซ์ค์ portname ๋ค์์ค์ BaudRate์ ์ฝ๊ฒํ๋ ์ฝ๋ string str = File.ReadAllText(@"setting.txt").Replace("\n", string.Empty); string[] settings = str.Spilt(','); if(settings.Count() == 2) { serialPort1.PortName = settings[0]; // COM1, COM2 serailPort1.BaudRate = Conver.ToInt32(settings[1]); // ์๋๋ฐฉ ํฌํธ } } catch(Exception ex) { MessageBox.Show(ex.ToString()); } }
์ ์ดํ์์๋ ์ฅ์น๊ด๋ฆฌ์์์ ๊ผญ ํฌํธ๋ฅผ ๊ณ ์
๋ ธ์ด์ฆ๋ฅผ ํตํ ์ฐ๋ ๊ธฐ๊ฐ ์ฒ๋ฆฌ
private Object thisLock = new Object(); const char _02 = (char)0x02; const char _0D = (char)0x0D; const char _0A = (char))0x0A; string inStream = "";
- ๋์์ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ค์ด ์ถฉ๋์ด ์๋๊ฒ Object๋ก lock์ ๊ฑธ์ด์ค -
thisLock
- ์๋ฆฌ์ผ ๋ฐ์ดํฐ ๋ด์ฉ์ด ์์ -
0x02
(STX) ๋ฌธ์
- ์๋ฆฌ์ผ ๋ฐ์ดํฐ ๋ด์ฉ์ด ๋ -
0x0D, 0x0A
- ๋ด์ฉ์ด ๋ง ๋์ด์ ธ์ ๋ค์ด์๋ ์กฐํฉํด์ ์ ๋๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ
inStream
PLC(์๋์ ์ด๋ฐ๋ชจ๋ํฐ๋ง์ ์ฌ์ฉํ๋ ์ ์ด์ฅ์น) ์ ์๋ฆฌ์ผ ํต์ ์ ํ๊ฒ ๋๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ์, PC์ชฝ๋ง ์ฒ๋ฆฌํด์ผํจ
์ฐ๊ฒฐํ๊ธฐ
์๋ฆฌ์ผํฌํธ๋ ์๋ก ์ด๋ ค์๋ ํฌํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ด์ฃผ๋ ํ์
์ฆ, ์ฐ๊ฒฐํ๋๊ฒ ์๋๋ผ ์ด์ด๋๋๊ฒ
if(!serialPort1.IsOpen) // ์ด๋ ค์๋์ง ์ฒดํฌ { try { serialPort1.Open(); } catch(Exception ex) { MessageBox.Show(ex.ToString()); } }
๋ฐ์ดํฐ ๋ฐ๊ธฐ(Data Received)
C# ํ๋ก๊ทธ๋๋ฐ์์๋ ์๋ฌด๋๋ event-driven ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์ด์์ฒด์ ๋ด์์ ์ด๋ฒคํธ๋ก ํฌํธ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํด์ ์ฝ๋๋ก ๋๊ฒจ์ค์ ์๋ค.
- ๋ฒ๊ฐ๋๋ฅด๊ณ DataReceived ๋๋ธํด๋ฆญ
private void SerialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { try { lock(thisLock) { this.Invoke(new EventHandler(SerialPort_DataReceived_InMainThread)); } } catch{} }
- ์ด๋ ๊ฒ ํ์ง ์์ผ๋ฉด GUI ์ชฝ์ผ์ ๋ฐ์ดํฐ ์ฝ๋์ชฝ์ด๋ ์ถฉ๋์ ๋ฐ์ํด์ ์ ๋๋ก ์ฒ๋ฆฌ ๋ชปํ๊ฒ ๋จ
- Invoke๋ฅผ ํตํด์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๊ฑธ ์คํ
๋ฐ์ดํฐ ์ฝ๊ธฐ
private void SerailPort_DataReceived_InMainTread(object s, EventArgs e) { string indata = serialPort1.ReadExisting(); // ํฌํธ๋จ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์กฐ๋ฆฌ ๊ฐ์ ธ์ด string _indata = indata; char[] arr = indata.ToCharArray(); if(arr.Length <= 0) return; // ์ฐ๋ ๊ธฐ๊ฐ์์ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๋๋ฐฉ๋ฒ if(arr[0] == _02) // ์์ inStream = indata; else inStream += indata; string[] splited = inStream.Split(_02); foreach(string sp in splited) // ๋ฐ์ดํฐ์ ์ฅ { char[] arr2 = sp.ToCharArray(); if(arr2.Length <= 0) continue; int etxIndex = Array.IndexOf(arr2, _0A); if(etxIndex <= 0) continue; etxIndex = Array.IndexOf(arr2, _0D); if(etxIndex <= 0) continue; var arr3 = arr2.SubArray(0, etxIndex); string cmd = new string(arr3); SerialCommand(cmd); } // ๋ } public void SerialCommand(string cmd) { // ๋ฐ๋๊ตฌ๋ฌธ ์ฒ๋ฆฌ (๋ฐ์๋ด์ฉ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง๋ ์ฌ๊ธฐ์ ๊ตฌํ) } // ๋ฐ์ดํฐ๋ฅผ ์กฐ๋ฆฝํ๋ ์ฝ๋ public static T[] SubArray<T>(this T[] data, int index, int length) { T[] result = new T[length]; Array.Copy(data, index, result, 0, length); return result; }
๋ฐ์ดํฐ๋ณด๋ด๊ธฐ
๋ฐ๋๋ก ์์ 0x02 ๋ถ์ด๊ณ ๋ค์ 0x0D, 0x0A๋ถ์ฌ์ ๋ณด๋ด๊ธฐ๋ง ํ๋ฉด ๋๋ค.
public void SendSerialData(string data) { string strOutputData = _02 + data + 0D + _0A; if(serialPort1.IsOpen) { serialPort1.Write(strOutputData); } else { try { serialPort1.Open(); serialProt1.Write(strOutputData); } catch(Exception ex) { MessageBox.Show(ex.ToString()); } } }
ย