程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#串口通信—向串口發送數據,同步接收返回數據,

C#串口通信—向串口發送數據,同步接收返回數據,

編輯:C#入門知識

C#串口通信—向串口發送數據,同步接收返回數據,


    最近寫C#串口通信程序,系統是B/S架構。SerialPort類有一個DataReceived事件,用來接收串口返回的數據,但這種方式在C/S架構下很好用,但B/S就不好處理了。所以寫了一個同步模式接收返回數據的方法,不使用DataReceived事件。經過測試,可以正常使用(不支持多線程調用)。

    一、Machine類

    1、Machine類有一個靜態變量,定義如下:

private static SerialPort serialPort = null;

    2、向串口發送數據,同步接收返回數據的方法:

/// <summary> /// 向串口發送數據,讀取返回數據 /// </summary> /// <param name="sendData">發送的數據</param> /// <returns>返回的數據</returns> private byte[] ReadPort(byte[] sendData) { if (serialPort == null) { serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); serialPort.ReadBufferSize = 1024; serialPort.WriteBufferSize = 1024; } if (!serialPort.IsOpen) { serialPort.Open(); } //發送數據 serialPort.Write(sendData, 0, sendData.Length); //讀取返回數據 while (serialPort.BytesToRead == 0) { Thread.Sleep(1); } Thread.Sleep(50); //50毫秒內數據接收完畢,可根據實際情況調整 byte[] recData = new byte[serialPort.BytesToRead]; serialPort.Read(recData, 0, recData.Length); return recData; } View Code

    3、發送聯機指令:

/// <summary> /// 聯機 /// </summary> /// <returns>聯機成功或失敗</returns> public bool Connect(out string msg) { byte[] sendData = new byte[] { 0x01, 0x01, 0x00, 0x00 }; CommonUtil.CalCheckCode(sendData); byte[] recData = ReadPort(sendData); if (recData.Length >= 4 && recData[0] == 0x01 && recData[1] == 0x02 && recData[2] == 0x00 && CommonUtil.ValidCheckCode(recData)) { switch (recData[3]) { case 0x00: msg = "控制主板正在重啟"; return false; case 0x01: msg = "聯機成功"; return true; case 0x02: msg = "控制主板正在維護"; return false; case 0x03: msg = "控制主板收到的數據格式不正確"; return false; default: msg = "未知狀態"; return false; } } else { msg = "貨機返回的數據格式不正確"; return false; } } View Code

    二、如何使用,這裡是在C/S程序中測試,在B/S程序中也可以正常使用,下面是窗體Form1類中的代碼:

    1、定義對象及初始化

private Machine machine = null; public Form1() { InitializeComponent(); machine = new Machine(); } View Code

    2、聯機事件

//聯機 private void btnConnect_Click(object sender, EventArgs e) { string msg = null; if (machine.Connect(out msg)) { MessageBox.Show("成功:" + msg); } else { MessageBox.Show("失敗:" + msg); } } View Code

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved