SerialportToTCP② 全

效果補全(代碼):

namespace SerialportToTCP
{public partial class Form1 : Form{IniHelper Ini;string[] botelvs = new string[] { "1200", "4800", "9600", "13200" };public Form1(){InitializeComponent();//1 讀取配置文件string dirPath = Path.Combine(Application.StartupPath, "File");// debug/filestring filePath = Path.Combine(dirPath, "Setting.ini");// debug / file/setting.iniIni = new IniHelper(filePath); //創建讀取對象// 添加串口comboBox1.Items.AddRange(SerialPort.GetPortNames());// 獲取所有串口 拼接在下拉框的items中comboBox2.Items.AddRange(botelvs);// 添加波特率數組comboBox2.Items.Add("自定義");//添加一個comboBox3.Items.AddRange(new string[] { "5", "6", "7", "8" });comboBox4.Items.AddRange(new string[] { "無", "奇校檢", "偶校檢" });comboBox5.Items.AddRange(new string[] { "無", "1", "2", "1.5" });//2開始處理串口接受數據事件//處理串口的數據this.serialPort1.DataReceived += SerialPort1_DataReceived;//3 處理界面顯示默認值 也就是從ini文件讀取數據readSetting();//4 開始串口通信startChuanKou();//5 開始網口通信startTCP();}//開始搭建TCP服務器TcpListener listen;List<TcpClient> lists = new List<TcpClient>();//存放所有的客戶端void startTCP(){if(!int.TryParse(textBox3.Text,out int port) || port < 1 || port >65563){MessageBox.Show("請輸入正確的端口號");}//開啟服務器 接受客戶端try{listen = new TcpListener(System.Net.IPAddress.Any, port);listen.Start(100); //開始監聽panel2.BackColor = Color.Green;//把多個客戶端接受到數組里面 異步接受new Task(() => {try{while (true){//接收客戶端TcpClient c1 = listen.AcceptTcpClient();// 把客戶端添加到數組里面 群發需要lists.Add(c1);//接收客戶端發來的消息tcpReceive(c1);}}catch{MessageBox.Show("TCP服務器關閉");}}).Start();}catch{MessageBox.Show("TCP啟動失敗");//把tcp關閉等操作foreach (var item in lists){item.Close(); //關閉所有的客戶端}listen.Stop();panel2.BackColor = Color.Gray;}}//tcp 接收數據void tcpReceive(TcpClient c1){new Task(() =>{NetworkStream stream = c1.GetStream();try{while (c1.Connected) //客戶端連接的時候{byte[] bs = new byte[1024];int length =  stream.Read(bs, 0, bs.Length);if (length == 0) throw new Exception(); // 客戶端斷了//接收到數據亮燈tcpLiangDeng();//把數據轉給串口if (!serialPort1.IsOpen){MessageBox.Show("串口關閉");break;}//把數據轉給串口 serialPort1發送數據, com6能接受到消息,serialPort1.Write(bs, 0, length);}}catch{c1.Close();lists.Remove(c1);}}).Start();}//tcp 接收到數據亮燈的方法async void tcpLiangDeng(){this.Invoke((Action)(() =>{textBox2.Text = (int.Parse(textBox2.Text) + 1).ToString();//亮燈panel4.BackColor = Color.Green;}));//過一段時間await Task.Delay(70);this.Invoke((Action)(() =>{//關燈panel4.BackColor = Color.Gray;}));}void startChuanKou(){// 配置串口對象try{this.serialPort1.PortName = comboBox1.Text;//配置串口名稱this.serialPort1.BaudRate = int.Parse(comboBox2.Text); //波特率this.serialPort1.DataBits = int.Parse( comboBox3.Text);this.serialPort1.StopBits = (StopBits)comboBox5.SelectedIndex;// 正常賦值 StopBits.None 枚舉值。正好對應數據0this.serialPort1.Parity = (Parity)comboBox4.SelectedIndex; // this.serialPort1.Open();//亮燈this.panel1.BackColor = Color.Green;}catch{MessageBox.Show("打開串口失敗");//停止串口if(serialPort1.IsOpen) serialPort1.Close();//滅燈this.panel1.BackColor = Color.Gray;}}void readSetting(){//先配置串口comboBox1.SelectedItem = Ini.Read("Serialport", "name", "");string botelv = Ini.Read("Serialport", "botelv", "9601");int botelvIndex = Array.IndexOf(botelvs, botelv);// 獲取botelv在數組里面的索引值if (botelvIndex != -1) // 證明波特率在數組里面{comboBox2.SelectedIndex= botelvIndex;comboBox2.DropDownStyle = ComboBoxStyle.DropDownList;}else{//波特率在數組里面 自定義波特率情況comboBox2.DropDownStyle = ComboBoxStyle.DropDown; //可編輯的下拉框//DropDownList 不可編輯的下拉框comboBox2.Text = botelv;}//處理數據位comboBox3.SelectedItem = Ini.Read("Serialport", "databit", "8");//處理奇偶校檢comboBox4.SelectedIndex = Ini.Read("Serialport", "parity", 0);comboBox5.SelectedIndex = Ini.Read("Serialport", "stopbit", 0);comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;comboBox3.DropDownStyle = ComboBoxStyle.DropDownList;comboBox4.DropDownStyle = ComboBoxStyle.DropDownList;comboBox5.DropDownStyle = ComboBoxStyle.DropDownList;//網口數據的讀取textBox3.Text = Ini.Read("NetWork", "port", "8080");if( Ini.Read("NetWork", "heartOn", false)){radioButton1.Checked = true;}else{radioButton2.Checked = true;}textBox4.Text= Ini.Read("NetWork", "heartTime", "60000");// 心跳間隔  textBox5.Text = Ini.Read("NetWork", "heartData", ""); //心跳包數據checkBox1.Checked = Ini.Read("NetWork", "heartHex", false);//s是否采用16進制}// 接受串口傳遞數據private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){byte[] bs = new byte[1024]; //定義一個字節數組int count = serialPort1.Read(bs, 0, bs.Length); //讀取數據到字節數組里面if (count == 0){//關閉串口//停止串口if (serialPort1.IsOpen) serialPort1.Close();//滅燈this.panel1.BackColor = Color.Gray;}//1 接收到1條串口數據 需要panel3亮一次 封裝一個方法控制效果jieShouDaoChuankou();//2 轉發給所有客戶端數據 串口轉網口就是把串口數據通過網絡轉給其他客戶端 foreach (var item in lists){item.GetStream().Write(bs, 0, bs.Length);}}async void jieShouDaoChuankou(){this.Invoke((Action)(() =>{textBox1.Text = (int.Parse(textBox1.Text)+1).ToString();//亮燈panel3.BackColor = Color.Green;}));//過一段時間await Task.Delay(70);this.Invoke((Action)(() =>{//關燈panel3.BackColor = Color.Gray;}));}//波特率下拉框觸發變化的時候調用private void comboBox2_SelectedIndexChanged(object sender, EventArgs e){if (comboBox2.SelectedItem.ToString() == "自定義"){//切換到自定義選項上comboBox2.DropDownStyle= ComboBoxStyle.DropDown;}else{comboBox2.DropDownStyle = ComboBoxStyle.DropDownList;}}//選中心跳開關為開的時候private void radioButton1_CheckedChanged(object sender, EventArgs e){//MessageBox.Show(textBox4.Text + "????/");if (radioButton1.Checked){//選中心跳timer1.Interval = string.IsNullOrEmpty(textBox4.Text) ? 2000 : int.Parse(textBox4.Text); timer1.Tick += Timer1_Tick;timer1.Start();}}//定時器函數private void Timer1_Tick(object sender, EventArgs e){//定時發送數據string data = textBox5.Text; //心跳數據 2選中hex證明把2轉成16進制,byte[] buffer;if (checkBox1.Checked == true){//需要發16進制的心跳string[] ds = data.Split(' '); //把2按照空格符號分割成數組結構[2]buffer = new byte[ds.Length]; //buffer數組長度就是ds的長度for (int i = 0; i < ds.Length; i++){//System.Globalization.NumberStyles.HexNumber 轉成16進制數//把ds[i]轉成16進制buffer[i] = byte.Parse(ds[i], System.Globalization.NumberStyles.HexNumber);}}else{//不采用16進制的心跳包buffer = Encoding.UTF8.GetBytes(data);}foreach (var item in lists){item.GetStream().Write(buffer, 0, buffer.Length);}}//關閉心跳private void radioButton2_CheckedChanged(object sender, EventArgs e){timer1.Stop();}//重啟private void button1_Click(object sender, EventArgs e){//停掉tcpforeach (var item in lists){item.Close(); //關閉所有的客戶端}listen.Stop();panel2.BackColor = Color.Gray;//停掉串口if (serialPort1.IsOpen) serialPort1.Close();//滅燈this.panel1.BackColor = Color.Gray;//開啟tcpstartTCP();//開啟串口startChuanKou();}//保存private void button2_Click(object sender, EventArgs e){//Serialport", "databit", "8");Ini.Write("Serialport", "name", comboBox1.Text);Ini.Write("Serialport", "botelv", comboBox2.Text);Ini.Write("Serialport", "stopbit", comboBox5.SelectedIndex);Ini.Write("Serialport", "parity", comboBox4.SelectedIndex);Ini.Write("Serialport", "databit", comboBox3.Text);//5 6 7 8 Ini.Write("NetWork", "port", textBox3.Text);Ini.Write("NetWork", "heartOn",radioButton1.Checked);Ini.Write("NetWork", "heartTime", textBox4.Text);Ini.Write("NetWork", "heartData", textBox5.Text);Ini.Write("NetWork", "heartHex", checkBox1.Checked);}}
}

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

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

相關文章

Elasticsearch:Painless scripting 語言(一)

Painless 是一種高性能、安全的腳本語言&#xff0c;專為 Elasticsearch 設計。你可以使用 Painless 在 Elasticsearch 支持腳本的任何地方安全地編寫內聯和存儲腳本。 Painless 提供眾多功能&#xff0c;這些功能圍繞以下核心原則&#xff1a; 安全性&#xff1a;確保集群的…

安卓gdb 建立鏈接

adbshell gdbserver :1234 testdcam --sensor 0 --workmode 0 --args preview-size1024x600,picture-size640x480, --time 10 adb forwardtcp:1234 tcp:1234 //設置adb的轉發 ./prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/arm-linux-androideabi-gdb out/tar…

近紅外光譜腦功能成像(fNIRS):1.光學原理、變量選取與預處理

一、朗伯-比爾定律與修正的朗伯-比爾定律 朗伯-比爾定律 是一個描述光通過溶液時被吸收的規律。想象你有一杯有色液體&#xff0c;比如一杯紅茶。當你用一束光照射這杯液體時&#xff0c;光的一部分會被液體吸收&#xff0c;導致透過液體的光變弱。朗伯-比爾定律告訴我們&#…

mmdetection3D指定版本安裝指南

1. 下載指定版本號 選擇指定版本號下載mmdetection3d的源碼&#xff0c;如這里選擇的是0.17.2版本 git clone https://github.com/open-mmlab/mmdetection3d.git -b v0.17.22. 安裝 cd mmdetection3d安裝依賴庫 pip install -r requirment.txt編譯安裝 pip install -v e .…

redis主從復制哨兵模式集群管理

主從復制&#xff1a; 主從復制是高可用Redis的基礎&#xff0c;哨兵和集群都是在主從復制基礎上實現高可用的。主從復制主要實現了數據的多機備份&#xff0c;以及對于讀操作的負載均衡和簡單的故障恢復。缺陷&#xff1a;故障恢復無法自動化&#xff1b;寫操作無法負載均衡&…

軟件測試與質量保證 | 云班課簡答題庫

目錄 第14章 質量相關簡答題 第15章 測試實際相關簡答題 第16章 測試基本相關簡答題 第14章 質量相關簡答題 1. 簡述基本的測量原則。 測量應該基于該應用領域正確的理論之上&#xff0c;并在測量的定義中確定測度的目標&#xff1b;每一個技術測量的定義應該具有一致性和客…

HbuilderX:安卓打包證書.keystore生成與使用

前置條件 已安裝jdk或配置好jre環境。 .keystore生成 打開cmd,切換到目標路徑,輸入以下命令, keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore 輸入密鑰庫口令(要記住), 然后輸入一系列信息, …

ui.perfetto.dev sql 查詢某個事件范圍內,某個事件的耗時并降序排列

ui.perfetto.dev sql 查詢某個事件范圍內,某個事件的耗時并降序排列 1.打開https://ui.perfetto.dev 導入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.點擊Query(SQL),在輸入框中輸入以下內容,按CtrlEnter,顯示查詢結果4.點擊Show timeline,點擊…

2024年07年01日 Redis數據類型以及使用場景

String Hash List Set Sorted Set String&#xff0c;用的最多&#xff0c;對象序列化成json然后存儲 1.對象緩存&#xff0c;單值緩存 2.分布式鎖 Hash&#xff0c;不怎么用到 1.可緩存經常需要修改值的對象&#xff0c;可單獨對對象某個屬性進行修改 HMSET user {userI…

Windows快速打開某個路徑下的PowerShell

按住Shift右鍵打開&#xff1a; 在桌面或者文件夾頁面中&#xff0c;按住右鍵&#xff0c;在彈出的右鍵菜單中選擇“在終端中打開”或“在此處打開Powershell窗口“&#xff0c;就可打開windows PowerShell界面&#xff0c;且路徑為桌面或打開的文件夾所在路徑。

淺談貝葉斯定理

引言 貝葉斯定理用于確定事件的條件概率。它以一位英國統計學家的名字命名&#xff0c;托馬斯貝葉斯他在1763年發現了這個公式。貝葉斯定理是數學中一個非常重要的定理&#xff0c;它為一種獨特的統計推斷方法奠定了基礎。貝氏推論它用于根據可能與事件相關的條件的先驗知識&a…

C++基礎(三):C++入門(二)

上一篇博客我們正式進入C的學習&#xff0c;這一篇博客我們繼續學習C入門的基礎內容&#xff0c;一定要學好入門階段的內容&#xff0c;這是后續學習C的基礎&#xff0c;方便我們后續更加容易的理解C。 目錄 一、內聯函數 1.0 產生的原因 1.1 概念 1.2 特性 1.3 面試題 …

用隨機森林算法進行的一次故障預測

本案例將帶大家使用一份開源的S.M.A.R.T.數據集和機器學習中的隨機森林算法&#xff0c;來訓練一個硬盤故障預測模型&#xff0c;并測試效果。 實驗目標 掌握使用機器學習方法訓練模型的基本流程&#xff1b;掌握使用pandas做數據分析的基本方法&#xff1b;掌握使用scikit-l…

三大常用集合

1.Set集合 在Java中&#xff0c;Set是一種集合類型&#xff0c;它是一種不允許包含重復元素的集合&#xff0c;每個元素在Set中是唯一的。Set接口的常用實現類有HashSet、TreeSet和LinkedHashSet。以下是關于Set集合的一些重要特點和用法&#xff1a; 特點&#xff1a; 不允…

什么是mysql的回表操作

MySQL中的“回表”操作是指在執行查詢時&#xff0c;由于索引結構的限制&#xff0c;數據庫系統需要從非聚集索引&#xff08;Secondary Index&#xff09;中找到主鍵值&#xff0c;然后使用這些主鍵值回溯到聚集索引&#xff08;Clustered Index&#xff09;中獲取完整的行數據…

珠江電纜,承載您夢想的每一度電

在現代社會&#xff0c;電力無處不在&#xff0c;它不僅是經濟發展的動力&#xff0c;更是每個人生活中不可或缺的能量來源。而在這個電力驅動的世界里&#xff0c;有一家企業默默地承載著千家萬戶的夢想&#xff0c;它就是珠江電纜。 連接夢想的每一度電 珠江電纜成立于2001…

使用Java實現單元測試:JUnit教程

使用Java實現單元測試&#xff1a;JUnit教程 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在軟件開發中&#xff0c;單元測試是保證代碼質量和功能正確性的重要手段之一。JUnit是Java語言中最流行…

絕區零國際服下載 一鍵下載絕區零國際服教程

絕區零是一款米哈游傾情打造的全新都市幻想動作角色扮演游戲。在游戲中&#xff0c;我們將扮演一名繩匠&#xff0c;這是為出于各種原因需要進入危險空洞的人提供指引的專業人士。您將與獨特的角色一起踏上冒險之旅&#xff0c;攜手探索空洞&#xff0c;對戰強大敵人&#xff0…

【狀態估計】線性高斯系統的狀態估計——離散時間的遞歸濾波

前兩篇文章介紹了離散時間的批量估計、離散時間的遞歸平滑&#xff0c;本文著重介紹離散時間的遞歸濾波。 前兩篇位置&#xff1a;【狀態估計】線性高斯系統的狀態估計——離散時間的批量估計、【狀態估計】線性高斯系統的狀態估計——離散時間的遞歸平滑。 離散時間的遞歸濾波…

ollama將模型永遠加載在顯存里

問題解析 我們在使用ollma部署大語言模型的時候,如果部署的模型尺寸較大,往往在第一次加載的時候需要花費大量的時間加載模型;等加載完成后,如果長時間不調用模型,我們會發現模型已經被釋放掉了,又要重新加載,導致體驗感極差. 這是為什么呢?因為在沒被調用時,ollama默認在顯…