C# WPF 串口通信

C# WPF 串口通信

  • 安裝依賴庫

安裝依賴庫

  • System.IO.Ports
    在這里插入圖片描述
    在這里插入圖片描述
using System.Diagnostics;
using System.IO.Ports;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup.Localizer;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace GasAlarmFactoryTools
{struct TestInfoData {public string dev_uuid;public string dev_simcard;public string private_data;public string datetime;};/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{// TODO: 串口相關SerialPort mSerialPort = new SerialPort();private Thread recvThread;long recvTimems = 0;    // 用于計算串口接收完一幀數據int rxLen = 0;  // 串口接收到的數據長度byte[] rxBuff = new byte[128];  // 串口數據接收緩存private List<string> baudrateList = new List<string> {"4800","9600","19200","38400","57600","115200","256000","1000000","2000000","3000000"};public MainWindow(){InitializeComponent();// 獲取所有可用串口端口,并添加到comboBoxCOMstring[] ports = System.IO.Ports.SerialPort.GetPortNames();comboBoxComName.ItemsSource = ports;comboBoxComName.SelectedIndex = 0;  // 默認選擇索引comboBoxBaudrate.ItemsSource = baudrateList;    // 波特率設置combobox數據源}/// <summary>/// 窗口關閉處理/// </summary>/// <param name="e"></param>protected override void OnClosing(System.ComponentModel.CancelEventArgs e){if (MessageBox.Show("確定要退出嗎?", "確認", MessageBoxButton.YesNo) != MessageBoxResult.Yes){// 用戶選擇“否”,取消關閉e.Cancel = true;}mSerialPort.Close();//mTimer.Dispose();if (recvThread != null){                recvThread.Abort();}base.OnClosing(e);}private void recvTimerCalback(object obj){this.Dispatcher.Invoke(new Action(() =>{// TODO: 處理接收到的數據}));}private void recvThreadTask(){Thread.Sleep(200);try{while (true){Thread.Sleep(1);if (mSerialPort.IsOpen){int datalength = mSerialPort.BytesToRead;if (datalength >= 1){//Console.WriteLine("BytesToRead:" + datalength);for (int i = 0; i < datalength; i++){recvTimems = Environment.TickCount; // 更新串口數據接收時間byte data = (byte)mSerialPort.ReadByte();rxBuff[rxLen++] = data;if (rxBuff.Length == rxLen){rxLen = 0;Array.Clear(rxBuff, 0, rxBuff.Length);Console.WriteLine("Error================" + rxBuff.Length + "\n");}//Console.WriteLine(data.ToString("X2"));}}recvTimerCalback(null);}}}catch (Exception ex){Console.WriteLine(" ----------異常------------");}}private void btnOpenCloseCom_Click(object sender, RoutedEventArgs e){if (mSerialPort.IsOpen){mSerialPort.Close();btnOpenCloseCom.Content = "打開串口";btnOpenCloseCom.Background = Brushes.Red;Console.WriteLine("關閉串口成功");Debug.WriteLine("關閉串口成功");comboBoxComName.IsEnabled = true;comboBoxBaudrate.IsEnabled = true;comboBoxDataBits.IsEnabled = true;comboBoxStopBits.IsEnabled = true;comboBoxParity.IsEnabled = true;comboBoxHandshake.IsEnabled = true;}else{// TODO: 串口默認設置mSerialPort.BaudRate = 4800; // 波特率mSerialPort.DataBits = 8;   // 數據位mSerialPort.StopBits = StopBits.One;    // 停止位mSerialPort.Parity = Parity.None;   // 校驗位mSerialPort.Handshake = Handshake.None; // 流控位// mSerialPort.ReadTimeout = 1500; // 讀超時// mSerialPort.Encoding = Encoding.UTF8; // 編碼方式// mSerialPort.RtsEnable = true;// mSerialPort.DataReceived += SerialPort_DataReceived;Console.WriteLine("baudrate SelectedIndex:" + comboBoxBaudrate.SelectedIndex);Console.WriteLine("baudrate SelectedValue:" + comboBoxBaudrate.SelectedValue);Console.WriteLine("baudrate Text:" + comboBoxBaudrate.Text);// TODO: 串口端口選擇mSerialPort.PortName = comboBoxComName.SelectedItem.ToString();// TODO: 設置串口波特率if (comboBoxBaudrate.SelectedIndex < 0){mSerialPort.BaudRate = Convert.ToInt32(comboBoxBaudrate.Text);}else{switch (comboBoxBaudrate.SelectedValue){case "4800":mSerialPort.BaudRate = 4800;break;case "9600":mSerialPort.BaudRate = 9600;break;case "19200":mSerialPort.BaudRate = 19200;break;case "38400":mSerialPort.BaudRate = 38400;break;case "57600":mSerialPort.BaudRate = 57600;break;case "115200":mSerialPort.BaudRate = 115200;break;case "256000":mSerialPort.BaudRate = 256000;break;case "1000000":mSerialPort.BaudRate = 1000000;break;case "2000000":mSerialPort.BaudRate = 2000000;break;case "3000000":mSerialPort.BaudRate = 3000000;break;default:MessageBox.Show("波特率設置有誤!");break;}}// TODO: 串口數據位設置switch (comboBoxDataBits.SelectedIndex){case 0:mSerialPort.DataBits = 5;break;case 1:mSerialPort.DataBits = 6;break;case 2:mSerialPort.DataBits = 7;break;case 3:mSerialPort.DataBits = 8;break;default:mSerialPort.DataBits = 8;break;}// TODO: 串口停止位設置switch (comboBoxStopBits.SelectedIndex){case 0:mSerialPort.StopBits = StopBits.One;break;case 1:mSerialPort.StopBits = StopBits.OnePointFive;break;case 2:mSerialPort.StopBits = StopBits.Two;break;default:mSerialPort.StopBits = StopBits.One;break;}// TODO: 串口校驗位設置switch (comboBoxParity.SelectedIndex){case 0:mSerialPort.Parity = Parity.None;   // 無校驗Console.WriteLine("無校驗");break;case 1:mSerialPort.Parity = Parity.Odd;   // 奇校驗Console.WriteLine("奇校驗");break;case 2:mSerialPort.Parity = Parity.Even;   // 偶校驗Console.WriteLine("偶校驗");break;case 3:mSerialPort.Parity = Parity.Mark;   // 校驗位1Console.WriteLine("校驗位1");break;case 4:mSerialPort.Parity = Parity.Space;   // 校驗位0Console.WriteLine("校驗位0");break;default:mSerialPort.Parity = Parity.None;   // 無校驗break;}// TODO: 串口流控位設置switch (comboBoxHandshake.SelectedIndex){case 0:mSerialPort.Handshake = Handshake.None;break;case 1:mSerialPort.Handshake = Handshake.XOnXOff;                        break;case 2:mSerialPort.Handshake = Handshake.RequestToSend;break;case 3:mSerialPort.Handshake = Handshake.RequestToSendXOnXOff;break;default:mSerialPort.Handshake = Handshake.None;break;}// TODO: 嘗試打開串口try {mSerialPort.Open();btnOpenCloseCom.Content = "關閉串口";btnOpenCloseCom.Background = Brushes.Green;}catch (Exception ex) {MessageBox.Show(ex.Message.ToString());}}}}
}
// TODO: 串口寫入數據  3個參數(buf, offset, len);
mSerialPort.Write(new byte[] { 0xAA, 0x00, 0x08, 0x00, 0xB2, 0x55 }, 0, 6);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72026.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【玩轉23種Java設計模式】結構型模式篇:組合模式

軟件設計模式&#xff08;Design pattern&#xff09;&#xff0c;又稱設計模式&#xff0c;是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。 匯總目錄鏈接&…

如何選取合適的 NewRatio 值來優化 JVM 的垃圾回收策略

目錄 一、垃圾回收模型簡介 &#xff08;一&#xff09;新生代&#xff08;Young Generation&#xff09; &#xff08;二&#xff09;老年代&#xff08;Old Generation&#xff09; &#xff08;三&#xff09;NewRatio 的作用與影響 &#xff08;四&#xff09;圖解&am…

Element Plus中的樹組件的具體用法(持續更新!)

const defaultProps {//子樹為節點對象的childrenchildren: children,//節點標簽為節點對象的name屬性label: name, } 屬性 以下是樹組件中的常用屬性以及作用&#xff1a; data&#xff1a;展示的數據&#xff08;數據源&#xff09; show-checkbox&#xff1a;節點是否可…

第十一屆藍橋杯單片機國賽

什么&#xff1f;4T模擬賽和省賽做起來輕輕松松&#xff1f;不妨來挑戰一下第十一屆國賽&#xff0c;這一屆的國賽居然沒考超聲波、串口通信&#xff01;只要你正確地理解了題目的意思&#xff0c;規避出題人挖的坑&#xff0c;拿個國一輕輕松松。 附件&#xff1a;第十一屆藍橋…

大彩串口屏開發 —— MODBUS通信

目 錄 Modbus通信方式 1 使用變量與協議設置方式 2 使用LUA腳本方式 3 兩者結合 Modbus通信 大彩串口屏可以采用三種方式實現與其它設備進行modbus通信和邏輯處理。 方式 1 使用變量與協議設置 步驟1 在協議設置里進行設置&#xff0c;包括開啟modbus協議&#xff0c;屏做為主…

【Linux docker】關于docker啟動出錯的解決方法。

無論遇到什么docker啟動不了的問題 就是 查看docker狀態sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三個配置文件&#xff08;可能是配置的時候格式錯誤&#xff09;&#xff1a;/etc/docker/daemon.json&#xff08;如果存在&#xf…

怎么實現: 大語言模型微調案例

怎么實現: 大語言模型微調案例 目錄 怎么實現: 大語言模型微調案例輸入一個反常識的問題:首都在北京天安門之后對輸出模型進行測試:首都在北京天安門微調代碼:測試微調模型代碼:微調輸出模型結構輸出模型參數大小對比Qwen 2.5_0.5:53MB輸出模型:951MB 是一樣的,沒有進行…

rdiff-backup備份

目錄 1. 服務器備份知識點 1.1 備份策略 1.2 備份步驟和寶塔面板簡介 1.3 CentOS7重要目錄 2. 備份工具 2.1 tar -g 備份演示 2. rsync 備份演示 3. rdiff-backup 備份演示 4. 差異和優缺點 3. rdiff-backup安裝和使用 3.1 備份命令rdiff-backup 3.2 恢復命令--…

Claude:AI領域的多面手,從語言模型到智能編碼

文章目錄 引言Claude的起源與發展1. Claude的誕生2. Claude 3.7 Sonnet的突破 版本迭代技術原理Claude的獨特優勢混合推理模式成本與性能的平衡開發者友好的工具 功能及應用Claude的未來展望結論 引言 Claude是由Anthropic公司開發的大型語言模型&#xff0c;在人工智能領域&a…

RocketMQ 詳細教程(Spring Boot Spring Cloud Alibaba)

1. RocketMQ 簡介 RocketMQ 是阿里巴巴開源的一款分布式消息隊列&#xff0c;具有高吞吐量、低延遲、可靠性等特點&#xff0c;廣泛應用于金融、電商、物聯網等領域。 RocketMQ 的核心特性&#xff1a; 高可靠性&#xff1a;支持消息存儲、重復消費、失敗重試等高可用性&…

Spring(七)AOP-代理模式

目錄 代理模式 一 靜態代理 一、核心作用 二、使用場景 二 動態代理 一、核心作用 二、使用場景 具體實現&#xff1a;&#xff08;初始&#xff09; 具體實現&#xff1a;&#xff08;改進&#xff09; 一、核心業務邏輯 1. 接口 MathCalculator 2. 實現類 MathCa…

Java Lambda表達式:現代編程的簡潔之道

引言 在Java 8中&#xff0c;Lambda表達式的引入標志著Java語言向函數式編程邁出了重要一步。Lambda不僅簡化了代碼結構&#xff0c;還提升了開發效率&#xff0c;使得Java能夠更靈活地應對現代編程需求。本文將深入探討Lambda表達式的核心概念、語法規則、應用場景及其對Java…

BGP分解實驗·21——BGP選路原則之本地優先級

當使用BGP路徑屬性——本地優先級&#xff0c;進行路由優選時&#xff0c;優選“本地優先級”數值較大的那個。&#xff08;eBGP之間更新不攜帶這個屬性&#xff09; 實驗拓撲如下&#xff1a; 在未實現本地優先級策略前&#xff0c;先在各個BGP之間配置完成基本連接。 R1的基…

【redis】應用場景:共享會話和手機驗證碼

文章目錄 共享會話實現思路 手機驗證碼實現思路偽代碼實現生成驗證碼驗證驗證碼 共享會話 實現思路 如果每個應用服務器&#xff0c;維護自己的會話數據&#xff0c;此時彼此之間胡共享&#xff0c;用戶請求訪問到不同的服務器上&#xff0c;就可能會出現一些不能正確處理的情…

通義萬相 2.1 + 藍耘算力,AI 視頻生成的夢幻組合

在這個科技日新月異的時代&#xff0c;人工智能不斷刷新著我們對世界的認知。一次偶然的機會&#xff0c;我借助北京藍耘科技股份有限公司提供的算力支持&#xff0c;踏上了使用通義萬相 2.1 進行 AI 視頻生成的奇妙之旅。 目錄 1.1初遇藍耘科技&#xff1a; 1.2通義萬相 2.1…

【Go萬字洗髓經】Golang內存模型與內存分配管理

本文目錄 1. 操作系統中的虛擬內存分頁與進程管理虛擬內存與內存隔離 2. Golang中的內存模型內存分配流程內存單元mspan線程緩存mcache中心緩存mcentral全局堆緩存mheapheapArena空閑頁索引pageAlloc 3. Go對象分配mallocgc函數tiny對象分配內存 4.結合GMP模型來看內存模型tiny…

33.HarmonyOS NEXT NumberBox 步進器高級技巧與性能優化

HarmonyOS NEXT NumberBox 步進器高級技巧與性能優化 一、高級交互設計 1. 組件聯動控制 // 與Slider雙向綁定 State value: number 50Slider({value: this.value,onChange: (v) > this.value v })NumberBox({value: this.value,onChange: (v) > this.value v })2. …

關于ModbusTCP/RTU協議轉Ethernet/IP(CIP)協議的方案

IGT-DSER智能網關模塊支持西門子、倍福(BECKHOFF)、羅克韋爾AB&#xff0c;以及三菱、歐姆龍等各種品牌的PLC之間通訊&#xff0c;支持Ethernet/IP(CIP)、Profinet(S7)&#xff0c;以及FINS、MC等工業自動化常用協議&#xff0c;同時也支持PLC與Modbus協議的工業機器人、智能儀…

通義萬相2.1 × 藍耘智算:AIGC 界的「黃金搭檔」如何重塑創作未來?

在人工智能生成內容&#xff08;AIGC&#xff09;領域&#xff0c;通義萬相2.1與藍耘智算的結合&#xff0c;正以技術協同效應重新定義創作的可能性。這一組合不僅突破了傳統創作工具的效率瓶頸&#xff0c;更通過算法與算力的深度融合&#xff0c;為影視、廣告、游戲、教育等領…

【FreeRTOS】FreeRTOS操作系統在嵌入式單片機上裸機移植

目錄 一 RTOS概述 二 FreeRTOS移植 三 FreeRTOS使用 四 附錄 一 RTOS概述 先了解一些基礎概念&#xff0c;以下內容摘自FreeRTOS官網&#xff08;FreeRTOS? - FreeRTOS?&#xff09;&#xff1a; 【1】RTOS基礎知識 實時操作系統 (RTOS) 是一種體積小巧、確定性強的計算機…