最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實現(xiàn)監(jiān)聽串口數(shù)據(jù)的方法詳解

 更新時間:2024年03月19日 16:37:16   作者:velo  
這篇文章主要為大家詳細介紹了C#實現(xiàn)監(jiān)聽串口數(shù)據(jù)的相關方法,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下

在C#中,接收COM端口(串口)報文通常涉及到使用System.IO.Ports.SerialPort類,并對接收到的字節(jié)數(shù)據(jù)進行處理和格式轉換。下面是一個基本的流程,描述了如何在C#中接收和轉換COM端口報文:

步驟 1: 引用命名空間

首先,確保你的項目引用了處理串口通信所需的命名空間:

using System.IO.Ports;

步驟 2: 設置 SerialPort 對象

創(chuàng)建SerialPort對象并設置串口的配置參數(shù)(如波特率、數(shù)據(jù)位、停止位等):

SerialPort mySerialPort = new SerialPort("COM1");

mySerialPort.BaudRate = 9600;
mySerialPort.Parity = Parity.None;
mySerialPort.StopBits = StopBits.One;
mySerialPort.DataBits = 8;
mySerialPort.Handshake = Handshake.None;

// 設置讀寫時間超時
mySerialPort.ReadTimeout = 500;
mySerialPort.WriteTimeout = 500;

步驟 3: 打開串口

mySerialPort.Open();

步驟 4: 接收數(shù)據(jù)

你可以使用DataReceived事件來處理接收到的數(shù)據(jù)。當串口接收到數(shù)據(jù)時,這個事件會被觸發(fā):

mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

實現(xiàn)事件處理函數(shù)DataReceivedHandler來讀取數(shù)據(jù)并進行處理:

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    byte[] buffer = new byte[sp.BytesToRead];
    sp.Read(buffer, 0, buffer.Length);

    // TODO: 這里添加你的數(shù)據(jù)處理和格式轉換邏輯
    string formattedData = ConvertToDesiredFormat(buffer);

    // 處理轉換后的數(shù)據(jù)
    ProcessData(formattedData);
}

步驟 5: 轉換格式

創(chuàng)建函數(shù)ConvertToDesiredFormat來實現(xiàn)將接收到的字節(jié)數(shù)據(jù)轉換為你需要的格式。這里的實現(xiàn)取決于你的具體需求:

private static string ConvertToDesiredFormat(byte[] data)
{
    // 舉例:將字節(jié)數(shù)據(jù)轉換為ASCII字符串
    return Encoding.ASCII.GetString(data);
    // 注意:如果數(shù)據(jù)是特定協(xié)議格式,你需要根據(jù)協(xié)議解析并轉換數(shù)據(jù)
}

步驟 6: 關閉串口

當數(shù)據(jù)處理完成后,記得關閉串口以釋放資源:

mySerialPort.Close();

注意事項

  • 確保你有適當?shù)臋嘞迊碓L問COM端口。
  • 上面的代碼片段是一個簡化的例子。實際應用中,你可能需要根據(jù)具體的通信協(xié)議來處理和驗證數(shù)據(jù)(如計算校驗和、處理數(shù)據(jù)幀等)。
  • 如果通信過程中可能出現(xiàn)讀寫沖突或其他線程安全問題,考慮使用鎖(如lock語句)來同步訪問串口資源。

配置完成后,程序就可以監(jiān)聽指定的COM端口,并在接收到數(shù)據(jù)時進行處理和轉換了。記得在實際部署前,充分測試你的代碼以確保它能夠可靠地處理實際的通信場景。

知識補充

除了上文的內(nèi)容,小編還為大家整理了C#實現(xiàn)串口數(shù)據(jù)偵聽的相關方法,希望對大家有所幫助

當需要編程操縱硬件時會遇到過這樣的問題,就是通過串口來接收硬件發(fā)來的數(shù)據(jù),或是通過串口向硬件發(fā)送某種格式的命令。在C#平臺上,可以通過 System.IO.Ports 命名空間下的SerialPort 類來實現(xiàn)。

