首页 > 其他分享 >01_SerialPort类串口通信

01_SerialPort类串口通信

时间:2024-05-06 17:12:36浏览次数:24  
标签:Parity 01 string System SerialPort 串口 using serial

 

文档:SerialPort 类 (System.IO.Ports) | Microsoft Learn

 

 

页面展示:

 代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Timer = System.Windows.Forms.Timer;

namespace MyModbusTool
{
    public partial class FormModnus2 : Form
    {
        //串口类对象
        private SerialPort serial;
        //计时器
        private Timer timer;
        private Thread reavThread;
        public FormModnus2()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;//跨线程检测关闭
            InitUI();
            //初始化
            serial = new SerialPort();
            timer = new Timer();
            timer.Tick += Timer_Tick;

        }

        /// <summary>
        /// 通过线程方式去接收数据
        /// </summary>
        public void StarreavThread()
        {
            reavThread = new Thread(() =>
            {
                while (true)
                {
                    try
                    {
                        //阻塞线程,先读一个字节
                        //没有数据就会阻塞,直到有数据才会执行
                        int first = serial.ReadByte();
                        int len = serial.BytesToRead;//获取剩下缓冲区中数据的字节数。
                        byte[] left = new byte[len];
                        int nRead = serial.Read(left, 0, len);

                        //合并数据到 data
                        byte[] data= new byte[1+len];
                        data[0] = (byte)first;
                        for(int i=0;i<len;i++)
                        {
                            data[1 + i] = left[i];
                        }

                        //获取原有的内容
                        String strText = tbxJS.Text;
                        String content = Encoding.GetEncoding("GB2312").GetString(data);
                        String time = DateTime.Now.ToString("HH:mm:ss.fff:");

                        tbxJS.Text = strText + "\r\n" + time + content;

                    }
                    catch (Exception e)
                    {
                        break;
                    }
                }
            });
            reavThread.Start();
        }



        #region 初始化UI
        /// <summary>
        /// 初始化UI
        /// </summary>
        public void InitUI()
        {
            //获取本机的所有的串口名称
            string[] _porNames = SerialPort.GetPortNames();
            foreach (string _porName in _porNames)
            {
                this.cbxCKMC.Items.Add(_porName);
            }
            this.cbxCKMC.SelectedIndex = 0;//默认选中第一个

            //设置波特率
            string[] baudRates = { "9600", "14400", "19200", "38400", "57600", "115200" };
            foreach (string baudRate in baudRates)
            {
                this.cbxBTL.Items.Add(baudRate);
            }
            this.cbxBTL.SelectedIndex = 0;


            //数据位
            string[] dataBits = { "8", "7", "6", "5", };
            foreach (string s in dataBits)
            {
                this.cbxSJW.Items.Add(s);
            }
            this.cbxSJW.SelectedIndex = 0;

            //奇偶校验
            Parity[] parities = { Parity.None, Parity.Odd, Parity.Even, Parity.Mark, Parity.Space };
            foreach (Parity s in parities)
            {
                this.cbxJOJY.Items.Add(s);
            }
            this.cbxJOJY.SelectedIndex = 0;


            //停止位
            StopBits[] stopBits = { /*StopBits.None, */StopBits.One, StopBits.Two, StopBits.OnePointFive };
            foreach (StopBits s in stopBits)
            {
                this.cbxTZW.Items.Add(s);
            }
            this.cbxTZW.SelectedIndex = 0;

        }
        #endregion

