C# 實現串口發送數據(不用串口控件版)


參考:https://blog.csdn.net/mannix_lei/article/details/79979432

   https://www.cnblogs.com/ElijahZeng/p/7609241.html

 

1、關於怎么建立工程的,這里就不過多贅述了,先用控件編寫個窗體程序如下

  

 

2、雙擊窗體跳轉到程序頁面,直接上代碼,代碼里有注釋,看注釋都可以看懂的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;   //聲明線程命名空間

namespace TB528IL_APP
{
    public partial class Form1 : Form
    {
        #region 字段/屬性/委托  
        /// <summary>  
        /// 串行端口對象  
        /// </summary>  
        private SerialPort sp;

        /// <summary>  
        /// 串口接收數據委托  
        /// </summary>  
        public delegate void ComReceiveDataHandler(string data);

        public ComReceiveDataHandler OnComReceiveDataHandler = null;

        /// <summary>  
        /// 端口名稱數組  
        /// </summary>  
        public string[] PortNameArr { get; set; }

        /// <summary>  
        /// 串口通信開啟狀態  
        /// </summary>  
        public bool PortState { get; set; } = false;

        /// <summary>  
        /// 編碼類型  
        /// </summary>  
        public Encoding EncodingType { get; set; } = Encoding.ASCII;
        #endregion



        public Form1()
        {
            InitializeComponent();
            My_COM();
            OpenPort("COM1");
        }

        #region 方法 

        /*********************************************
        函數名: My_COM()
        功  能: 新建串口實例  
        參  數: 無
        返回值: 無 
        ********************************************/
        public void My_COM()
        {
            PortNameArr = SerialPort.GetPortNames();
            sp = new SerialPort();
        }
        /*********************************************
        函數名:OpenPort(string portName, int boudRate = 115200, int dataBit = 8, int stopBit = 1, int timeout = 5000)
        功  能:打開端口,並且初始化默認端口波特率、數據位、停止位、超時時間等參數  
        參  數:<param name="portName">端口名稱 
                <param name="boudRate">波特率 
                <param name="dataBit">數據位
                <param name="stopBit">停止位
                <param name="timeout">超時時間
        返回值:無 
        ********************************************/
        public void OpenPort(string portName, int boudRate = 115200, int dataBit = 8, int stopBit = 1, int timeout = 5000)
        {
            try
            {
                sp.PortName = portName;
                sp.BaudRate = boudRate;
                sp.DataBits = dataBit;
                sp.StopBits = (StopBits)stopBit;
                sp.ReadTimeout = timeout;
                sp.Open();
                PortState = true;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /*********************************************
        函數名: ClosePort()
        功  能: 關閉端口  
        參  數: 無
        返回值: 無 
        ********************************************/
        public void ClosePort()
        {
            try
            {
                sp.Close();
                PortState = false;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /*********************************************
        函數名: SendData(string sendData)
        功  能: 發送字符串數據 
        參  數: string sendData 串口要發送的字符串
        返回值: 無 
        ********************************************/
        public void SendData(string sendData)
        {
            try
            {
                sp.Encoding = EncodingType;
                sp.Write(sendData);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /*********************************************
        函數名: Send_Byte(string send_byte)
        功  能: 把要發送的字符串轉換為16進制后發送,例如把字符串"9610"轉換為0x25、0x8a發送出去
        參  數: string send_byte 串口要轉換為16進制發送的字符串
        返回值: 無 
        ********************************************/
        public void Send_Byte(string send_byte)
        {
            byte[] data = new byte[4];
            int Time_Buff = 0;
            int.TryParse(send_byte, out Time_Buff); //將字符串轉換為整形
            data[0] = 0x57;
            data[1] = 0xa1;
            data[2] = (byte)(Time_Buff >> 8);
            data[3] = (byte)Time_Buff;
            // 參數:
            //   buffer: 包含要寫入端口的數據的字節數組。
            //   offset: buffer 參數中從零開始的字節偏移量,從此處開始將字節復制到端口。
            //   count : 要寫入的字節數。
            sp.Write(data, 0, 4);
        }

        #endregion

        //發送Light_delay按鈕
        private void button1_Click(object sender, EventArgs e)
        {
            //獲取文本框的值
            string Light_delay = Light_delay_textBox.Text; //linght_delay_textBox為textBox控件的名稱
            Send_Byte(Light_delay);
        }

        //發送Camera_delay按鈕
        private void button2_Click(object sender, EventArgs e)
        {
            string Camera_delay = Camera_delay_textBox.Text;
            SendData(Camera_delay);
        }

        //發送Light_working_time按鈕
        private void button3_Click(object sender, EventArgs e)
        {
            string Light_working_time = Light_working_time_textBox.Text;
            SendData(Light_working_time);
        }
    }
    
}

 

3、運行結果如下,效果理想

 

  

 

4、關於串口接收還沒完全搞明白,遲點補回來

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM