精华内容
下载资源
问答
  • serialport串口控件
    千次阅读
    2016-10-17 10:40:37
                        //serialPort1.PortName = "COM4";
                        serialPort1.PortName = ReadTenCom();//设置串口号,ReadTenCom()是读取串口号的方法,返回的是string类型
                        serialPort1.ReceivedBytesThreshold = 1;//设置能引发serialport的DataReceived事件所需要的字节个数
                        serialPort1.BaudRate = 19200;//设置波特率
                        serialPort1.DataBits = 8;
                        serialPort1.Parity = System.IO.Ports.Parity.None;//设置串口的奇偶校验为无奇偶校验
                        serialPort1.StopBits = System.IO.Ports.StopBits.One;//设置停止位为1
                        serialPort1.Open();//打开端口
                        byte[] outputdat = new byte[1];
                        outputdat[0] = 0x55;
                        serialPort1.Write(outputdat, 0, 1);//发送指令0x55
                        m_SendInfo = 0x55;//变量m_SendInfo存储当前发送的串口指令
                        gtb_Status.Text = "已连接";
                        tslbl_Disconn.Enabled = true;//断开
                        tslbl_Connection.Enabled = false;//连接
    更多相关内容
  • 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);
                }
            }
       }

    展开全文
  • Serialport串口控件实例

    2008-08-21 14:21:49
    一个基于Serialport控件开发串口通信的程序,对于初学者非常有用!
  • C# 使用SerialPort控件制作的串口助手,请忽略我的名字,源代码全部开放,实现功能有收发数据,自动收发,十六进制收发和收发文件等。大家可以下载可以修改,完全开源。好东西值得这么多分。
  • c#使用SerialPort串口控件

    千次阅读 2018-05-24 11:37:00
    foreach (var p in SerialPort.GetPortNames()) //获取电脑上所有的串口 { cbPorts.Items.Add(p); } cbPorts.SelectedIndex = 0; } private void button2_Click(object sender, EventArgs e) { sport.Port...

    1:工具箱中拖SerialPort到主界面 2:设置好相关串口的配置(串口的接收事件为OnDataReceived) 3:代码如下:

    public Form1()
            {
                InitializeComponent();
              
                foreach (var p in SerialPort.GetPortNames()) //获取电脑上所有的串口
                {
                    cbPorts.Items.Add(p);
                }
                cbPorts.SelectedIndex = 0;
            }
    private void button2_Click(object sender, EventArgs e)
            {
                sport.PortName = cbPorts.SelectedItem.ToString(); //将要使用的串口
                sport.Open();
            }
    private void OnDataReceived(object sender, SerialDataReceivedEventArgs e) 
            {
                lblID.Text = sport.BaseStream.ReadByte().ToString();
            }
            private static int i = 0;
            private void timer1_Tick(object sender, EventArgs e)
            {
                if(sport.IsOpen)
                {
                    sport.Write(i.ToString());
                    i++;
                }
            }
    

    本来的想法是用定时器1S发一次数据,串口2.3脚相连,这样就会自己接收到数据,结果出现如下异常:

    “System.InvalidOperationException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生 
    
    其他信息: 线程间操作无效: 从不是创建控件“lblID”的线程访问它。
    

    根据 https://www.cnblogs.com/BookCode/p/5583853.html 上所说:从 SerialPort 对象接收数据时,将在辅助线程上引发 DataReceived 事件。由于此事件在辅助线程而非主线程上引发,因此尝试修改主线程中的一些元素(如 UI 元素)时会引发线程异常。如果有必要修改主 Form 或 Control 中的元素,必须使用 Invoke 回发更改请求,这将在正确的线程上执行.进而要想将辅助线程中所读到的数据显示到主线程的Form控件上时,只有通过Invoke方法来实现:

    private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                this.Invoke(new Action(() =>
                {
                    
                    Byte[] buf = new Byte[1024];
                    lblloraid.Text = sport.BytesToRead.ToString();
                    int i = sport.BaseStream.Read(buf,0,sport.BytesToRead); //.ReadByte().ToString();
                    lblID.Text = Encoding.ASCII.GetString(buf, 0, i);
                }));            
            }
    

    这样虽然程序没有问题了,但我通过两个USB转串口互相通信,一个每次发26个字母,正常情况下另一个应该每次接收到26个,但实验结果并不是这样的,说明程序还是有问题。

    转载于:https://my.oschina.net/u/2963604/blog/1817894

    展开全文
  • 基于C#编程的串口通讯例程,使用自带控件serialPort完成数据发送与接受,ini文件进行数据参数保存与加载。
  • 个人水平有限不知道为什么只是感觉上是C#serialPort控件打开再关闭之后没有彻底释放资源还有占用,我能想到的关闭方法只有下面这些了 试过关闭代码如下: serialPort1n.Close(); serialPort1n.Dispose(); ...
  • 好久没写东西了,工作时没什么事干,也就看看书;以前就对串口通信感点兴趣,serialport控件也看了几...注:我这里写的是SerialPort串口控件使用之字符的接收,用到的工具为VS2010,串口调试助手,VSPD(虚拟串口)6.9,

    好久没写东西了,工作时没什么事干,也就看看书;以前就对串口通信感点兴趣,serialport控件也看了几天,想做一个类似串口助手的东西,由于是刚看的C#,很多东西都不知道,网上的SerialPort控件要不讲得不清楚,要不代码错误;所以把自己看到的学到的供大家分享!

    注:我这里写的是SerialPort串口控件使用之字符的接收,的工具为VS2010,串口调试助手,VSPD(虚拟串口)6.9,。很多东西我也不知道为什么要这样做,大家相互学习和探讨!

    好了,下面开始吧!

    第一步:新建C#窗体项目,拖一个textbox控件,一个SerialPort控件,两个按钮,命名如下:

         控件名                           Name

    1  编辑框                     textBox1

    2  SerialPort              mySerialPort

    3   按钮                        button1 button2

    如下图:



    第二步:添加事件:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Ports;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                
            }
            
    
            public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
    
                string s = "";
                int count = mySerialPort.BytesToRead;
    
                byte[] data = new byte[count];
                mySerialPort.Read(data, 0, count);
    
                foreach (byte item in data)
                {
                    s += Convert.ToChar(item);
                }
    
                if (this.InvokeRequired)
                {
                    this.Invoke(new MethodInvoker(delegate { this.textBox1.Text = s; }));
                }
                else
                {
                    this.textBox1.Text = s;
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (!mySerialPort.IsOpen)
                {
                    mySerialPort.Open();//打开端口,进行监控
    
                   
                }
    
                mySerialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                if (mySerialPort.IsOpen)
                    mySerialPort.Close();
            }
        }
    }
    
    注意在namespace处添加  using System.IO.Ports;

    第三步:编译运行。

    第四部通信。

    打开VSPD,串口助手,写好的程序。

    设置VSPD如图:


    串口助手设置如图:选择COM2;


    打开写好的程序,点击打开串口,这时看到VSPD两个串口均为打开状态,在串口助手发送字符编辑框处输入 ss,如上图。

    接着可在程序窗口中得到发送过来的 ss。如下图


    到这来完成!


    展开全文
  • 需要使用mscomm32这控件但是,系统中注册通过的低版本vs也能认出控件。但是2022不行一直提示自动注册失败。论坛上讲的如何注册包括64位系统的都做过了都显示成功的就是这个不行急等。mfc环境
  • 解决win10系统中VS2010没有串口通信控件 串口通信控件是VC6.0工具箱里面的控件,VC6.0以上的VS版本没有该控件,此时需要单独下载该控件 链接:link 提取码:v1pu 将下载到的 MSCOMM32.OCX 文件,放到 C:\Windows...
  • 前述: 在一个项目中,需要从串口通信的磁卡读卡器中读取刷卡的卡号,以便后续的业务操作。...本人使用了.net中自带的SerialPort串口监控控件来读取磁卡读卡器所读取的卡号,其解决方法如下: SerialPort简述:
  • C#工程文件serialport串口接收助手ADC图像采集chart控件显示,代码采用C#窗体控件其中包含了serialport控件和chart控件,可以用于单片机/stm32的ADC电压电流采集
  • 使用serialPort控件进行串口通信

    千次阅读 2018-11-13 19:10:23
    serialPort.PortName = 串口名; 2、打开串口 serialPort.Open(); 3、关闭串口 serialPort.Close(); 4、发送信息 serialPort.Write(信息); 5、接收信息并显示出来 int count = serialPort.BytesToRead; //...
  • 做一个小软件,使用电脑的3个USB分别联接3台串口设备。现在出现了一个很[color=#FF0000]诡异[/color]得现象!!! 当我拔掉串口2的设备,串口1端口无法接收设备的返回数据, 也就是 SerialPort1.DataReceived ...
  • 关于在关闭SerialPort控件打开的串口引发程序卡死的问题,是因为在DataReceived事件中调用了Invoke方法。如下: this.Invoke((EventHandler)(delegate { })); 可以更改为以下的方法,即可解决以上的问题,同时会...
  • CSerialPort类 一个可以代替串口控件的类 非常好用
  • 开发环境VS2010,C#编写的串口通信程序,利用了serialPort组件,测试过可以使用。
  • C#.NET SerialPort控件实现
  • <template> <div id="wrapper"> <...串口信息查询</span> <div v-for="(item,index) in serialportLists" :key="index" > <table border="1"> <tr> .
  • C# SerialPort串口接收 丢数据 数据不完整的解决方法
  • serialport:PHP串行端口

    2021-01-28 16:56:39
    串行端口 ...受启发,我对其进行了简化,并包含了composer.json以通过composer安装...$ serialPort = new SerialPort ( new SeparatorParser (), new TTYConfigure ()); $ serialPort -> open ( "/dev/ttyACM0" ); while
  • 各位大神,小弟近日在以前编写好的winform做上位机,添加serialport控件接收数据 ,由于小弟是新手,从网上查到一些serialport的代码,能在新建的winform项目上接收到下位机发送过来的数据,下位机串口是没有问题的...
  • 个人水平有限不知道为什么只是感觉上是C#serialPort控件打开再关闭之后没有彻底释放资源还有占用,我能想到的关闭方法只有下面这些了 试过关闭代码如下: serialPort1n.Close(); serialPort1n.Dispose(); GC....
  • 主要实现功能是将串口发送过来的数据按波形显示 注:本例是以串口调试助手和虚拟串口VSPD软件模拟串口发送数据的 我所用的串口调试助手每次...详细说明见同名CSDN博客“C#用serialPort和chart控件实现简单波形绘制”
  • 在vb.net中操作串口,可以使用SerialPort组件,也可以直接使用System.IO.Ports. SerialPort类。 SerialPort组件在工具箱视图的组件一栏中,如图: 直接双击就可以加入使用。 SerialPort组件(SerialPort类)常见的...
  • 第一次接触SerialPort串口控件,其接受数据是怎么操作的 ,看见网上说 “DataReceived事件在辅线程被引发” 是什么意思,需要进行多线程吗,有简单的实例给个参考下更好!
  • electron-vue+serialport实现串口通信

    千次阅读 2022-02-11 09:57:21
    electron-vue+serialport实现串口通信
  • 使用serialport类通过com串口读取ic卡数据
  • C# SerialPort配置和属性了解

    千次阅读 2021-10-22 18:08:52
    SerilPort是串口进行数据通信的一个控件,今天博主教大家如何进行配置SerialPort对端进行通信。 虽然有点简单,大家有兴趣可以耐心看完,我会教大家用VS2019的快捷方法和使用代码的方法进行配置,大家不喜勿喷哈哈哈...
  • Qt 4.9 使用串口serialport 通过下载qtserialport源码包,自己进行编译 1、在本机创建一个目录用于拉去源码后保存 拉取源码 git clone git://code.qt.io/qt/qtserialport.git 2、进入qtserialport拉取 checkout ...

空空如也

空空如也

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

serialport串口控件