下面是一個簡單的示例,首先獲取本機關聯(lián)的串行端口列表,然后獲取配置文件中配置的COM端口,檢查是否在本機串行端口列表中,若在列表中則進一步實例化串口對象,并為串口對象指定數(shù)據(jù)接收事件來實現(xiàn)監(jiān)聽,示例代碼如下:

using System.IO.Ports;
namespace SerialTest
{
  public class SerialTest
  {
       #region 串口監(jiān)聽
    
        private SerialPort serialPort = null;
        /// <summary>
        /// 開啟串口監(jiān)聽
        /// </summary>
        private void StartSerialPortMonitor()
        {
            List<string> comList = GetComlist(false); //首先獲取本機關聯(lián)的串行端口列表            
       if (comList.Count == 0)
            {
                DialogForm.Show("提示信息", "當前設備不存在串行端口!");
                System.Environment.Exit(0); //徹底退出應用程序   
            }
            else
            {
                string targetCOMPort = ConfigurationManager.AppSettings["COMPort"].ToString();
                //判斷串口列表中是否存在目標串行端口
                if (!comList.Contains(targetCOMPort))
                {
                    DialogForm.Show("提示信息", "當前設備不存在配置的串行端口!");
                    System.Environment.Exit(0); //徹底退出應用程序   
                }

                serialPort = new SerialPort();

                //設置參數(shù)
                serialPort.PortName = ConfigurationManager.AppSettings["COMPort"].ToString(); //通信端口
                serialPort.BaudRate = Int32.Parse(ConfigurationManager.AppSettings["BaudRate"].ToString()); //串行波特率
                serialPort.DataBits = 8; //每個字節(jié)的標準數(shù)據(jù)位長度
                serialPort.StopBits = StopBits.One; //設置每個字節(jié)的標準停止位數(shù)
                serialPort.Parity = Parity.None; //設置奇偶校驗檢查協(xié)議
                serialPort.ReadTimeout = 3000; //單位毫秒
                serialPort.WriteTimeout = 3000; //單位毫秒
                //串口控件成員變量,字面意思為接收字節(jié)閥值,
                //串口對象在收到這樣長度的數(shù)據(jù)之后會觸發(fā)事件處理函數(shù)
                //一般都設為1
                serialPort.ReceivedBytesThreshold = 1;
                serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //設置數(shù)據(jù)接收事件(監(jiān)聽)

                try
                {
                    serialPort.Open(); //打開串口
                }
                catch (Exception ex)
                {
                    DialogForm.Show("提示信息", "串行端口打開失??!具體原因:" + ex.Message);
                    System.Environment.Exit(0); //徹底退出應用程序   
                }
            }
        }

        /// <summary>
        /// 串口數(shù)據(jù)處理函數(shù)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                //Comm.BytesToRead中為要讀入的字節(jié)長度
                int len = serialPort.BytesToRead;
                Byte[] readBuffer = new Byte[len];
                serialPort.Read(readBuffer, 0, len); //將數(shù)據(jù)讀入緩存
                //處理readBuffer中的數(shù)據(jù),自定義處理過程
                string msg = encoding.GetString(readBuffer, 0, len); //獲取出入庫產(chǎn)品編號
                DialogForm.Show("接收到的信息", msg);
            }
            catch(Exception ex)
            {
                DialogForm.Show("提示信息", "接收返回消息異常!具體原因:" + ex.Message);
            }
        }

        /// <summary>
        /// 關閉串口
        /// </summary>
        private void Stop()
        {
            serialPort.Close();
        }

        /// <summary>
        /// 獲取本機串口列表
        /// </summary>
        /// <param name="isUseReg"></param>
        /// <returns></returns>
        private List<string> GetComlist(bool isUseReg)
        {
            List<string> list = new List<string>();
            try
            {
                if (isUseReg)
                {
                    RegistryKey RootKey = Registry.LocalMachine;
                    RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");

                    String[] ComNames = Comkey.GetValueNames();

                    foreach (String ComNamekey in ComNames)
                    {
                        string TemS = Comkey.GetValue(ComNamekey).ToString();
                        list.Add(TemS);
                    }
                }
                else
                {
                    foreach (string com in SerialPort.GetPortNames())  //自動獲取串行口名稱  
                        list.Add(com);
                }
            }
            catch
            {
                DialogForm.Show("提示信息", "串行端口檢查異常!");
                System.Environment.Exit(0); //徹底退出應用程序   
            }
            return list;
        }  

        #endregion 串口監(jiān)聽
  }
}