        #region 打开串口
        /// <summary>
        /// 打开串口
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDKCK_Click(object sender, EventArgs e)
        {
            try
            {
                if (btnDKCK.Text == "打开串口")
                {
                    string _cbxCKMC = this.cbxCKMC.SelectedItem.ToString();//窗口名称
                    string _cbxBTL = this.cbxBTL.SelectedItem.ToString();//波特率
                    string _cbxSJW = this.cbxSJW.SelectedItem.ToString();//数据位
                    string _cbxJOJY = this.cbxJOJY.SelectedItem.ToString();//奇偶校验
                    string _cbxTZW = cbxTZW.SelectedItem.ToString();//停止位

                    serial.PortName = _cbxCKMC;
                    serial.BaudRate = Convert.ToInt32(_cbxBTL);
                    serial.DataBits = Convert.ToInt32(_cbxSJW);
                    serial.Parity = (Parity)Enum.Parse(typeof(Parity), _cbxJOJY);
                    serial.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _cbxTZW);

                    serial.Open();
                    StarreavThread();

                    groupBox1.Enabled = false;
                    btnDKCK.Text = "关闭串口";
                }
                else
                {
                    serial.Close();
                    groupBox1.Enabled = true;
                    btnDKCK.Text = "打开串口";
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        #endregion

        /// <summary>
        /// 发送
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void butFS_Click(object sender, EventArgs e)
        {
            if (serial.IsOpen)
            {
                String StrMsg = tbxFS.Text;
                byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(StrMsg);
                serial.Write(bytes, 0, bytes.Length);
            }
        }

        /// <summary>
        /// 自动发送
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBox1_CheckStateChanged(object sender, EventArgs e)
        {
            try
            {
                //如果勾选
                if (checkBox1.Checked)
                {
                    int intervaar = Convert.ToInt32(tbxFSJG.Text);//获取间隔时间
                    timer.Interval = intervaar;
                    timer.Start();//开始执行
                }
                else
                {
                    timer.Stop();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        /// <summary>
        /// 定时器响应事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer_Tick(object sender, EventArgs e)
        {
            butFS_Click(null, null);
        }

        /// <summary>
        /// 窗体关闭
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormModnus_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (serial.IsOpen)
            {
                serial.Close();
            }
        }
    }
}

 

标签:Parity,01,string,System,SerialPort,串口,using,serial
From: https://www.cnblogs.com/MingQiu/p/18175426

相关文章

  • 【专题STM32F03】 使用 STM32Cube\Repository\STM32Cube_FW_F1_V1.8.5 中例程由ST77
    1)修改Project\STM32Cube_FW_F1_V1.8.5\Projects\STM32F103RB-Nucleo\Demonstrations\Adafruit_LCD_1_8_SD_Joystick2)接线(见stm32f1xx_nucleo.h)LCD_LED_PIN接高电平LCD_CS_PIN  接PB6LCD_DC_PIN  接PA9LCD_SPI_CLK  接SPI1,PA5LCD_SPI_SDA  接SPI1,PA73)修......
  • 01-电商商品中心解密:仅凭SKU真的足够吗?
    在电子商务系统中,SKU(StockKeepingUnit,库存单位)和SPU(StandardProductUnit,标准产品单位)是两种不同的概念,它们共同用于商品管理和库存控制。虽然理论上可以只使用SKU来管理商品,但在实际应用中,同时使用SPU和SKU有其明显的优势和必要性。SKU(库存单位)SKU是商品的具体型号或款式,每......
  • AtCoder Grand Contest 001
    D.ArraysandPalindrome如果两个字符要求相同就给它们连边,对于一个长度为\(x\)的回文串,\(x\)是偶数会连\(x/2\)条边,奇数会连\(x/2-0.5\)条边。\(a\)和\(b\)两个序列总和为\(2n\),要让\(n\)个字符相同至少连\(n-1\)条边,也就是奇数个数超过\(2\)时一定无解......
  • dama0103第1章 数据管理第2章 数据处理伦理第3章 数据治理
    第1章数据管理1.数据管理的定义:是为了交付、控制、保护并提升数据和信息资产的价值,在其整个生命周期中制定计划、制度、规程和实践活动,并执行和监督的过程。2.数据管理目标:1)理解并支撑企业机器利益相关方的信息需求得到满足。2)获取、存储、保护数据和确保数据资产的完整性3)确......
  • [SDOI2015] 星际战争 题解
    假如将所有激光武器放在一边,所有机器人放在一边,激光武器向它可以伤害的机器人连边,再加超级源/汇点,这就是一个网络流问题。考虑激光武器向机器人连的边容量无限,而机器人向超级汇点连的边容量为机器人的装甲值,而超级源点连向激光武器的边则是用时\(\times\)激光武器伤害。发现假......
  • 通过劫持线程arena实现任意地址分配 n1ctf2018_null
    通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至❗BUU上的n1ctf2018_null很好的说明了这个问题题目链接:BUUCTF在线评测(buuoj.cn)看一下保护:除了pie保护剩下的保护全开了,64位ida载入看一下上来是一个输入密码,密码是i'mreadyforchallenge......
  • 洛谷P2375 [NOI2014] 动物园
    动物园题目描述输入格式输出格式输入输出样例输入3aaaaaababcababc输出36132开始时都没看出来这是kmp板子题先看看AC代码吧#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintmaxn=1e6+10;constintmod=1e9+7;chara[maxn];in......
  • P1028 [NOIP2001 普及组] 数的计算
    题目链接:观察样例。当输入\(n=6\)时,6本身算一个。当6后加的数为1时只有一个。6后加的数为2时有62,621两个。6后加的数为3时有63、631两个。可以看到,我们往\(n\)后加的每一个不超过\(\dfrac{n}{2}\)的数都可以继续延伸。考虑递推。\(f[i]\)表示以\(i......
  • [ICPC2017 WF] Scenery
    提供一个\(O(n^2\alpha(n))\)的做法。这种匹配问题如果直接寻找最优的匹配方式是困难的,因为\(\geqslantk\)的限制,当前匹配的点会对之后的产生不小的影响。但是如果我们\(\text{fix}\)好了一个选择的升序位置序列\(a\),想要判定其是否合法是容易的,需要以下两个条件:\(1.\)......
  • 《自动机理论、语言和计算导论》阅读笔记:p352-P401
    《自动机理论、语言和计算导论》学习第12天,p352-P401总结,总计50页。一、技术总结1.TuringMachine(TM)2.undecidability​a.Ld(thediagonalizationlanguage)3.reductionp392,Ingeneral,ifwehaveanalgorithmtoconvertinstancesofaproblemP1toi......