精华内容
下载资源
问答
  • c#串口控件
    2016-05-09 09:58:23
    从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。如果有必要修改主 Form 或 Control 中的元素,必须使用 Invoke 回发更改请求,这将在正确的线程上执行.

    进而要想将辅助线程中所读到的数据显示到主线程的Form控件上时,只有通过Invoke方法来实现,将Invoke方法内的命令在调用Invoke方法的对象(这里是this.tB_ReceiveDate控件)所在的线程上执行。


    串口被打开后,系统会创建一个监听线程,使用中断方式等待系统事件,当系统通知到线程,线程触发事件:SerialPort.DataReceived,这个方法是在ui界面以外的一个线程上运行的。


    参考:http://bbs.csdn.net/topics/360065257

    更多相关内容
  • JS调用C#串口控件

    2019-05-05 17:27:24
    代码在VS2017环境下测试通过 实现网页通过JS加载C#写的ACTIVE控件进行串口操作的过程 C# 控件安装源码 C# 控件发布源码 JS 源码 串口虚拟工具 串口调试工具
  • C# 串口SerialPort控件

    千次阅读 2021-12-31 21:53:39
    串口对于工控领域应用较为广泛

    串口对于工控领域应用较为广泛,串口通讯类型主要分为RS-232,RS-485。

    RS-232 也称标准串口,最常用的一种串行通讯接口。目前常用为9芯D型插座(DB9),在两台电脑之间通讯需要用到D行头的端子(2、3、5),分别为读、写、信号地。在两台电脑通讯时需要对信号端子2和3进行对调,一端的写“端子3”对应另一端的读“端子2”,信号地端子直连即可,接线图如下。

    目前,大部分的笔记本已经不在配置RS-232物理串口,如何在计算机进行串口程序调试,就需要用到vspd虚拟串口软件,用这个软件可以在电脑上虚拟出来串口,虚拟出的可以1对1进行绑定。

    此软件可以添加、删除、重置端口,上图已经增加了3对串口,COM1~COM2,COM3~COM4,COM5~COM6,可以相互通讯,这样就能在笔记本上进行串口程序的调试,工具VSPD6.9.zip-网络设备文档类资源-CSDN下载

    下面进行C# SerialPort介绍

    1、BaudRate:波特率,两个串口之间通讯,需要两端的波特率设置一致,否则,数据接收会出现乱码,如果波特率不同,串口也能接收到数据,知识分析内容不一致;波特率越高,传输距离就越短,当波特率为115200时,保证数据完整,需要线长小于10m,如果线距过大会造成误码的情况,传输效率会降低。

    2、PortName:串口名称,在windows计算机下,串口的命名都是以COM开头,串口1则为COM1,以此类推,串口10即为COM10,由于C#加Mono,可使C#程序运行在Linux主机上,SerialPort控件时支持跨平台的,但是在linux下,串口命名/dev/ttyS0,即填写对应名称在PortName上即可,此属性string类型。

    3、IsOpen:是否打开,通过此属性进行串口打开的判断。

    4、BytesToRead:串口读缓冲中的字节数,通过此属性判断是否有数据。

    5、Close()方法:用来关闭串口,当程序退出时,需要对串口进行关闭。

    6、Open()方法:用来打开串口,当串口打开时,即可进行数据发送和接收。

    7、Write()方法:用来写串口数据,传输数据使用byte[]数组和长度。

    8、Read()方法:用BytesToRead的长度从读缓冲区中读取数据到byte[]数组中,当执行Read()方法后,缓冲区数据同时清空。

    下面对SerialPort控件进行封装,对发送数据增加头、尾、校验,防止传输过程中数据丢失,代码见下图。

        public class SerialPortClass
        {
            /// <summary>
            /// 串口组件
            /// </summary>
            private SerialPort serialPort = new SerialPort();
            /// <summary>
            /// 是否启动线程
            /// </summary>
            private bool IsStart = false;
            /// <summary>
            /// 数据列表
            /// </summary>
            public List<byte> DataList = new List<byte>();
            /// <summary>
            /// 缓冲区列表
            /// </summary>
            private List<byte> buffer = new List<byte>();
            /// <summary>
            /// 串口名称
            /// </summary>
            public string PortName = "COM1";
            /// <summary>
            /// 初始化
            /// </summary>
            /// <param name="_portname"></param>
            public SerialPortClass()
            {
                try
                {
                    ReadParam();
                    serialPort.Close();
                    serialPort.PortName = PortName;
                    serialPort.BaudRate = 9600;
                }
                catch (Exception ex)
                {
                    LogHelper.Debug(ex);
                }
            }
    
            public void ReadParam()
            {
                try
                {
                    PortName = ConfigurationManager.AppSettings["PortName"];
                }
                catch (Exception ex)
                {
                    LogHelper.Debug(ex);
                }
    
            }
            /// <summary>
            /// 打开串口
            /// </summary>
            /// <returns></returns>
            public bool OpenCom()
            {
                bool Ret = false;
                try
                {
                    CloseCom();
                    if (!serialPort.IsOpen)
                    {
                        serialPort.Open();
                        DataList.Clear();
                        Ret = true;
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Debug(ex);
                }
                return Ret;
            }
            /// <summary>
            /// 关闭串口
            /// </summary>
            public void CloseCom()
            {
                try
                {
                    serialPort.Close();
                }
                catch (Exception ex)
                {
                    LogHelper.Debug(ex);
                }
            }
    
            /// <summary>
            /// 启动任务
            /// </summary>
            public void StartTask()
            {
                try
                {
                    IsStart = true;
                    Thread task = new Thread(new ThreadStart(Run));
                    task.IsBackground = true;
                    task.Start();
                }
                catch (Exception ex)
                {
                    LogHelper.Debug(ex);
                }
            }
    
            /// <summary>
            /// 停止任务
            /// </summary>
            public void StopTask()
            {
                try
                {
                    IsStart = false;
                }
                catch (Exception ex)
                {
                    LogHelper.Debug(ex);
                }
            }
    
            /// <summary>
            /// 读取数据
            /// </summary>
            private void Run()
            {
                while (true)
                {
                    if (!IsStart) break;
                    try
                    {
                        if (serialPort.IsOpen)
                        {
                            int count = serialPort.BytesToRead;
                            if (count > 0)
                            {
                                byte[] buf = new byte[count];
                                serialPort.Read(buf, 0, count);
                                buffer.AddRange(buf);
                                while (buffer.Count >= 2)
                                {
                                    if (buffer[0] == 0x02) //帧头
                                    {
                                        int len = buffer[1]; //长度
                                        if (buffer.Count < len + 4)     //完整数据为帧长+4   头1 长度1 命令 校验1 尾1
                                        {                               //                   02    01   A     X  03
                                            break;
                                        }
                                        byte sum = 0;
                                        for (int i = 1; i < len + 2; i++) //校验
                                        {
                                            sum += buffer[i];
                                        }
                                        if (buffer[len + 3] == 0x03 && buffer[len + 2] == sum)
                                        {
                                            if (DataList.IndexOf(buffer[len + 1]) < 0)
                                                DataList.Add(buffer[len + 1]);
                                        }
                                        buffer.RemoveRange(0, len + 4);
                                    }
                                    else
                                    {
                                        buffer.RemoveAt(0);
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Debug(ex);
                    }
                    Thread.Sleep(10);
                }
            }
    
            public void SendBuff(byte _order)
            {
                try
                {
                    if (serialPort.IsOpen)
                    {
                        byte[] buff = new byte[5];
                        buff[0] = 0x02;
                        buff[1] = 0x01;
                        buff[2] = _order;
                        byte sum = buff[1];
                        sum += buff[2];
                        buff[3] = sum;
                        buff[4] = 0x03;
                        serialPort.Write(buff, 0, buff.Length);
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.Debug(ex);
                }
            }
       }

    展开全文
  • 基于C#编程的串口通讯例程,使用自带控件serialPort完成数据发送与接受,ini文件进行数据参数保存与加载。
  • 串口配置控件 实现效果 控件 说明 label4 显示连接状态 串口号combox 初始化时自动搜索串口并添加 波特率combox 限定选择项(115200等) 数据位combox 5,6,7,8 停止位combox 0, 1.5, 2 自动重...

    总述

    winform自定义组合控件可以对经常使用的一些功能进行封装到一起,形成一个新的控件,方便使用。

    示例说明

    创建项目

    打开VS,选择窗体控件库创建项目

    串口配置控件

    实现效果

    在这里插入图片描述

    控件说明
    label4显示连接状态
    串口号combox初始化时自动搜索串口并添加
    波特率combox限定选择项(115200等)
    数据位combox5,6,7,8
    停止位combox0, 1.5, 2
    自动重连checkbox串口因某些原因断开时自动尝试重连
    启动button启动串口并创建线程接收,收到后传入回调
    搜索picturebox手动搜索串口号

    实现代码

    搜索串口号

    ` string[] com_array = SerialPort.GetPortNames();
      comboBox1.Items.Clear();
      comboBox1.Items.AddRange(com_array);`
    

    回调函数

    public delegate void DataProcCallBack(byte[] data, int len);  //定义委托
    public event DataProcCallBack DataInput;
    
    //外部调用
    放置控件后再事件里找到DataInput双击就可以编写自己的处理代码了,注意改变控件时要用委托
    //示例
    delegate void setText(string t);
    void setrichText(string t)
    {
        if (richTextBox1.InvokeRequired)
        {
        while (!richTextBox1.IsHandleCreated)
        {
        //解决窗体关闭时出现“访问已释放句柄“的异常
        if (richTextBox1.Disposing || richTextBox1.IsDisposed)
        return;
        }
        setText st = new setText(setrichText);
        richTextBox1.Invoke(st, new object[] {t});
        }
        else
        {
        richTextBox1.AppendText(t);
        }
    }
    
    

    打开串口

     serialPort1.Open();
     if (serialPort1.IsOpen)
     {
     label4.Text = "打开成功";
     uiButton1.Text = "关闭";
     serialRevFlag = true;
     serialThread = new Thread(serialRevTask);
     serialThread.Start();
     }
    

    接收线程

     byte[] serialRevBuffer = new byte[1024];
     void serialRevTask()
     {
        while (serialRevFlag)
        {
            try
            { 
                int len =   serialPort1.Read(serialRevBuffer, 0, 1024);
                DataInput(serialRevBuffer, len);
    
            }
            catch{ 
            }
                Thread.Sleep(2);
        }
        return;
     }
    

    获取源码

    • 当前版本自动重连还未加

      关注公众号,发送 串口控件
      在这里插入图片描述

    展开全文
  • C#.NET SerialPort控件实现
  • c#串口学习笔记

    2021-11-29 20:30:54
    通过串口控件收发数据。 串口控件重要属性:Baudrate:波特率(可改) 数据位:一般为8位 PortName:COM(1这是串口号)(串口号) ReadBufferSize:4096(读缓冲区) WriteBufferSize:2048(写缓冲区) StopBi.....

    1、发送数据
     通过串口控件收发数据。
    串口控件重要属性:Baudrate:波特率(可改)
                           数据位:一般为8位
                           PortName:COM(1这是串口号)(串口号)
                           ReadBufferSize:4096(读缓冲区)
                           WriteBufferSize:2048(写缓冲区)
                           StopBits:One(停止位)

    2、窗口控件:

    一个编辑框

    一个按钮
    代码顺序:
    1、初始化将十进制转为16进制,有256个16进制数。
    ToString("x")将数字转换为16进制字符串,ToUpper是将字符串所有字符大写
    2、为了让代码更加规范,进行判断如果数据长度等于1位就在它的前面加一个0让它的格式更规范。
    3、点击事件
    (1).存储下拉列表的内容
    (2).忽略前两位只读后两位
    (3). 定义一个数组只包含一个数据的数组,因为只发送一个数据所以数组只包含1个数据
    (4).将数组内的数据转换为16进制数据
    (5).进行容错处理防止串口出错
    (6).代码:

    public Form1(){
                InitializeComponent();
          }
          private void Form1_load(object sender,EventArgs e){
                string str;//用来临时存储i大写的十六进制格式字符串
                for(int i=0;i<256;i++){
                       str=i.ToString("x").ToUpper();//ToString("x")将数字转换为16进制字符串,ToUpper是将字符串所有字符大写
                       if(str.Length==1){
                             str="0"+str;//如果是一位的(0xA),此时为了对齐,在数据前加一个字符串"0"(0x0A)
                       }
                       comboBox1.Items.Add("0x"+str);//统一添加"0x"
                }
                comboBox1.Text="0X00";//初始值
          }
    
          private void button1_Click(object sender,EventArgs e){
                 string data=comboBox1.Text;//存储当前下拉列表中的内容
                 string converdata=data.Substring(2,2);//把字符分开
                 byte[] buffer=new byte[1];//数据一个字节就够用了
                 buffer[0]=Convert.ToByte(converdata,16);//将字符转化为byte型变量
                 try{//容错处理
                      serialPort1.Open();//打开
                      serialPort1.Write(buffer,0,1);//发送数据 从第0个位置开始读取,读取一个字节
                      serialPort1.Close();//关闭
                 }
                 catch(Exception err){//出错后就执行此块代码  Exception err//错误信息
                        if(serialPort1.IsOpen){
                              serialPort1.Close();//如果是写数据时出错,此窗口状态为开,就应该关闭窗口,防止下次不能使用,串口是不能重复打开和关闭的
                        MessageBox.Show("端口错误","错误");
                        MessageBox.Show(err.ToString(),"错误");//显示错误信息
                        }
                 }
          }

    展开全文
  • 003.C#串口通信:MSComm控件使用详解 004.C#_.net常用控件(09软件) 005.C#_.NET常用控件(3) 006.C#_窗体及常用控件、组件 007.C#_第3章_Windows窗体与控件 008.王牌2_C__控件查询手册 009.C#_控件属性事件大全...
  • 这个是CSerialPort基于VS2015的串口类例子, 两种方式: 一种是MFC映射 另一种是信号和槽的方式 串口源码网址:https://blog.csdn.net/itas109/article/details/84282860
  • C#自带的serialPort串口控件

    千次阅读 2016-10-17 10:40:37
    //设置串口的奇偶校验为无奇偶校验  serialPort1.StopBits = System.IO.Ports.StopBits.One;//设置停止位为1  serialPort1.Open();//打开端口  byte[] outputdat = new byte[1];  outputdat[0] = 0x55; ...
  • C#串口通讯详解(SerialPort类实现)

    千次阅读 2021-08-08 09:59:51
    最终效果 窗体设置: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text;...using Syst
  • 一个用户自定义的串口可视化控件,为串口调试助手开发提供了便利。
  • Load方法里调用这个方法,可以实现程序运行时下拉框自动扫描加载串口。 程序启动后,实现下拉框动态获取串口
  • 使用C#的winform读取串口,并用chart控件显示实时数据折线图
  • 非常优秀的一个c#串口控件编程示例。
  • C#串口监听 16进制数据传输 代码可以直接运 利用串口控件实现的16进制收发通讯程序:收到的数据以16进制显示,发送数据以16进制形式发送
  • C#SerialPort控件开发串口通信程序的例子 源码,工程可用,参考性极大。可用于开发项目。
  • 5分钟用C#实现串口助手
  • C#自制用户控件——串口控件的二次开发  C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。其开发工具(IDE)Visual Studio是及其强大,用过该IDE的朋友都知道其控件库中自带...
  • visual studio c# 串口调试助手源码,支持win7-win10 自动检测系统串口,支持检测usb转串口,支持热插拔,支持自动检测插入的串口
  • C#工程文件serialport串口接收助手ADC图像采集chart控件显示,代码采用C#窗体控件其中包含了serialport控件和chart控件,可以用于单片机/stm32的ADC电压电流采集
  • C#连接串口控件随窗体扩大的方法,C#程序连接串口,通过OnDataReceived方法接受数据。
  • c#使用SerialPort串口控件

    千次阅读 2018-05-24 11:37:00
    2:设置好相关串口的配置(串口的接收事件为OnDataReceived) 3:代码如下: public Form1() { InitializeComponent(); foreach (var p in SerialPort.GetPortNames()) //获取电脑上所有的串口 { cbPorts....
  • 【亲测实用】PC与西门子PLC串口通信实例源码 文件类型:程序源代码 主要功能: PC端采用c#实现开关量输入(PPI协议,SerialPort控件) 适合人群:新手及有一定经验的开发人员
  • 上位机控件C#

    2018-12-31 21:21:45
    资源真的很不错!能配合你做出很完美的上位机界面,操作简单
  • 使用serialport类通过com串口读取ic卡数据
  • C# NuGet 添加安装串口类 引言 在使用C#窗口通信中串口是经常被用到的通信接口,我们通常使用system.io.port 中调用类以及方法。但如果安装的VS没有安装对应的库,是需要通过 NuGet 添加安装串口类的。否者会提示...
  • C#串口助手,基于.Net5.0开发的WPF程序,实现串口通信功能,具有收发信息的设置,其中还包含WPF打包程序,无广告及开源。 特点: 1.自动查找并列出可用串口。 2.设置接受是否换行、显示发送内容、显示时间等设置。 3...
  • C# 使用SerialPort控件制作的串口助手,请忽略我的名字,源代码全部开放,实现功能有收发数据,自动收发,十六进制收发和收发文件等。大家可以下载可以修改,完全开源。好东西值得这么多分。
  • 在开发中有些串口设备需要串口供电,使用C#中的SerialPort类默认情况下不会出发DataReceived函数,但使用超级终端却可以接收到数据,这是因为 SerialPort 类的DtrEnable 和RtsEnable 两个属性默认是false,设为true...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,181
精华内容 1,672
关键字:

c#串口控件