到此這篇關于C#實現(xiàn)監(jiān)聽串口數(shù)據(jù)的方法詳解的文章就介紹到這了,更多相關C#監(jiān)聽串口數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C#數(shù)據(jù)結構之堆棧(Stack)實例詳解

    C#數(shù)據(jù)結構之堆棧(Stack)實例詳解

    這篇文章主要介紹了C#數(shù)據(jù)結構之堆棧(Stack),結合實例形式較為詳細的分析了堆棧的原理與C#實現(xiàn)堆棧功能的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • 詳解C#的排列組合

    詳解C#的排列組合

    本文詳細介紹了C#中的排列組合以及具體實現(xiàn)代碼,如下所示,希望對大家有所幫助
    2016-11-11
  • WPF動態(tài)生成行列可變表格的實現(xiàn)方法詳解

    WPF動態(tài)生成行列可變表格的實現(xiàn)方法詳解

    在做WPF開發(fā)的時候,經(jīng)常會遇到需要展示表格數(shù)據(jù)的場景,本文將為大家詳細介紹一下如何使用WPF動態(tài)生成行列可變表格,感興趣的小伙伴可以參考下
    2026-02-02
  • C#?實例解釋面向對象編程中的單一功能原則(示例代碼)

    C#?實例解釋面向對象編程中的單一功能原則(示例代碼)

    本文我介紹了?SOLID?原則中的單一功能原則(single-responsibility?principle),并通過?C#?代碼示例簡明地詮釋了它的含意和實現(xiàn),對C#?面向對象編程原則感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • 自定義時間格式轉換代碼分享

    自定義時間格式轉換代碼分享

    自定義時間格式轉換,如"2012年5月14日"的日期字符串,大家參考使用吧
    2013-12-12
  • C#中DataGridView操作技巧

    C#中DataGridView操作技巧

    這篇文章主要介紹了C#中DataGridView操作技巧,包括了DataGridView的初始化、添加行、添加列、排序等操作技巧,非常具有實用價值,需要的朋友可以參考下
    2014-12-12
  • C#網(wǎng)絡請求與JSON解析的示例代碼

    C#網(wǎng)絡請求與JSON解析的示例代碼

    這篇文章主要介紹了C#網(wǎng)絡請求與JSON解析的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • C#中HashTable的定義與使用方法

    C#中HashTable的定義與使用方法

    Hashtable是System.Collections命名空間提供的一個容器,用于處理和表現(xiàn)類似keyvalue的鍵值對,所以Hashtable可以支持任何類型的keyvalue鍵值對
    2012-12-12
  • C#獨立域名查詢代碼

    C#獨立域名查詢代碼

    C#獨立域名查詢代碼...
    2007-04-04
  • 用序列化實現(xiàn)List<T> 實例的深復制(推薦)

    用序列化實現(xiàn)List<T> 實例的深復制(推薦)

    下面小編就為大家?guī)硪黄眯蛄谢瘜崿F(xiàn)List<T> 實例的深復制(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02

最新評論

霍林郭勒市| 龙泉市| 建昌县| 会昌县| 井陉县| 新源县| 铁岭县| 南召县| 通渭县| 湘西| 郧西县| 柳州市| 临潭县| 肃宁县| 邓州市| 福鼎市| 龙胜| 阿克苏市| 全南县| 安多县| 呼伦贝尔市| 东辽县| 天祝| 景泰县| 耿马| 西和县| 涟源市| 旌德县| 六盘水市| 定结县| 铅山县| 卓尼县| 双鸭山市| 潍坊市| 华坪县| 三明市| 和平县| 蓝山县| 广河县| 元氏县| 武威市|