精华内容
下载资源
问答
  • 串口调试助手原理
    2021-05-23 17:59:40

    【实例简介】

    一个很好而小巧的串口调试助手,支持常用的300-115200bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符(包括中文),可以任意设定自动发送周期,并能将接收数据保存成文本文件,能发送任意大小的文本文件。

    文件:590m.com/f/25127180-496915614-ea5a34(访问密码:551685)

    以下内容无关:

    -------------------------------------------分割线---------------------------------------------

    基本概念解释:
    CPU :中央处理器,计算机的大脑,内部由数百万至数亿个晶体管组成,是解释和运行最终转换成机器语言(二进制代码)的地方。机器语言是通过CPU内存的寄存器来处理的,不同的类型的CPU,其内部的寄存器的数量、种类以及寄存器存储的数值范围都是不一样的。根据功能的不同,大致分为8类:

    image

    对于程序员来说,CPU是具有各种功能的寄存器的集合体,其中,程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个,其他的寄存器一般有多个。

    需要注意的是CPU的种类是特别重要的参数,CPU只能解释其自身固有的机器语言(指令集),不同的CPU能解释的机器语言的种类也是不同的。如CPU的主要厂商是Intel 和 AMD,前者基于x86指令集,后者基于ARM指令集,其中的区别大家有兴趣可以移驾:https://zhuanlan.zhihu.com/p/95028674

    同时要买CPU可以参照核心/线程,主频,多级缓存等参数来选择。

    内存:计算机的主存储器(主存),负责存储指令和数据,通过控制芯片等与CPU相连,由可读写的元素构成,每个字节都带有一个地址的编号,CPU可以通过该地址读取主存中的指令和数据,也可以写入数据。指令和数据是有时效性的,会随着计算机的关机而自动清除。

    操作系统:程序员并不需要编写操作指令来完成计算机硬件的相关操作,比如键盘鼠标显示器的输入输出等等,也不需要关系内存和IO的不同的构造,因为这些都是通过操作系统的指令来完成的,操作系统克服了除了CPU以外的其他相关硬件的差异,一种操作系统只能支持特定的cpu(比如windows操作系统主流版本支持x86架构的CPU,ARM架构适合嵌入式的liunx操作系统,liunx一般也是用x86),同时操作系统需要为不同的机型分别提供不同的版本。同样的机型,也可以安装不同的操作系统,而应用软件则必须根据不同的操作系统类型来专门开发,因为操作系统的类型不同,应用程序向操作系统传递的指令途径(API)是不同的。以下列举windows对程序员有意义的一些特征:

    32/64位版本操作系统,数字表示处理效率最高的数据大小
    通过API函数集来提供系统调用,API通过各个dll文件来提供,各个API的实体都是C语言编写的函数
    提供采用了图形用户界面的用户界面
    通过WYSIWYG实现打印输出
    提供多任务功能,通过时钟分割技术来实现多任务功能,就是多个应用程序“同时运行”(短时间间隔内多个程序切换运行)
    提供网络功能及数据库功能
    通过即插即用实现设备驱动的自动设定
    运行环境:操作系统 + 硬件。每次下载一个软件的时候,都会让你选择基于什么的运行环境(操作系统+硬件:如基于windows7 版本以上,需要1G以上内存,500M以上的磁盘空间)来下载不同的安装包,代码需要在特定的运行环境中才能执行。

    代码运行的流程:
    C#是一门高级编程语言,作用是编写程序,而程序是指示计算机每一步动作的一组指令,由指令和数据构成(如:WriteLine(“hello”) 程序中,WriteLine 是指令,"hello"是数据),需要转换成能够被CPU可以直接识别并使用的机器语言(二进制码)。程序(代码)是存放在硬盘和磁盘等媒介上的,而被CPU执行的程序需要在内存中存储(从磁盘中复制到内存)。而内存是保存命令和数据的场所,通过地址来标记和指定。

    用编程语言写好的程序,是需要运行环境才能跑起来,运行环境需要操作系统和计算机硬件支持,如果运行环境不同,程序是无法运行的,例如,MacOs,windows,linux系统上的运行的应用程序基本上不能拿在另一个操作系统中运行的。因为不同的操作系统提供出来的API是有差异的,因此,将同样的代码移植到其它的操作系统中,就必须重写应用中利用API的部分,像键盘的输入,鼠标的输入,显示器的输出,文件的输入和输出等外围设备进行输入输出的功能,都是操作系统提供出API供程序员调用。同类型的操作系统下,不管硬件如何,API基本上没有差别。因而,针对某特定操作系统的API所编写的程序,在任何硬件上都可以运行。当然,由于CPU种类不同,机器语言也不相同,因此本地代码当然也是不同的。这种情况下,就需要利用能够生成各CPU专用的本地代码的编译器,来对源代码进行重新编译了。那么有没有方法可以让程序员写的代码,在不同环境下执行呢,经验告诉你肯定是可以的,实现原理是只需要根据不同的环境开发出不同的CLR运行时就可以实现跨平台,像java语言,对应就有不同环境的Java虚拟机JVM。

    C#写的代码是怎么样变成CPU可以执行的机器码呢,流程图如下:

    image

    C# 源代码文件经过编译器生成程序集文件,文件包含了以下内容

    标准的Windows PE32或者PE32+头,能在windows的32位或者64位版本上运行,如果是PE32+的文件,只能在64位版本上运行
    CLR头。包含使这个模块称为托管模块的信息,头部包含要求的CLR版本,一些标识flag,托管模块入口方法等等
    元数据,包含2种元数据表,一种描述源代码中定义的类型和成员,另一种描述源代码引用的类型和成员。
    IL中间语言代码,编译器编译源代码生成的代码。
    微软创建了好几个面向“运行时”的语言编译器,能够将 C++/CLI,C#,Visual Basic ,F#等语言编译成供CLR运行的IL语言,承载了多语言的特点,后面可以只开发出面向CLR编程的高级语言。
    其中:C#源码编译为程序集的过程为编译时,程序集被JIT编译器编译为本地代码,被操作系统调度CPU所执行的过程被称为运行时。

    CLR 中的JIT编译器将IL编译成该平台下的CPU指令

    .NET 平台下面,微软官方只开发了Windows下面运行的CLR,没有开发其他平台的CLR,所以不能做到跨平台,但是在非官方的渠道下,Xamarin公司为了能把.Net做成跨平台,开发了mono虚拟机,虚拟机包含了一个实时编译引擎,该引擎可用于x86, SPARC, PowerPC, ARM等处理器,后被微软收购。

    更多相关内容
  • 该资源有两个,一是串口调试助手的源代码,可以实现数据的接收和发送;二是实现点击某个按钮发送指定数据的应用程序的源代码。代码都是含有详细的中文注释,可以直接编译通过,且内含可执行文件都是可以直接运行的。...
  • 通常上位机和下位机通讯可以采用不同通讯协议,可以有RS232的串口通讯或者采用RS485串行通讯。采用封装好的程序开发工具就可以实现下位机和上位机的通讯,当然可以自己编写驱动类的接口协议控制上位机和下位机的通讯...
  • 自己做串口调试助手

    万次阅读 多人点赞 2017-10-13 18:34:07
    一、协议介绍串口调试助手应该都比较熟悉了,主要用于和下位机通信(如单片机),使用的通信协议就是串口通讯协议。首先先介绍下这个协议。 串口通信属于异步的串行通信,有如下几个特点。1 . 物理上的连线至少三根...

    一、协议介绍

    串口调试助手应该都比较熟悉了,主要用于和下位机通信(如单片机),使用的通信协议就是串口通讯协议。首先先介绍下这个协议。
    串口通信属于异步的串行通信,有如下几个特点。

    1 . 物理上的连线至少三根,分别是tx数据发送线,rx数据接收线,GND共用的地线
    2. 0与1的约定。RS232电平,约定﹣5V至﹣25V之间的电压信号为1,﹢5V至﹢25V之间的电压信号为0 。TTL电平,约定5V的电压信号为1,0V电压信号为0 。CMOS电平,约定3.3V的电压信号为1,0V电压信号为0 。其中,CMOS电平一般用于ARM芯片中。
    3. 发送的顺序,串口是LSB->MSB
    4. 波特率,收发双方共同约定的一个数据位(0或1)在数据传输线上维持的时间。也可理解为每秒可以传输的位数。常用的波特率有2400,9600,14400,19200,115200等。
    5. 通信协议,串口通信分为起始位,数据位,校验位,停止位,时序如下图所示。
    这里写图片描述

    二、程序编写

    编程语言我使用的是C#,C#对这种桌面的图形化编程有着很好的支持,可以迅速编写一些桌面的小工具。
    IDE使用visual studio 2015。

    1.串口类的使用
    串口的库C#已经为我们编写好了 我们可以直接使用,配置如下

       serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
       serialPort1.PortName = comboBox1.Text;
       serialPort1.StopBits = (StopBits)Convert.ToInt32(stopBox.Text);
       serialPort1.DataBits = Convert.ToInt32(dataBox.Text);
       serialPort1.Parity = (Parity)0;
       //解决中文乱码的问题
       serialPort1.Encoding = System.Text.Encoding.GetEncoding("GB2312");
       serialPort1.Open();

    设置串口通信的几个重点参数,如数据位,奇偶校验位,停止位,波特率等,同时设置
    了串口的编码为GB2312,这样就能解决中文乱码的问题。

    为了实时获取可用的端口号,可使用一个定时器,1s更新一次可用串口列表

    string[] ports = SerialPort.GetPortNames();//获得可用串口列表 
    string selectCom = comboBox1.Text;
                //更新可用串口列表
                if (comboBox1.Items.Count > 0)
                {
                    comboBox1.Items.Clear();
                }
                foreach (string port in ports)  
                {
                    comboBox1.Items.Add(port);
                    if (port.Equals(selectCom))
                    {
                        comboBox1.Text = selectCom;
                    }
                }

    配置好了后就可以添加数据接收事件,编写数据接收函数

     serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

    最简单的串口调试助手到此就完成了,不过我们可以再添加一些小功能。

    串口调试助手都是和底层通信,那么经常使用的就是十六进制的数据,所以我们编写字符串转16进制和16进制转字符串这两个函数。

            public static String stringToOxTool(String str)
            {
                StringBuilder sb = new StringBuilder();
                Encoding gb = Encoding.GetEncoding("GB2312");
                //按照GB2312的编码方式把字符串转换为byte型数据
                byte[] values = gb.GetBytes(str);
    
                foreach (byte item in values)
                {
                    int value = Convert.ToInt32(item);
                    //对每个数据按照16进制去格式化
                    string newstr = String.Format("{0:X}", value) + " ";
                    sb.Append(newstr);
                }
                return sb.ToString();
            }
             public static String oxToStringTool(String str)
            {
                List<byte> list = new List<byte>();
                StringBuilder sb = new StringBuilder();
                String[] data= str.Split(' ');
                Encoding gb = Encoding.GetEncoding("GB2312");
    
                foreach (String item in data)
                {
                    if (item == " ")
                    {
                        list.Add(0x20);
                    }
                    else if (item == "\r")
                    {
                        list.Add(0x0d);
                    }
                    else if (item == "\n")
                    {
                        list.Add(0x0a);
                    }
                    else
                    {
                        try
                        {
                            byte value = Convert.ToByte(item, 16);
                            list.Add(value);
                        }
                        catch
                        {
                            list.AddRange((gb.GetBytes(item)));
                        }
                    }
    
                }
                return gb.GetString(list.ToArray());
            }

    如果发送的过程是在主线程里运行的话,那么发送大文件时就会导致界面无法点击,所以数据的发送新建一个从线程,让数据在后台发送。

     Thread t = new Thread(sendDataThread);
                t.Start();
     private void sendDataThread()
    {
        String str = sendDataBox.Text;
    
        //如果数据是16进制格式的先转换为字符串格式
        if (send_0x.Checked)
        {
            str = tool.oxToStringTool(sendDataBox.Text);
        }
         /*
            按换行符去分割字符串,
            即存在多行数据分行发送
         */
        String[] data = str.Split('\n');
        for (int i = 0; i < data.Length; i++)
        {
            //如果存在\r符,则得到它的位置并删除
            int pos = data[i].LastIndexOf('\r');
            if (pos != -1)
            {
                sendData(data[i].Remove(pos));
            }
            else
            {
                sendData(data[i]);
            }
            //发送间隔
            Thread.Sleep(20);
        }
    
    }

    一些发送的配置本来打算使用xml文件,不过搜索了下发现C#自己有一个设置文件,非常好用,而且配置方便。直接新建设置文件,然后配置就能在程序里使用了

    //初始化时从设置文件中读取历史配置值
    comboBox2.Text = config.Default.portBps;  
    sendDataBox.Text = config.Default.sendDataText;
    stopBox.Text = config.Default.portStop;
    dataBox.Text = config.Default.portData;
    checkoutBox.Text = config.Default.portCheck;
    comboBox1.Items.Add(config.Default.com);
    comboBox1.Text = config.Default.com;
    
    sendPeriodValue.Text = config.Default.periodValue.ToString();
    sendNewLineBox.Checked = config.Default.sendNewLineFlag;
    send_0x.Checked = config.Default.hexSendFlag;
    hexShowBox.Checked = config.Default.hexSendFlag;
    timeTickBox.Checked = config.Default.timeTickFlag;
    checkBox2.Checked = config.Default.rxBoxBkColor;
    
    //在窗口关闭事件中把配置数据保留下来
     private void Form1_FormClosing(object sender, FormClosingEventArgs e)
      {
        //保存数据
         config.Default.Save();
      }

    三、功能介绍

    1. 16进制显示,勾选后将显示16进制的字节,如果之前接收到了数据,会自动转换.
    2. 显示界面可以黑底白字或者白底黑字
    3. 时间戳功能,当数据帧中含有”\r\n”时会自动添加当前时间[yyyy-MM-dd hh:mm:ss].
    4. 点击保存窗口可以将接收到的数据存为txt文件,编码格式为GB2312.
    5. 点击清除按钮,可以清除窗口显示的内容,并且清除发送和接收字节计数
    6. 支持16进制发送,勾选16进制发送的时候将对发送区的内容进行16进制和字符互转
    7. 发送换行勾选后,每次发送数据时会自动添加”\r\n”.
    8. 支持发送文件(txt),勾选发送新行后,会自动给文件每一行数据加上换行回车符.
    9. 支持定时发送,可以自定义发送周期
    10. 采用配置文件,记录上一次使用软件时的配置.

    界面如下,界面和功能主要都是模仿了正点原子的XCOM。
    这里写图片描述

    代码托管地址: https://github.com/yuanluw/princomputer

    展开全文
  • 本资源属于一个将串口调试助手与TCP/IP通信上位机软件设计到了一起,由于我自己在做一个物联网方面的实验,需要用到TCP/IP使得手机和电脑可以通信,然后再通过串口控制开发板,从而达到手机无线控制开发板的目的!...
  • 要想做出串口助手软件,首先得深入理解串口原理。 不知道的,可以百度一下,有条件的最好可以用单片机具体实现一下,这样一圈下来保证,你可以理解什么是串口以及它的协议。 来,首先,来了解一下串口串口...

    文/樊晓鑫

    python3.7和wxPython版。

    要想做出串口助手软件,首先得深入理解串口的原理。

    不知道的,可以百度一下,有条件的最好可以用单片机具体实现一下,这样一圈下来保证,你可以理解什么是串口以及它的协议。

    来,首先,来了解一下串口。

    串口通讯结构图

    1、UART通信协议

     UART作为异步串口通信协议的一种,工作原理是将传输数据的每一个字符一位一位地传输。其中每一位(bit)的意义如下:

          起始位:先发出一个逻辑“0”的信号,表示传输字符开始。

          数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

          奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以次来校验数据传送的正确性。

          停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也就越慢。

          空闲位:处于逻辑“1”状态,表示当前线路上没有数据传输
    如下图所示:

    2、UART工作原理

          发送数据过程:空闲状态,线路处于高电平;当收到发送指令后,拉低线路的一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送完成。

          数据接收过程:空闲状态,线路处于高电平;当检测到线路的下降沿(高电平变为低电平)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备接收数据或存入缓冲。

          由于UART是异步传输,没有传输同步时钟,为了保证数据的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误吗。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。

          UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这是计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第一位数据,依次类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,数据接收完成。

          一个标准的10位异步串行通信协议(1个起始位、1个停止位和8个数据位)收发时序,如下图所示:

    3、UART应用场景。

    串口是一种非常通用的设备通信的协议(不要与通用串行总线Universal Serial Bus(USB)混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

    串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
    典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配。

    当你理解了,串口之后,也有助于理解其他的I2C,SPI等协议。

    要想做出串口助手软件,我就从基本的概念介绍一下,这样子,我们心中可以有个数。

    而后,可以首先完成界面的安排。

    第一步,概念的介绍。

    1,串口选择。首先我们用的电脑作为上位机,要想和下位机进行信号互动,得先选择一个固定的串口号,然后才可以发一些想发信号给下位机。

    2,波特率。不言而喻,波特率可以具象理解为就是一个所谓的clock信号,这是上位机和下位机之间信号交流的基准。只有上位机和下位机的比特率一致,这样子才不会出现信号失真或者乱码的现象。这是一个衡量符号传输速率的参数。它表示每秒钟传送的符号的个数。例如300波特表示每秒钟发送300个符号。当我们提到时钟周期时,我们就是指波特率,例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

    3,数据位。这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、6、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

    4,校验位。在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不是真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

    发送数据做如下图示,data byte MSB 与 Parity 重合。

    先刨去 Parity bit,分析 LSB ~ MSB 的纯数据:

        > 假定数据中的 ‘1’ 个数为奇数,偶校验:Parity = ‘1’,奇校验:Parity = ‘0’

        > 假定数据中的 ‘1’ 个数为偶数,偶校验:Parity = ‘0’,奇校验:Parity = ‘1’

     将Parity bit 写入 MSB 位置做替换,这可以理解为编码的过程

    接收端收到数据后作解码操作:

    根据 Parity bit 的值 + 奇偶校验方式 + data( LSB ~ bit6 ) => 算出 MSB 的值,这其实就是发送过程组合数据的逆过程

    5,停止位。用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

    6,打开/关闭串口。让选择的串口号使能,这样子,上位机和下位机就可以进行信号传输。

    7,接收区/发送区。毫无疑问,接收区代表着下位机将数据传输给上位机,下位机是发送方,上位机是接收方;发送区代表着上位机将数据传输给下位机,上位机是发送方,下位机是接收方。

    8,发送按钮。这按钮的功能,就是上位机将发送区的内容发送到下位机。

    9,16进制。勾选上这复选框,发送区和接收区中的内容会以16进制模式显示。

    10,清空按钮。就是清除发送区或者接收区中的内容。

    第二步,具体的界面实现。

    第三步,具体的代码如下所示。

    # -*- coding: utf-8 -*-
    #########################################################################################################
    # pyserial   3.4
    # Python 3.7.6rc1 (tags/v3.7.6rc1:bd18254b91, Dec 11 2019, 19:31:14) [MSC v.1916 32 bit (Intel)] on win32
    #########################################################################################################
    
    import wx
    
    
    class serialFrame(wx.Frame):
        def __init__(self, parent):
            wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"串口助手", pos=wx.DefaultPosition,
                            size=wx.Size(559, 568), style=wx.DEFAULT_FRAME_STYLE)
    
            self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
    
            self.panel = wx.Panel(self, -1)
    
            # 在屏幕中央显示界面
            self.CenterOnScreen()
    
            ################################################################################################################
            ################################################################################################################
            sergrid = wx.GridBagSizer(0, 0)
            sergrid.SetFlexibleDirection(wx.BOTH)
            sergrid.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
    
            self.m_staticText1 = wx.StaticText(self.panel, wx.ID_ANY, u"串口选择", wx.Point(1, 1), wx.DefaultSize, 0)
            self.m_staticText1.Wrap(-1)
            sergrid.Add(self.m_staticText1, wx.GBPosition(0, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_rcvtext = wx.TextCtrl(self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(300, 200),
                                         wx.TE_AUTO_URL | wx.TE_LEFT | wx.TE_MULTILINE)
            sergrid.Add(self.m_rcvtext, wx.GBPosition(0,2), wx.GBSpan(8,2), wx.ALL, 6)
    
            self.m_send2but = wx.Button(self.panel, wx.ID_ANY, u"发送2", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add( self.m_send2but, wx.GBPosition(9, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_clr2but = wx.Button(self.panel, wx.ID_ANY, u"清空2", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_clr2but, wx.GBPosition(9, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_send3but = wx.Button(self.panel, wx.ID_ANY, u"发送3", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_send3but, wx.GBPosition(10, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_clr3but = wx.Button(self.panel, wx.ID_ANY, u"清空3", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add( self.m_clr3but, wx.GBPosition( 10, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 )
    
            self.m_send3but = wx.Button(self.panel, wx.ID_ANY, u"发送4", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_send3but, wx.GBPosition(11, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_clr4but = wx.Button(self.panel, wx.ID_ANY, u"清空4", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_clr4but, wx.GBPosition(11, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_send5but = wx.Button(self.panel, wx.ID_ANY, u"发送5", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_send5but, wx.GBPosition(12, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_clr5but = wx.Button(self.panel, wx.ID_ANY, u"清空5", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_clr5but, wx.GBPosition(12, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_send6but = wx.Button(self.panel, wx.ID_ANY, u"发送6", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_send6but, wx.GBPosition(13, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_clr6but = wx.Button(self.panel, wx.ID_ANY, u"清空6", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_clr6but, wx.GBPosition(13, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            m_comsetChoices = [u"COM1", u"COM2", u"COM3", u"COM4", u"COM5", u"COM6", u"COM7", u"COM8", u"COM9", u"COM10"]
            self.m_comset = wx.ComboBox(self.panel, wx.ID_ANY, u"COM1", wx.DefaultPosition, wx.DefaultSize, m_comsetChoices,
                                        0)
            self.m_comset.SetSelection(0)
            sergrid.Add(self.m_comset, wx.GBPosition(0, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_openser = wx.Button(self.panel, wx.ID_ANY, u"打开串口", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add( self.m_openser, wx.GBPosition(5, 0), wx.GBSpan(1, 1), wx.ALL, 8)
    
            self.m_clrRcvText = wx.Button(self.panel, wx.ID_ANY, u"清空接收", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_clrRcvText, wx.GBPosition(6, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_rcvBox = wx.CheckBox(self.panel, wx.ID_ANY, u"16进制", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_rcvBox, wx.GBPosition(6, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_send1but = wx.Button(self.panel, wx.ID_ANY, u"发送1", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_send1but, wx.GBPosition(8, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_clr1but = wx.Button(self.panel, wx.ID_ANY, u"清空1", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add( self.m_clr1but, wx.GBPosition( 8, 1 ), wx.GBSpan( 1, 1 ), wx.ALL, 5 )
    
            self.m_textCtrl5 = wx.TextCtrl(self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(200, -1),
                                        wx.HSCROLL | wx.TE_AUTO_URL)
            sergrid.Add(self.m_textCtrl5, wx.GBPosition(8, 2), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_checkBox2 = wx.CheckBox( self.panel, wx.ID_ANY, u"16进制", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_checkBox2.SetValue(True)
            sergrid.Add( self.m_checkBox2, wx.GBPosition(8, 3), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_checkBox3 = wx.CheckBox(self.panel, wx.ID_ANY, u"16进制", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_checkBox3.SetValue(True)
            sergrid.Add(self.m_checkBox3, wx.GBPosition(9, 3), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_checkBox4 = wx.CheckBox(self.panel, wx.ID_ANY, u"16进制", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_checkBox4.SetValue(True)
            sergrid.Add(self.m_checkBox4, wx.GBPosition(10, 3), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_checkBox5 = wx.CheckBox(self.panel, wx.ID_ANY, u"16进制", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_checkBox5.SetValue(True)
            sergrid.Add(self.m_checkBox5, wx.GBPosition(11, 3), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_checkBox6 = wx.CheckBox(self.panel, wx.ID_ANY, u"16进制", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_checkBox6.SetValue(True)
            sergrid.Add(self.m_checkBox6, wx.GBPosition(12, 3), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_checkBox7 = wx.CheckBox(self.panel, wx.ID_ANY, u"16进制", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_checkBox7.SetValue(True)
            sergrid.Add(self.m_checkBox7, wx.GBPosition(13, 3), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_textCtrl6 = wx.TextCtrl(self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(200, -1), 0)
            sergrid.Add(self.m_textCtrl6, wx.GBPosition(9, 2), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_textCtrl7 = wx.TextCtrl(self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(200, -1), 0)
            sergrid.Add(self.m_textCtrl7, wx.GBPosition(10, 2), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_textCtrl8 = wx.TextCtrl(self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(200, -1), 0)
            sergrid.Add(self.m_textCtrl8, wx.GBPosition(11, 2), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_textCtrl9 = wx.TextCtrl(self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(200, -1), 0)
            sergrid.Add(self.m_textCtrl9, wx.GBPosition(12, 2), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_textCtrl10 = wx.TextCtrl(self.panel, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size(200, -1), 0)
            sergrid.Add(self.m_textCtrl10, wx.GBPosition(13, 2), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_closeser = wx.Button(self.panel, wx.ID_ANY, u"关闭串口", wx.DefaultPosition, wx.DefaultSize, 0)
            sergrid.Add(self.m_closeser, wx.GBPosition(5, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_staticText6 = wx.StaticText(self.panel, wx.ID_ANY, u"校验位:", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_staticText6.Wrap(-1)
            sergrid.Add(self.m_staticText6, wx.GBPosition(3, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_staticText7 = wx.StaticText(self.panel, wx.ID_ANY, u"停止位:", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_staticText7.Wrap(-1)
            sergrid.Add(self.m_staticText7, wx.GBPosition(4, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            m_comboBox4Choices = [u"None", u"Odd", u"Even", u"Mark", u"Space"]
            self.m_comboBox4 = wx.ComboBox(self.panel, wx.ID_ANY, u"None", wx.DefaultPosition, wx.DefaultSize,
                                        m_comboBox4Choices, 0)
            sergrid.Add(self.m_comboBox4, wx.GBPosition(3, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            m_comboBox5Choices = [u"1", u"1.5", u"2"]
            self.m_comboBox5 = wx.ComboBox(self.panel, wx.ID_ANY, u"1", wx.DefaultPosition, wx.DefaultSize,
                                        m_comboBox5Choices, 0)
            sergrid.Add(self.m_comboBox5, wx.GBPosition(4, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_staticText5 = wx.StaticText(self.panel, wx.ID_ANY, u"数据位:", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_staticText5.Wrap(-1)
            sergrid.Add( self.m_staticText5, wx.GBPosition(2, 0), wx.GBSpan(1, 1), wx.ALL, 5)
    
            m_comboBox2Choices = [u"9600", u"19200", u"38400", u"57600", u"115200", u"230400", u"460800", u"921600",
                                wx.EmptyString, wx.EmptyString]
            self.m_comboBox2 = wx.ComboBox(self.panel, wx.ID_ANY, u"9600", wx.DefaultPosition, wx.DefaultSize,
                                        m_comboBox2Choices, 0)
            sergrid.Add(self.m_comboBox2, wx.GBPosition(1, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            m_comboBox3Choices = [ u"8", u"7", u"6", u"5" ]
            self.m_comboBox3 = wx.ComboBox(self.panel, wx.ID_ANY, u"8", wx.DefaultPosition, wx.DefaultSize,
                                        m_comboBox3Choices, 0)
            sergrid.Add(self.m_comboBox3, wx.GBPosition(2, 1), wx.GBSpan(1, 1), wx.ALL, 5)
    
            self.m_staticText4 = wx.StaticText(self.panel, wx.ID_ANY, u"波特率:", wx.DefaultPosition, wx.DefaultSize, 0)
            self.m_staticText4.Wrap(-1)
            sergrid.Add(self.m_staticText4, wx.GBPosition(1, 0), wx.GBSpan(1, 1), wx.ALL, 5)
            ################################################################################################################
            # layout
            self.panel.SetSizerAndFit(sergrid)
            self.panel.Layout()
    
            self.Centre(wx.BOTH)
            ################################################################################################################
            ################################################################################################################
    
    
    class SerialAPP(wx.App):
        def __init__(self):
            # 如果要重写 __init__, 必须调用wx.App的__init__,否则OnInit方法不会被调用
            wx.App.__init__(self)
    
        def OnInit(self):
            self.frame = serialFrame(None)
            self.frame.Show(True)
    
            return True
    
    # 主函数
    
    
    if __name__ == "__main__":
        app = SerialAPP()
        # 循环监听事件
        app.MainLoop()
    

     

    展开全文
  • 很多时候,调试硬件需要用串口输出一些调试信息,用电脑USB口接收十分方便,串口调试软件很多,用习惯了还是觉得串口调试助手最为方便,这个也是因人而异吧,接下来带大家了解一下串口调试助手如何使用。 工具/...

    转载自:https://jingyan.baidu.com/article/54b6b9c0b3c8c02d583b4707.html

    如何使用串口调试助手(调试串口)

     

    很多时候,调试硬件需要用串口输出一些调试信息,用电脑USB口接收十分方便,串口调试软件很多,用习惯了还是觉得串口调试助手最为方便,这个也是因人而异吧,接下来带大家了解一下串口调试助手如何使用。

    工具/原料

    • windows电脑一台

    • USB接口线一根(用于连接硬件和电脑USB接口)

    方法/步骤

    1. 1

      下载“串口调试助手”,百度直接搜索即可。

      如何使用串口调试助手(调试串口)

    2. 2

      默认安装或自定义安装均可,这款软件比较完整灵活,一般不会出现路径问题

    3. 3

      双击运行,主界面如下:

      如何使用串口调试助手(调试串口)

    4. 4

      首先根据串口发过来的信息选择波特率,这个波特率根据实际需要选择,要保证收发一致,否则可能收不到数据,有的时候可以收到,但是都是乱码

      如何使用串口调试助手(调试串口)

    5. 5

      根据传输协议,设置数据位,校验位,停止位,这三个也需要与发送端保持一致,一般来说都是默认设置8-N-1

      如何使用串口调试助手(调试串口)

    6. 6

      连接好硬件后,选择传输端口,对应电脑上的USB口

      如何使用串口调试助手(调试串口)

    7. 7

      设置数据收发模式,根据实际需要选择

      如何使用串口调试助手(调试串口)

    8. 8

      点击“运行”,即可收发数据包

      如何使用串口调试助手(调试串口)

    9. 9

      串口调试助手也可以调试TCP/UDP数据包,在下图位置,其使用方法与前者类似。

      如何使用串口调试助手(调试串口)

      如何使用串口调试助手(调试串口)

      END

    注意事项

    • 这款软件比较简单,其他功能大家摸索一下难度很小

    • 如有错误欢迎大家评论指正

    展开全文
  • 用QT编写的串口调试助手,可以直接用。还不错!
  • C#开发串口调试助手的详细教程

    千次阅读 多人点赞 2022-03-22 09:58:58
    通过电脑串口(包括USB口)收发数据并且显示的应用软件,一般用于电脑与嵌入式系统的通讯,借助于它来调试串口通讯或者系统的运行状态。也可以用于采集其他系统的数据,用于观察系统的运行情况。 简单的串口助手只能...
  • SSCOM串口调试助手

    2021-03-04 12:21:26
    通用串口调试助手
  • QT制作简易串口调试助手

    千次阅读 2020-08-12 10:27:40
    文章目录QT制作简易串口调试助手0 简介1 界面制作2 逻辑实现2.1 添加与可用串口信息有关的类的准备2.2 读取可用串口并添加到控件2.3 打开串口2.4 关闭串口2.5 串口收发数据2.6 清空接收框3 打包发布3.1 切换到...
  • 串口调试助手源码

    2013-06-22 21:15:17
    串口调试助手源码,帮助你了明白串口调试助手的工作原理,参照这个源码,串口编程变成小case
  • UartAssist串口调试助手用户手册/使用帮助/说明文档V4.3 第一章 UartAssist简介 第二章 串口通信原理 第三章 调试助手配置选项 第四章 调试助手基本操作 第五章 脚本代码语法规则 第六章 调试助手进阶选项
  • 串口调试助手向STM32发送数据过多时,串口调试助手会自动返回一组乱码数据,如图。想知道原理和解决方法!!!波特率、缓冲区字节之类的参数都是设置正确的。数据在120个字节以下,不会出现次现象。求解答!!!!!...
  • 关于STM32 串口二、串口三串口调试助手无法显示的问题 这个问题找了好久,网上都没有找到,后来突然来了灵感,用过Arduino的同学都知道,Arduino Uno板的TX0,RX0是与电脑相连的串口,是一个人机交互的界面。如果...
  • 【PROTEUS】使用PROTEUS与电脑串口调试助手进行通讯

    千次阅读 热门讨论 2020-04-30 21:44:29
    新增虚拟串口对 ... PORTEUS中增加串口控件COMPIM 在PROTEUS中增加一个串口控件,MCU使用AT89C51RD2 ...这里我们设置的属性要跟MCU的属性、串口调试助手的属性一致。 这儿我们都设置为"9600,N,8,1" 编写MCU发送程序 /*...
  • 本节所提供程序的功能是,通过电脑串口调试助手下发三个不同的命令,条指令:buzz on 可以让蜂鸣器响;第二条指令:buzz off 可以让蜂鸣器不响;第三条指令:showstr ,这个命令空格后边,可以添加任何字符串,让...
  • qt 串口调试助手 显示16进制数,QSerialport QTcp 显示方法都一样
  • 我们知道,串口调试助手的接收窗口能够看到十六进制数和字符串,如果我要发送33这个数,直接用平常的串口字符发送函数,16进制显示的是21,而要是没有勾选“16进制显示”,那么显示的就是33在ASCII码中对应的字符...
  • 一、借助虚拟串口驱动软件模拟PC端串口调试助手软件与Proteus中51单片机相互通信原理虚拟终端(比如:Proteus中51单片机)的TXD(发送数据)和RXD(接收数据)分别与虚拟串口驱动软件所模拟出其中一个虚拟串口的TXD(发送...
  • WPF制作简易串口调试助手(上位机部分)

    万次阅读 多人点赞 2019-01-06 17:17:52
    项目要求:下位机使用单片机,不断发送一个随机数值给上位机,上位机收到数据,显示在显示框中。 实验环境:vs2013 ... 一、窗体程序制作: ...1.首先我们参照网上的串口调试助手将UI界面的大体框架完成。 2...
  • 基于qt4的串口调试助手开发

    千次阅读 2018-06-27 00:27:01
    本课程设计的内容是设计一个基于QT的串口调试软件,同时支持中文、英文数传输、十六进制数据传输、文件内容传输。 2. 课程设计目的 考察自己对课程的掌握程度,熟悉QT开发环境,以及自己实际的动手能力,C++编程...
  • 串口发送接收文件 文件的发送接收 简单 方便
  • 一、下载安装XCOM串口调试助手 下载地址 XCOM的详细讲解 另外需要安装C340的驱动 正点原子提供的驱动win10系统不支持,安装了几次都失败了,然后我上论坛找的驱动安装成功了 驱动地址 安装过程比较简单,...
  • 借助视频教程快速上手,省事有效却无法掌握一些小细节,写起程序来,各种调试不通过,还是浪费时间; 3.直接采用网络大神的程序,在运行成功的前提下,再仔细消化各种精髓,方法虽然高效,但也是建立在作者编写...
  • 51单片机的串口通信原理

    千次阅读 2021-05-06 22:27:34
    //单片机接收到上位机发送的数据,让P1口读取就点亮二极管了 } } } 用串口调试助手发送FD,可以看到第二个二极管被点亮。注意:串口在电脑管理设置中查看,要一致才能连接上;波特率也要一致不然发送时会出现乱码...
  • 手机蓝牙串口调试助手demo实现

    万次阅读 多人点赞 2018-05-31 17:36:28
    在开始学Android开发的时候,由于其他的需要,本着学习的心态,再网上找了一个资源,做了一个手机蓝牙串口调试助手。 程序搭建原理简介: 在Android蓝牙通信连接的开发中,需要在AndroidManifest.xml配置文件中...
  • 串口调试助手V2.2

    2011-12-07 21:12:07
    针对232串口,灵活的进行数据收发,使用起来方便快捷。
  • 源码说明: 串口调试助手的源代码,可以实现数据的接收和发送;二是实现点击某个按钮发送指定数据的应用程序的源代码。代码都是含有详细的中文注释,可以直接编译通过,且内含可执行文件都是可以直接运行的。适合...
  • 串口基本原理详解

    2020-12-21 17:06:17
    原标题:串口基本原理详解有很多有过一定嵌入式开发工作经验的朋友在从事嵌入式开发的过程当中,主要在嵌入式软件,界面等方向做的研究较多,但经常也会用串口进行调试程序,只知道串口是用来传输数据用的。...

空空如也

空空如也

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

串口调试助手原理

友情链接: DBServerClear.rar