精华内容
下载资源
问答
  • c#串口上位机
    千次阅读
    2017-12-08 17:06:16

    using System;

    using System.Collections.Generic;

    using System.ComponentModel;

    using System.Data;

    using System.Drawing;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using System.Windows.Forms;

    using System.IO;

    using System.IO.Ports;

     

     

    namespace WindowsFormsApplication3

    {

        publicpartial class Form1 : Form

        {

            publicForm1()

            {

               InitializeComponent();

               this.Init(); //打开系统执行初始化程序

            }

     

            ///<summary>

            /// 界面初始化

            ///</summary>

            publicvoid Init()

            {

               btnSend.Enabled = false;//失能发送按钮

               cbCn.Items.AddRange(SerialPort.GetPortNames());   //获取串口号

                if(cbCn.Items.Count > 0) cbCn.SelectedIndex = 0; //设置默认串口号

               cbCb.SelectedIndex = 5;//设置默认波特率115200

               OC.ForeColor = Color.Red;  //串口状态默认关闭颜色红色

            }

     

            ///<summary>

            /// 打开/关闭串口

            ///</summary>

            ///<param name="sender"></param>

            ///<param name="e"></param>

            privatevoid btnOpen_Click(object sender, EventArgs e)

            {

               if(cbCn.Items.Count <= 0)

                {

                   OC.Text = "没发现串口";

                   return;

                }

               if(!serialPort1.IsOpen)//如果串口没有打开

                {

                   //设置串口参数

                   serialPort1.PortName = cbCn.SelectedItem.ToString();//设置端口号

                   serialPort1.BaudRate = Convert.ToInt32(cbCb.SelectedItem.ToString());//设置波特率

                   try

                    {

                       serialPort1.Open();//打开串口

                       btnSend.Enabled = true;//使能发送按钮

                   }

                   catch(Exception ex)

                   {

                       MessageBox.Show(ex.Message, "错误");

                    }

                   btnOpen.Text = "关闭串口";

                   OC.Text = "串口已打开";

                   OC.ForeColor = Color.Green;

                   lblms.Text = "Name:" + serialPort1.PortName + "   Baud:" + serialPort1.BaudRate;

                }

                else//如果串口已打开

                {

                   try

                   {

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

                       btnSend.Enabled = false;//失能发送按键

                   }

                   catch(Exception ex)

                   {

                        MessageBox.Show(ex.Message, "错误");

                   }

                   btnOpen.Text = "打开串口";

                   OC.Text = "串口已关闭";

                   OC.ForeColor = Color.Red;

                   lblms.Text = null;

                }

                //串口一旦打开不可再配置

               cbCb.Enabled = !serialPort1.IsOpen;

               cbCn.Enabled = !serialPort1.IsOpen;

            }

     

            ///<summary>

            /// 清空接收区

            ///</summary>

            ///<param name="sender"></param>

            ///<param name="e"></param>

            privatevoid btnClRev_Click(object sender, EventArgs e)

            {

               txtShow.Clear();

               txtData1.Clear();

               txtData2.Clear();

               txtData3.Clear();

               txtData4.Clear();

               txtData5.Clear();

               txtData6.Clear();

            }

            ///<summary>

            /// 清空发送区

            ///</summary>

            ///<param name="sender"></param>

            ///<param name="e"></param>

            privatevoid btnClSend_Click(object sender, EventArgs e)

            {

               txtSend.Clear();

            }

     

           /*******************数据发送部分**********************/

            ///<summary>

            ///发送数据

            ///</summary>

            ///<param name="sender"></param>

            ///<param name="e"></param>

            shortSdat1,Sdat2;

            privatevoid btnSend_Click(object sender, EventArgs e)

            {

              byte[] sendData = null;// 定义一个字节数组

              byte[] buffer1 = new byte[6];

              

               try

                {

                    Sdat1 =(short)Convert.ToInt16(txtSdat1.Text);//读数据

                   Sdat2 = (short)Convert.ToInt16(txtSdat2.Text);//读数据

                }

               catch (Exception ex)

                {

                   MessageBox.Show(ex.Message, "错误");

                }

                //数据打包

               buffer1[0] = 0xFA;

               buffer1[1] = 0xFA;

               buffer1[2] = (byte)((Sdat1 >> 8) & 0xFF);

               buffer1[3] = (byte)(Sdat1 & 0xFF);

               buffer1[4] = (byte)((Sdat2 >> 8) & 0xFF);

                buffer1[5] = (byte)(Sdat2 & 0xFF);

     

               txtSend.Text = buffer1.Length.ToString();

     

               sendData = Encoding.ASCII.GetBytes(txtSend.Text.Trim());//ASCII发送//trim()数据两端不能是空格

     

                if(serialPort1.IsOpen)//如果串口打开

                {

                   try

                   {

                       /*******************串口调用接口******************/

                       //serialPort1.Write(sendData, 0, sendData.Length);//发送数据

                       serialPort1.Write(buffer1, 0, buffer1.Length);//发送数据

                   }

                   catch(Exception ex)

                   {

                       MessageBox.Show(ex.Message, "错误");

                   }

                }

                else

                {

                   MessageBox.Show("串口未打开", "错误");

                }

            }

     

            ///<summary>

           ///Hex-->byte

            ///</summary>

            ///<param name="s"></param>

            ///<returns></returns>

            privatebyte[] HexStrTobyte(string s)

            {

                s =s.Replace("   ", "");

               byte[] buffer = new byte[s.Length / 2];

                for(int i = 0; i < s.Length; i += 2)

                   buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);

               return buffer;

            }

     

           /*******************数据接收部分**********************/

            ///<summary>

            /// 数据接收

            ///</summary>

            ///<param name="sender"></param>

            ///<param name="e"></param>

            privateList<byte> buffer = new List<byte>(4096);

            shortDat1, Dat2, Dat3,Dat4,Dat5,Dat6;

            privatevoid Form1_Load(object sender, EventArgs e)

            {

     

            }

     

            privatevoid DataRec(object sender, SerialDataReceivedEventArgs e)

            {

                intn = serialPort1.BytesToRead; //读数据位

               byte[] RecData = new byte[n];//新建字符串数组从串口读入字节

               /***************串口调用接口************************/

               serialPort1.Read(RecData, 0, n);//读取数据

     

               buffer.AddRange(RecData);

              

                //数据解包

                while(buffer.Count >= 14 &&buffer[0] == 0xAA && buffer[1] == 0xAA)

                {

                   Dat1 = (short)((buffer[2] << 8) | (buffer[3]));

                   Dat2 = (short)((buffer[4] << 8) | (buffer[5]));

                   Dat3 = (short)((buffer[6] << 8) | (buffer[7]));

                   Dat4 = (short)((buffer[8] << 8) | (buffer[9]));

                   Dat5 = (short)((buffer[10] << 8) | (buffer[11]));

                   Dat6 = (short)((buffer[12] << 8) | (buffer[13]));

                   buffer.RemoveRange(0, 14);

                }

     

                this.Invoke((EventHandler)(delegate//invoke一个匿名委托跨线程访问ui

                {

                   txtData1.Text = Dat1.ToString();

                   txtData2.Text = Dat2.ToString();

                   txtData3.Text = Dat3.ToString();

                   txtData4.Text = Dat4.ToString();

                   txtData5.Text = Dat5.ToString();

                   txtData6.Text = Dat6.ToString();

     

                   txtShow.AppendText(byteToHexStr(RecData).ToString().ToUpper());//接收到的数据以hex格式显示

                   //txtShow.AppendText(Encoding.ASCII.GetString(RecData));//接收数据以ASCII格式显示

                }));

            }

     

            ///<summary>

            ///byte-->Hex

            ///</summary>

            ///<param name="bytes"></param>

            ///<returns></returns>

            publicstatic string byteToHexStr(byte[] bytes)

            {

               string returnStr = "";

                if(bytes != null)

                {

                   for (int i = 0; i < bytes.Length; i++)

                   {

                        returnStr +=bytes[i].ToString("X2");//X2 十六进制2

                   }

                }

               return returnStr;

            }

        }

    }

     


    更多相关内容
  • C#串口上位机

    2019-03-30 10:06:54
    压缩包包含VS2012创建的c#串口窗体上位机,可实现串口扫面检测,显示收发数据,供大家学习参考。
  • 串口测试:向串口发送数据,同时能接受上位机传回数据。
  • 序言 必要准备 主界面 推荐代码 链接 序言完全就是个人回忆录,不想看可以跳过 最近想发一个之前自己做的一个简单的串口上位机,当然,工作时写的要比这个复杂了。除了C#可以写上位机,我同事也有用QT的,具体的哪个...


    序言完全就是个人回忆录,不想看可以跳过
    最近想发一个之前自己做的一个简单的串口上位机,当然,工作时写的要比这个复杂了。除了C#可以写上位机,我同事也有用QT的,具体的哪个好不做评判。第一次接触C#还是从我实习的时候才认知到C#原来这么好用。之前我写上位机写的还都是安卓上位机,主要用于蓝牙或者WiFi的远程调试用(其实最主要的原因是大学时参加省物联网大赛败在没人写安卓上位机上。。。)。

    必要准备

    我用的是微软的Visual Studio,2019版本的。开发语言用的C#。开发的时候有两个版本可以选择,一种是WindowsForm、另外一种是WPF。个人推荐,新手使用WindowsForm版本的,因为这个上手容易。熟悉以后就选择WPF版本的开发,性能更高且自定义更强。
    本次介绍的就是我最开始写上位机的时候接触的WindowsForm版本的。

    主界面

    先给大家展示一下程序的主界面,由成果展示功能。还是中规中矩的一个发送框跟一个接收框。从这个界面就可以知道我又多加了一些偷懒的方法。
    1、有的时候我发送了什么东西我不需要显示,我只要显示我接收到的东西的就OK,于是这就有了左上角的第一个选择框
    2、有的时候我对某些帧的数据是需要知道接收或者发送的时间的,这时候就有左上角第二个选择框
    3、常常在调试单片机的时候发送或者接收的它不是字符串,而是HEX格式的文件,这时候就有第三个选择框了(这个框选择以后会自动将发送框里的字符串改为hex格式哦);
    4、在调试某些模块的时候常常需要在字符串后加 \r\n,每次都要输入一下,这样非常的不方便,于是乎,我决定再添加上第四个选择框来干这件事。
    5、虽然基本功能都有了,但每次我从底下的发送框输入字符串以后,还需要我再把我的手从键盘上拿开,移动鼠标去点击发送数据按钮,这样非常的麻烦。于是乎,第五个选择框它来了,把它勾选上以后在发送框直接点击回车即可完成数据发送操作(写字符串时的回车键还是保留了的只不过是ctrl+回车)。
    6、万一,我接收到一些重要的内容需要保存起来,这时候点击导出数据按钮即可将接收到的文本保存为txt文件(可以自定义文本名称和路径哦!),当我第二次想保存的时候选择的是同一个文件,那么它不会删掉之前的内容,会在文件后进行追加保存。
    ykun1
    7、除了将接收到的文本进行保存这一功能,同时也借鉴了一下其他的串口上位机对要发送的数据进行保存,就比如之前我在调试一个4G模块的时候,里面的初始化指令还是挺多了,然后外加一些打电话或者发短信的指令又或者进行TCP通信时的指令。。。。啧啧啧,这些我总不能全手敲输入吧,于是我又添加上了XML文件读写。没有xml文件时会在根目录下自动创建并初始化一个xml文件,等待程序关闭时则会将发送文本框的内容进行保存操作,下次打开则会进行读取操作。
    ykun2

    推荐代码

    其中我比较满意的一个功能就是,自动缩放功能;这里给大家分享一下,采用的递归方法将每个控件下的子控件也进行比例缩放。其中Form1_Load在窗体打开的时候调用,Form1_Resize在窗体大小改变时调用。

    		float X;
            float Y;
            private void Form1_Load(object sender, EventArgs e)//窗体创建时初始化
            {
                X = this.Width;
                Y = this.Height;
                setTag(this);
            }
    
            private void setTag(Control cons)
            {
                foreach (Control con in cons.Controls)
                {
                    con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size;
                    if (con.Controls.Count > 0) setTag(con);   //如果此控件存在子控件,则递归调用
                }
            }
    
            private void Form1_Resize(object sender, EventArgs e)//比例缩放
            {
                float newx = (this.Width) / X; 
                float newy = (this.Height) / Y; 
                setControls(newx, newy, this, true); 
            }
            private void setControls(float newx, float newy, Control cons, bool se)
            {
                foreach (Control con in cons.Controls)
                {
                    string[] myTag = con.Tag.ToString().Split(':');     //将con的宽、高、左边距、顶边距离及字体大小通过字符“:”分割成数组
                    float a = Convert.ToSingle(myTag[0]) * newx;    //根据窗口的缩放比例确定控件相应的值,宽度
                    con.Width = (int)a;
                    a = Convert.ToSingle(myTag[1]) * newy;    //高度
                    con.Height = (int)a;
                    a = Convert.ToSingle(myTag[2]) * newx;    //左边距
                    con.Left = (int)a;
                    a = Convert.ToSingle(myTag[3]) * newy;    //顶边距离
                    con.Top = (int)a;
                    Single currentSize = Convert.ToSingle(myTag[4]) * newy;     //字体大小
                    con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
                    if (con.Controls.Count > 0 && se) setControls(newx, newy, con, true);     //如果此控件存在子控件,则将相应子控件执行一次setControls函数
                }
            }
    

    链接

    需要就拿去,最后附上工程链接

    展开全文
  • c#串口 上位机入门

    2015-10-24 20:19:57
    c#入门 简单易懂 适合上位机入门 本人移植可用
  • 串口通讯,上位机,可以与嵌入式通讯,基于C#平台开发
  • 基于C#串口调试助手,调试通过,应用于本人设计的一个上位机程序的一部分功能中。
  • C#串口上位机Form版本

    2022-04-05 23:22:09
    串口上位机Form版本.zip,.vs,WindowsFormsApp1,v16,.suo,WindowsFormsApp1.sln,WindowsFormsApp1,WinScale.cs,windowScale,MainWindow.resx,bin,Release,Debug,XmlDatal.xml,WindowsFormsApp1.pdb,WindowsFormsApp1....
  • C#串口上位机源码.zip

    2022-05-17 11:05:39
    C#上位机串口助手工具源码 串口助手可以说是必不可少的一个工具,一个好的串口助手可以大大方便我们的研发调试。网上串口助手很多,如果能够根据自己需要做一个合适的串口助手,那么既能方便自己,也能掌握上位机的...
  • C#上位机串口助手源码
  • C#串口上位机界面。SQL存储串口数据,没有作图操作,但是有数据显示VS2010编写,我现在用的VS2013。其他存储方式移步我的其他资源,或许有你需要的
  • 这个应该是杜洋老师跟他小伙伴一起做的最后那个C#上位机程序。有需要杜洋老师C#串口开发视频的可以私聊我。或者回复本资源。我也是花钱买了份,不方便打破别人饭碗,PS:我不收money,但是不方便把资源直接放网上!
  • C#串口上位机的开发,基于杜洋的视频课程上位机开发1. 知识储备2. 串口助手的开发 上位机开发 此教程参考 杜洋的C#教程 1. 知识储备 1.1 下拉菜单的设置 DropDown:可以更改 DropDownlist:不可更改 PS:串口需要在...

    C#串口上位机的开发,基于杜洋的视频课程

    上位机开发

    此教程参考 杜洋的C#教程

    串口助手软件的开发共使用了如下的几个开发工具

    a. 按钮 :button
    b. 选择的点:radioBox
    C.TXT 文本
    D.下拉框
    E. TextBOX,存放一些字符
    F. 串口接口:serialPort

    1. 知识储备

    1.1 下拉菜单的设置

    在这里插入图片描述
    DropDown:可以更改
    DropDownlist:不可更改
    PS:串口需要在打开端口前可以手动更改,打开端口后无法更改。

    在这里插入图片描述
    点击Ltems,可以显示如图的对话框,放一些需要提前准备的数据。

    1.2 TextBox的滚动条设置
    在这里插入图片描述

    在Scrollbars 这个选项中选择滚动条的方向,
    None :没有滚动条
    Horizontal:只有横向的滚动条
    Vertical:只有竖向的滚动条
    Both:横向和竖向两个滚动条都有。

    2. 串口助手的开发

    2.1 RichTextBox的使用

    //添加数据
    richTextBox2.Text = "你好";
    richTextBox2.AppendText("Richtextbox 添加新行\r\n");
    
    展开全文
  • C#串口上位机界面。带缓冲区的,C#编写,这个功能简单,可以在此基础上做别的开发
  • 有需要其他的保存数据方式的请移步我的其他资源。txt,access数据库都有,之前再做项目时候收集的一些C#串口项目代码,还是具有借鉴意义的。
  • C#串口通信上位机软件源代码,使用C#编写,可实现与下位机(单片机)之间的串口通信,可设置串口,波特率等基本参数,欢迎需要的同学下载使用。
  • C#上位机串口通信软件,实现串口收发,数据保存到文件
  • C#串口上位机 ,access文件保存通道数据,其他的注意见标题,database在\bin\release\x86\...文件夹里面,可以随时保存为EXCEL文件。喜欢txt保存的移步我的其他资源,界面不一样,但是功能是一致的。
  • C#串口上位机编程终端显示STM32_3144霍尔传感器+DHT11温湿度传感器实时传感器感知状态、通过上位机、下位机的编程实现传感器数据PC端实时展示和处理 含下位机源代码和上位机源代码
  • 基于visual studio C#串口上位机程序,可以以此为模板编写单片机串口上位机程序
  • 它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。通过串行数据(SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别,而且...
  • 记事本打开记录数据文件夹的内容,C#编写的串口上位机,有点简陋。有需要的小伙伴可以直接下载利用虚拟串口调试。...我这还有两三个存储于轻量级数据库的C#串口开发项目。有需要借鉴的移步我的个人中心。
  • 采用C#开发上位机非常方便,具体步骤如下: 1.绘制一个上位机的界面,如下图所示: 不要忘记还有下面的串口模块serialPort1 2.初始化部分: 波特率编辑框中加入需要的波特率 实现COM口选择栏里显示可以选择的串口 ...

    采用C#开发上位机非常方便,具体步骤如下:
    1.绘制一个上位机的界面,如下图所示:

    不要忘记还有下面的串口模块serialPort1
    在这里插入图片描述

    2.初始化部分:

    波特率编辑框中加入需要的波特率
    在这里插入图片描述

    实现COM口选择栏里显示可以选择的串口
    下面展示一些 内联代码片

     private void Form1_Load(object sender, EventArgs e)
            {
                for (int i = 1; i < 20; i++)
                {
                    serialPort1.PortName = "COM" + i.ToString();             //端口号
                    serialPort1.BaudRate = 9600;                             //波特率
                    try
                    {
                        serialPort1.Open();
                        ComBox.Items.Add("COM" + i.ToString());
                        serialPort1.Close();
                    }
                    catch
                    {
    
                    }
                }
                //ComBox.SelectedIndex = 1;       //预选串口
                BaudBox.Text = "9600";
            }
    

    3.串口打开:

    下面展示一些 内联代码片

     private void OpenBtn_Click(object sender, EventArgs e)
            {
                if (OpenBtn.Text == "打开串口")
                {
                    try
                    {
                        serialPort1.PortName = ComBox.Text;                                              //端口号
                        serialPort1.BaudRate = Convert.ToInt32(BaudBox.Text);                            //波特率
                        serialPort1.Open();                                                              //打开串口
                        SendBtn.Enabled = true;
                        OpenBtn.Text = "关闭串口";
                    }
                    catch
                    {
                        MessageBox.Show("端口错误", "错误");
                    }
                }
                else
                {
                    try
                    {
                        serialPort1.Close();                                                               //打开串口
                        SendBtn.Enabled = false;
                        OpenBtn.Text = "打开串口";
                    }
                    catch
                    {
                        MessageBox.Show("端口错误", "错误");
                    }
                }
            }
    

    4.串口发送

    下面展示一些 内联代码片

            private void SendBtn_Click(object sender, EventArgs e)
            {
                if (SendTextBox.Text != "")
                {
                    try
                    {
                        serialPort1.Write(SendTextBox.Text);
                    }
                    catch
                    {
                        MessageBox.Show("串口数据写入错误", "错误");
                    }
                }
            }
    

    5.串口接收:

    点击serialPort1,右边小闪电,DataReceived事件,新建数据接收事件
    在这里插入图片描述
    代码一开始一定要加入这句话,不然无法接收到数据!

    CheckForIllegalCrossThreadCalls = false;

    下面展示一些 内联代码片

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                CheckForIllegalCrossThreadCalls = false;
            }
    

    编写接收数据代码:

    下面展示一些 内联代码片

            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                //以下是直接字符串显示
                //RecTextBox.AppendText(serialPort1.ReadExisting()+"\r\n");         //字符串显示
    
                //以下是16进制显示
                byte[] data = new byte[serialPort1.BytesToRead];
                serialPort1.Read(data, 0, data.Length);
                foreach (byte Member in data)                                                   //遍历用法
                {
                    string str = Convert.ToString(Member, 16).ToUpper();
                    RecTextBox.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");
                }        
            }
    

    至此就完成了简单的串口程序

    展开全文
  • 通过C#串口上位机编程对STM32控制直流有刷电机PID速度单闭环运行过程深度解析(位置式PID) PID上位机算法仿真 一、实现功能 通过上位机观察STM32下位机运行过程数据流、运行状况检测,通过上位机实现PID调参、目标...
  • C#上位机串口工具)

    千次阅读 2022-03-16 13:35:37
    //确保 “关闭串口”按键文本属性为 “关闭串口” //必须手动添加处理串口数据接收 //serialPort1.DataReceived += new EventHandler(this.Port_DataReceived);//SerialDataReceived } /*用户自定义更新可用串口...
  • C#实现串口通信的上位机开发

    千次阅读 2022-05-28 22:01:46
    目录上位机串口通信C#串口通信:SerialPort类列出所有的串口C#串口通信:读写数据写数据:读数据:DataReceived事件:数据发送不同步问题:界面设计波形显示(chart控件的使用)设计思路定时器介绍:波形显示 上位机...

空空如也

空空如也

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

c#串口上位机

友情链接: myproj.zip