1. 程式人生 > 實用技巧 >通過 RS485 與讀卡器通訊

通過 RS485 與讀卡器通訊

using NLog;
using System;
using System.IO.Ports;
using System.Text;
using System.Threading;

namespace TestCom485
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                SerialEntity serialEntity = new SerialEntity();
                serialEntity.PortName 
= "COM1"; serialEntity.BaudRate = 19200; serialEntity.DataBits = 8; serialEntity.StopBits = "1"; serialEntity.Parity = "0"; ScanProvider scanProvider = new ScanProvider(serialEntity); scanProvider.DataReceived
+= PrintData; scanProvider.Open(); while (true) { //給485讀頭髮送讀卡指令 byte[] send = new byte[] { 0x01 }; scanProvider.Write(send, 0, 7); Thread.Sleep(1000); } }
catch(Exception ex) { Console.Write(ex.ToString()); Console.WriteLine(); } Console.ReadKey(); } static void PrintData(object sender, SerialSortEventArgs eventArgs) { Console.WriteLine(eventArgs.Code); } } public class ScanProvider { public SerialPort _serialPort = new SerialPort(); public event EventHandler<SerialSortEventArgs> DataReceived; public ScanProvider(SerialEntity serialEntity) { // 串列埠名 _serialPort.PortName = serialEntity.PortName; // 波特率 _serialPort.BaudRate = serialEntity.BaudRate; // 資料位 _serialPort.DataBits = serialEntity.DataBits; // 停止位 _serialPort.StopBits = (StopBits)Enum.Parse((typeof(StopBits)), serialEntity.StopBits); // 無奇偶校驗位 _serialPort.Parity = (Parity)Enum.Parse((typeof(Parity)), serialEntity.Parity); _serialPort.DataReceived += _serialPort_DataReceived; } /// <summary> /// /// </summary> /// <param name="portName">串列埠名</param> /// <param name="baudRate">波特率</param> public ScanProvider(SerialPort _serialPort, string portName, int baudRate) { this._serialPort = _serialPort; // 串列埠名 _serialPort.PortName = portName; // 波特率 _serialPort.BaudRate = baudRate; // 資料位 _serialPort.DataBits = 8; // 停止位 _serialPort.StopBits = StopBits.One; // 無奇偶校驗位 _serialPort.Parity = Parity.None; _serialPort.DataReceived += _serialPort_DataReceived; } /// <summary> /// 是否處於開啟狀態 /// </summary> public bool IsOpen { get { return _serialPort != null && _serialPort.IsOpen; } } /// <summary> /// 開啟串列埠 /// </summary> /// <returns></returns> public bool Open() { try { if (_serialPort == null) return this.IsOpen; if (_serialPort.IsOpen) this.Close(); _serialPort.Open(); } catch (Exception e) { _serialPort.Close(); throw e; } return this.IsOpen; } /// <summary> /// 關閉串列埠 /// </summary> public void Close() { if (this.IsOpen) _serialPort.Close(); } /// <summary> /// 向串列埠內寫入 /// </summary> /// <param name="send">寫入資料</param> /// <param name="offSet">偏移量</param> /// <param name="count">寫入數量</param> public void Write(byte[] send, int offSet, int count) { if (this.IsOpen) { _serialPort.Write(send, offSet, count); } } public void Dispose() { if (this._serialPort == null) return; if (this._serialPort.IsOpen) this.Close(); this._serialPort.Dispose(); this._serialPort = null; } void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { // 等待100ms,防止讀取不全的情況 Thread.Sleep(100); ReceiveDate(); } public void ReceiveDate() { byte[] m_recvBytes = new byte[_serialPort.BytesToRead]; //定義緩衝區大小 int result = _serialPort.Read(m_recvBytes, 0, m_recvBytes.Length); //從串列埠讀取資料 if (result <= 0) return; string strResult = BitConverter.ToString(m_recvBytes, 0).Replace("-", " ").ToLower(); _serialPort.DiscardInBuffer(); if (this.DataReceived != null) this.DataReceived(this, new SerialSortEventArgs() { Code = strResult }); } } public class SerialSortEventArgs : EventArgs { public string Code { get; set; } } public class SerialEntity { public string PortName { get; set; } public int BaudRate { get; set; } public int DataBits { get; set; } public string StopBits { get; set; } public string Parity { get; set; } } }

參考資料:https://blog.csdn.net/weixin_41415541/article/details/80921956