精华内容
下载资源
问答
  • 必须要两个软件同时对方才有效,软件自带帧头 长度
  • 在做项目时,发现C#串口经常会发生丢帧的情况,在发送/接收大量数据时,这种状况尤为明显。因此,在对比了各种缓存处理办法的基础上,做了这个小程序。经过实测,完全可以应对48byte/5ms的数据量。这个小程序只做了...
  • 这里是c#串口自动接收处理后实时刷新处理,实时显示。可以直接new了,直接用看效果。
  • c#串口接收数据之后同时发送另外两个虚拟串口,虚拟串口供另外两个程序使用,解决一个串口数据库多个程序同时读取问题
  • 使用了C#中的SerialPort控件来接收串口发来的数据。
  • C#串口接收数据保存到数据库
  • 最近笔者使用C#编程时,经常用到串口通信功能。所以总结记录一下串口通信功能的使用方法。 串口组件 在工具箱中找到SerialPort组件,将其添加到设计中。 串口端口和波特率设置 属性名称 含义 (Name) 指示...

    最近笔者使用C#编程时,经常用到串口通信功能。所以总结记录一下串口通信功能的使用方法。

    串口组件

    在工具箱中找到SerialPort组件,将其添加到设计中。
    在这里插入图片描述

    串口端口和波特率设置

    在这里插入图片描述

    属性名称含义
    (Name)指示代码中用来标识该对象的名称
    BaudRate此串行端口上要使用的波特率
    DataBits没发送/接收一个字节的数据位数目
    DiscardNull在添加到序列缓冲区前是否丢弃端口上接收的空字节
    DtrEnable在通信过程中是否启用数据终端就绪(DTR)行
    GenerateMember指示是否将为此组件生成成员变量
    Handshake用于数据交换中流控制的握手协议
    Modifiers指示对象的可见性级别
    Parity用于对每个接收字节进行奇偶校验检查并且标记每个发送的字节的方案
    ParityPeplace用来替换接收的有奇偶校验错误的字节的字节
    PortName要打开的通信端口的名称
    ReadBufferSize读取缓冲区的大小(以字节为单位)
    ReadTimeout读取超时(以毫秒为单位)
    ReceivedBytesThreshold触发Read事件前要求可用的字节数
    RtsEnable在通信过程中是否启用请求发送(RTS)行
    StopBits每发送/接收一个字节的停止位数目
    WriteBufferSize写入缓冲区的大小(以字节为单位)
    WriteTimerout写入超时(以毫秒为单位)

    上表是SerialPort组件的属性及其对应的含义,在实际编程中,鼠标选中某个属性时也会显示出对应的含义。平时使用时,我们大多只需修改PortName、BaudRate、DataBits 、StopBits、Parity、ReadBufferSize、WriteBufferSize这个几个属性。其中DataBits 、StopBits、Parity这三个属性在大多数串口通信中,都默认为8、One、None。在STM32F1单片机中关于串口的配置有如下语句。
    在这里插入图片描述
    在.cs文件中调用如下语句进行SerialPort组件的初始化。

    serialPort1.PortName = comboBox1.Text;//设置端口名
    serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);//设置波特率
    serialPort1.Open();//打开串口
    

    其中comboBox1、comboBox2为设计中的两个控件。
    在这里插入图片描述
    调用以下函数关闭串口。

    serialPort1.Close();//关闭串口
    

    在定时器中调用以下函数用以更新可用端口。

    private void Updata_Serialport_Name(ComboBox MycomboBox)
    {
    	string[] ArryPort = SerialPort.GetPortNames();
    	MycomboBox.Items.Clear();
    	for (int i = 0; i < ArryPort.Length; i++)
    	{
    		MycomboBox.Items.Add(ArryPort[i]); 
    	}
    }
    

    串口接收在这里插入图片描述

    事件名称含义
    DataReceived每次从SerialPort接收数据时引发
    ErrorReceived每次从SerialPort接收错误时引发
    PinChanged每次SerialPort的pin更改时引发

    上表SerialPort组件的事件及其对应的含义。我们将主要使用DataReceived事件。

    在DateRecived事件中引用以下函数,即可完成串口数据的接收与显示。

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        //string str = serialPort1.ReadExisting();//直接以字符串方式读并显示
        //textBox1.AppendText(str);
    	int length = serialPort1.BytesToRead;
    	byte[] data = new byte[length];
    	serialPort1.Read(data, 0, length);
    	//对串口接收数据的处理,可对data进行解析
    	for (int i = 0; i < length; i++)
    	{
    		string str = Convert.ToString(data[i], 16).ToUpper();
    		textBox1.AppendText(str.Length == 1 ? "0" + str + " " : str + " ");//将接收到的数据以十六进制显示到文本框内
    	}
    	//string str = Encoding.UTF8.GetString(data, 0, length);
        //textBox1.AppendText(str);//以字符显示
    }
    

    串口发送

    SerialPort组件的发送方法如下。

    //serialPort1.Write(textBox2.Text.Trim());//以字符串方式发送数据
    int length;
    byte[] data = new byte[length];
    serialPort1.Write(data, 0, length);
    //write()的后两个参数为offset和count,就是发送数据的起始位置和长度
    //比如只发数组的第二个数据,则使用serialPort1.Write(data, 1, 1);
    

    至此,我们就可实现C#串口通信的基本操作。
    关于串口发送数据时,需要从输入控件读取各种数据类型以及不同数据类型的转换请参考笔者之前的博客。

    C#使用TextBox作数据输入方法
    C#串口通信例程

    展开全文
  • 最近在做一个有关高铁模拟仓显示系统的客户端程序,在这个程序中要运用串口serialPort传输数据,因为每次接收数据结束后要更新UI界面,所以就用到了的Invoke,将更新UI的程序代码封装到一个方法中,然后通过Incoke...
  • 这是一个我写的用C#实现串口通信的程序,可以扫描串口,然后选择串口,打开串口之后,如果打开成功,打开串口旁边的方框会变绿,这个可以验证是否成功打开,打开串口旁边还有关闭串口命令。 打开串口之后,在发送的...
  • c# 串口类 纯异步接收

    2018-01-14 17:54:20
    系统自用 ,通过事件触发接收数据,需要的人可以拿走。。
  • C# 串口接收数据

    千次阅读 2019-03-02 15:52:31
    using System; using System.IO.Ports; using System.Text;...using System.Threading;... //定义一个textBox控件用于接收消息并显示 textBox1.AppendText(data + Environment.NewLine); }); } } }  

    using System;
    using System.IO.Ports;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;
    
    namespace Serial
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            //初始化串口信息
            SerialPort sp =new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One);
            private void Form1_Load(object sender, EventArgs e)
            {
                sp.DataReceived += Sp_DataReceived;  //注册接收事件
                sp.ReceivedBytesThreshold = 1;  //接收到一个字节就触发事件
                sp.Encoding = Encoding.Default;  //设置编码,避免中文乱码
                sp.Open();  //打开串口
            }
    
            //接收方法
            private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                //数据接收完整性
                //这里不知道是用延时好,还是循环读取缓冲区好,待验证……
                //Thread.Sleep(50);
                string data = string.Empty;
                while (sp.BytesToRead > 0)
                {
                    data += sp.ReadExisting();  //数据读取,直到读完缓冲区数据
                }
    
                //更新界面内容时UI不会卡
                this.Invoke((EventHandler) delegate
                {
                    //定义一个textBox控件用于接收消息并显示
                    textBox1.AppendText(data + Environment.NewLine);
                });
            }
        }
    }
    

     

    展开全文
  • 对于做嵌入式、单片机的人来说,会开发上位机挺重要的,在开发的过程经常会用到...这个垃圾简单的串口助手可以设置波特率、选择串口号啥的,至于数据位那些就不能改了,采用默认的数值。
  • C#串口数据接收

    2013-12-29 10:28:08
    本源代码是在win7下利用vs2010开发的C#串口接收数据界面,类似于串口助手。上传的是完整的工程文件。
  • C#接收串口数据

    2016-12-29 13:01:51
    基于C# winform,建立监听线程,读取串口数据
  • 文档主要是采用C#编程语言编写的串口通信程序,用于接收数据并生成Excel和数据图片,程序可以正常运行,供大家使用。
  • 上位机的波特率默认是19200,点击“接收数据”时上位机发送一位0xB2数据,单片机接收到0xB2数据后发送18位数据给上位机。
  • C#串口接收字符与数值的切换

    千次阅读 2018-07-03 14:54:55
    串口接收可以是字符串,也可以是数值,可以定义两个单选框来选择显示为字符串或者是数值: private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (!radioButton2.Checked)//判断...
    
    

    串口接收可以是字符串,也可以是数值,可以定义两个单选框来选择显示为字符串或者是数值:

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                if (!radioButton2.Checked)//判断是否选中了字符选项
                {
                    string str = serialPort1.ReadExisting();//保存接收到的字符
                    label3.Text = str;
                    textBox1.AppendText(str);//显示出接收到的字符
                }
                else//数值模式
                {
                    byte data;
                    data = (byte)serialPort1.ReadByte();//读取串口接收的一个字节
                    string str = Convert.ToString(data, 16).ToUpper();//将读取到的字节转换成十六进制字符串显示
                    label3.Text = str;
                    textBox1.AppendText("0x"+(str.Length==1?"0"+str:str)+" ");//在文本框中显示出转换后的字符串
                }
            }

    串口接收功能找开,需要在Form1_Load中加入下面一条语句:

    serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

    如果需要跨进程操作窗体元素,需要别外加入下面一条语句:

    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;


    串口发送的基本代码为:

     string convertdata = data.Substring(2, 2);
                byte[] buffer = new byte[1];
                buffer[0] = Convert.ToByte(convertdata, 16);
                int tmp = buffer[0];
                try
                {
                    if (button1.Text == "打开串口")
                    {
                        serialPort1.Open();
                        button1.Text = "关闭串口";
                        serialPort1.Write(buffer, 0, 1);
                    }
                    else if (button1.Text == "关闭串口")
                    {
                        serialPort1.Close();
                        button1.Text = "打开串口";
                    }
                    
                    label2.Text = buffer[0].ToString("x").ToUpper();
                }
                catch (Exception err)
                {
                    if (serialPort1.IsOpen)
                        serialPort1.Close();
                    MessageBox.Show(err.ToString(), "ERROR");
                }


    展开全文
  • C# VS2013 串口接收事件 通过委托跨线程操作TXTBOX
  • C# 串口通信Winfrom 程序,检测串口 发送和接收消息 亲测可用
  • 在C#中使用串口接收数据时发现,在完整的接收完一次数据后,还会再次进入串口接收事件。 在网上搜索资料发现其他开发者也有遇到该问题: [1] c#串口事件接受一次数据莫名其妙会触发两次 原文链接:...

    在C#中使用串口接收数据时发现,在完整的接收完一次数据后,还会再次进入串口接收事件。

    在网上搜索资料发现其他开发者也有遇到该问题:

    [1]  c#串口事件接受一次数据莫名其妙会触发两次   原文链接:https://www.52pojie.cn/thread-1009851-1-1.html

    [2]Serial Port object's DataReceived Event firing twice   原文链接:https://stackoverflow.com/questions/30296199/serial-port-objects-datareceived-event-firing-twice

    其中[2]提到:串口接收事件触发2次是正常的,第1次是有数据接收,第2次收到的是EOF标志,直接忽略掉第2次就好了。

    在串口接收事件开头加入该部分判断后如下:

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
    	//接收到EOF则直接退出
    	if (e.EventType == System.IO.Ports.SerialData.Eof)
    	{
    		return;	
    	}
    	
    	...
    }

    在串口接收事件的if语句处设置断点进行调试,第一次进入时:e.EventType 为System.IO.Ports.SerialData.Chars,串口缓冲区有3个字节需读取。

    第2次进入时:e.EventType 仍为System.IO.Ports.SerialData.Chars,串口缓冲区有0个字节需读取。

    通过程序调试可知:程序第2次进入串口接收事件并不是因为接收到EOF标志即System.IO.Ports.SerialData.Eof,而是接收到System.IO.Ports.SerialData.Chars,但接收到的字节长度为0。

    因此,通过加入if (e.EventType == System.IO.Ports.SerialData.Eof) return;的方式并不可行。既然可以保证在第1次进串口接收事件就将数据接收完毕,且第2次进入串口接收事件的数据长度为0。则可通过判断接收字节长度为0就直接退出的方式忽略掉第2次进入的串口接收事件。

    添加判断后的代码如下所示:经验证该方法可行,可以忽略掉第2次进入串口接收事件。具体导致进入第2次串口接收事件的原因还不明确,需继续探究!

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
    	//if (e.EventType == System.IO.Ports.SerialData.Eof)
    	//添加此判断在接收完一帧数据后,第2次意外进入时会直接退出
    	if (serialPort1.BytesToRead == 0)
    	{
    		return;	//串口数据长度为0则直接退出
    	}
    
    	//串口接收并不是接收的每个字节都会进入该事件,因此需在该事件中接收完数据
    	Int32 readByteNum = 0;
    
    	/* 等待数据接收完成,即3mS内串口接收到的数据长度不再变化则认为数据已经接收完成 */
    	do
    	{
    		readByteNum = serialPort1.BytesToRead;
    		System.Threading.Thread.Sleep(10);
    	} while (readByteNum < serialPort1.BytesToRead && serialPort1.BytesToRead < 4096);
    
    
    	serialPort1.Read(usartRecvBuffer, 0, readByteNum);  //将串口缓冲区的数据保存至接收缓冲区
    	serialPort1.DiscardInBuffer();                      //清空串口缓冲区的内容
    	
    	//显示串口接收到的数据
    	string str = string.Empty;
    	for (int i = 0; i < readByteNum; i++)
    	{
    		str += (usartRecvBuffer[i].ToString("X02") + ' ');
    	}
    #if USE_DELEGATE
    	this.UpdataControl(tboxRecv, str);
    #else
    	tboxRecv.Text = str;
    #endif
    }

    微软官方对 SerialPort.DataReceived 事件 的使用说明:

     原文链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.io.ports.serialport.datareceived?redirectedfrom=MSDN&view=dotnet-plat-ext-5.0

    展开全文
  • 按照伍兄的博文抄下来的。 博文地址:http://www.cnblogs.com/wuhuacong/archive/2011/07/19/2111055.html#commentform 为了赚点下载分。谢谢!
  • PC C# 串口接收数据

    2018-05-05 16:33:55
    简单的串口数据接收程序,是用C#做的,自己拿来改动下应该能使用在不同的场景下。多多支持
  • VS 软件C#串口接收中断存在BUG,此BUG在VS2019版本已修复,内容如下: 在串口 接收中,如果串口接收到含有0x3f的内容时,会忽视设定的ReceivedBytesThreshold=n; 引发串口事件产生,从而产生BUG;即: 当...
  • c#串口接收数据并且生成EXCEL
  • 1、只要串口接收到的数据流中存在0x1A,就会抛出“索引超出数组界限”。 2、关键代码如下: ``` private void Form1_Load(object sender, EventArgs e) { sp1.Parity = Parity.None; sp1.BaudRate = int...
  • 我是通过绑定串口接收事件实现的,但这样会多次触发串口接收事件,主要卡在数据接收和数据以浮点数显示环节,代码如下: private void sp_DataReceived(object sender,SerialDataReceivedEventArgs e) { if...
  • 使用方法详见我的博客:https://blog.csdn.net/HorseRoll/article/details/83587484
  • C#串口,定时触发

    2018-03-22 11:27:18
    C# 串口+触发时间。 请参考
  • C#实现串口发送接收数据,有简单的版本和基于协议的两种版本,完整项目文件和详细注释

空空如也

空空如也

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

c#串口接收

c# 订阅