본문 바로가기

C#/공부

시리얼 통신

LabView에서 만든 모터와 파워서플라이 시리얼 통신을 C#으로 구현해 보았다. 단, 이번에는 둘을 동시에 연결하여 조작한다.

 

LabView 시리얼 통신 바로가기

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)  //폼 로드
        {
            comboBox1.Items.Clear();
            comboBox1.DataSource = SerialPort.GetPortNames();   //연결 포트 종류 확인용
        }
        //연결 시작
        private void btnConnect_Click(object sender, EventArgs e)
        {
            if (!(serialPort1.IsOpen && serialPort2.IsOpen))  
            {
                serialPort1.Close();  //시리얼포트 닫기
                serialPort2.Close();  

                serialPort1.DataBits = 8;
                serialPort1.StopBits = StopBits.One;
                serialPort1.Parity = Parity.None;
                serialPort1.BaudRate = 38400;
                serialPort1.PortName = "COM19"; //모터 연결 포트
                serialPort1.DtrEnable = true;

                serialPort1.Open();  //시리얼포트 열기

                serialPort2.DataBits = 8;
                serialPort2.StopBits = StopBits.One;
                serialPort2.Parity = Parity.None;
                serialPort2.BaudRate = 9600;
                serialPort2.PortName = "COM23"; //파워서플라이 연결 포트
                serialPort2.DtrEnable = true;
                         
                serialPort2.Open();  

                label1.Text = "포트가 열렸습니다.";
                comboBox1.Enabled = false;  //COM포트설정 콤보박스 비활성화
            }
            else  //시리얼포트가 열려 있으면
            {
                label1.Text = "포트가 이미 열려 있습니다.";
            }
        }
        //데이터 수신부
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            this.Invoke(new EventHandler(MySerialReceived1));
        }

        private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            this.Invoke(new EventHandler(MySerialReceived2));
        }
        
        private void MySerialReceived1(object s, EventArgs e)  //수신 데이터 처리
        {            
            txtRecieve.AppendText("M.A: "+serialPort1.ReadLine());
            txtRecieve.ScrollToCaret(); //스크롤을 맨 아래로 이동
        }

        private void MySerialReceived2(object s, EventArgs e)  
        {
            txtRecieve.AppendText("P.A: " + serialPort2.ReadLine());
            txtRecieve.ScrollToCaret();
        }
        //모터 전송부
        private void btnSend1_Click(object sender, EventArgs e)
        {
            sendData1();
        }

        private void txtSend1_KeyDown(object sender, KeyEventArgs e)    //엔터키로 전송 기능 구현
        {
            if (e.KeyCode == Keys.Enter)
            {
                sendData1();
            }
        }

        private void sendData1()
        {
            if (serialPort1.IsOpen) {
                serialPort1.Write(txtSend1.Text + "\r");
                txtRecieve.AppendText("M.Q: " + txtSend1.Text + "\n");
                txtRecieve.ScrollToCaret();
            }
            txtSend1.Clear();
        }
        //파워서플라이 전송부
        private void btnSend2_Click(object sender, EventArgs e)
        {
            sendData2();
        }

        private void txtSend2_KeyDown(object sender, KeyEventArgs e)    
        {
            if (e.KeyCode == Keys.Enter)
            {
                sendData2();
            }
        }

        private void sendData2()
        {
            if (serialPort2.IsOpen)
            {
                serialPort2.WriteLine(txtSend2.Text);
                txtRecieve.AppendText("P.Q: " + txtSend2.Text + "\n");
                txtRecieve.ScrollToCaret();
            }
            txtSend2.Clear();
        }

        private void btnDisconnect_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen || serialPort2.IsOpen)  //시리얼포트가 열려 있으면
            {
                serialPort1.Close();  //시리얼포트 닫기
                serialPort2.Close();

                label1.Text = "포트가 닫혔습니다.";
                comboBox1.Enabled = true;  //COM포트설정 콤보박스 활성화
            }
            else  //시리얼포트가 닫혀 있으면
            {
                label1.Text = "포트가 이미 닫혀 있습니다.";
            }
        }
    }
}

 

왼쪽 전송부가 모터, 오른쪽 전송부가 파워서플라이 이다.

(M.Q = Motor Q, M.A = Motor A, P.Q = Power Q, P.A = Power A)

 

'C# > 공부' 카테고리의 다른 글

C# 실력 늘리기 2일차  (0) 2022.07.20
C# 실력 늘리기 1일차  (0) 2022.07.19
4. 클래스와 메소드  (0) 2022.07.06
3. 조건문 / 반복문 / 제어문  (0) 2022.07.06
2. 연산자와 배열  (0) 2022.07.05