精华内容
下载资源
问答
  • C语言结构体(struct)常见使用方法

    万次阅读 多人点赞 2014-04-14 01:51:57
    基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。 (因为C++和C有通之处,但是在...

    注意:盗版是不会得到修正和更新的!

     

    今天复习一下struct,顺便挖掘一下以前没注意的小细节:

    基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量。具体一点说,结构体是让一些很散的数据变得很整,不管是网络传输,还是函数传参,还是为了便于你肉眼管理。

    一个函数,你想传入一个参数void func(),就需要改一下函数定义,加一个数据类型和数据名void func(int i);又想加一个参数,又改一遍void func(int i,double b);如此往复。但是用一个结构体(或者类对象)传入,这个函数定义就可以不改动了,只改结构体就好了,比如一个游戏,你的人物属性有成百上千,你只需要修改你的类与结构体成员就好了。

     

    (因为C++和C有共通之处,但是在结构体上的某些机制又有所不同,所以后边提了一下C++得东西,不喜欢可以略过,但是2021年了,用纯C的人估计要消失了吧,尤其新人)

     

    结构体声明与定义:

     

    第一种:只有结构体定义

    struct stuff{
            char job[20];
            int age;
            float height;
    };

     

    第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义

    //直接带变量名Huqinwei
    struct stuff{
            char job[20];
            int age;
            float height;
    }Huqinwei;

    也许初期看不习惯容易困惑,其实这就相当于两步合并一步:先定义结构体stuff,再定义变量Huqinwei

    struct stuff{
            char job[20];
            int age;
            float height;
    };
    struct stuff Huqinwei;
    

     

    第三种:如果该结构体你只用一个变量Huqinwei,而不再需要用

    struct stuff yourname;

    去定义第二个变量。

    那么,附加变量初始化的结构体定义还可进一步简化出第三种

    把结构体名称去掉,用匿名结构体直接定义一个结构体对象(习惯用对象这词了,大家都要习惯,没纯C了),这样更简洁,不过也不能定义其他同类型结构体变量了——除非用typeof再逆向找到这个类型。

    struct{
            char job[20];
            int age;
            float height;
    }Huqinwei;

    第三种附加:使用typeof重新利用HU的结构体定义HU3

    并且定义指针ptr1,ptr2

    #include <stdio.h>
    
    struct
    {
            char a;
            short b;
            int c;
    }HU;
    
    struct
    {
            char a;
            short b;
            int c;
    }HU2;
    
    int main(){
    
            printf("%ld\n",sizeof(HU));
    
            typeof(HU) HU3;
            printf("%ld\n",sizeof(HU3));
            printf("%ld\n",sizeof(HU2));
            typeof(HU) *ptr1 = &HU;
            typeof(HU) *ptr2 = &HU3;
            ptr2->b = 444;
            printf("%d\n",ptr2->b);
            ptr1 = ptr2;
            printf("%d\n",ptr1->b);
    
    
    }
    

    同样的写法,再定义一个结构体成员HU2,他们的“类型”不同,因为如果类型相同,肯定会报错了,实际并没有报。

    不过内存操作角度,HU2和HU应该没有任何区别,也可以用指针强行更改,前提是确认安全,比如没有不同文件不同平台对齐不兼容这种问题,所以C很万能,也很危险

     

    结构体变量及其内部成员变量的定义及访问:

    绕口吧?要分清结构体变量和结构体内部成员变量的概念。

     

    就像刚才的第二种提到的,结构体变量的声明可以用:

    struct stuff yourname;

    其成员变量的定义可以随声明进行:

       struct stuff Huqinwei = {"manager",30,185};
    

    也可以考虑结构体之间的“赋值”(拷贝构造):

            struct stuff faker = Huqinwei;
    //或    struct stuff faker2;
    //      faker2 = faker;
    打印,可见结构体的每一个成员变量一模一样
    

    如果不使用上边两种方法,那么成员数组的操作会稍微麻烦(用for循环可能好点)

            Huqinwei.job[0] = 'M';
            Huqinwei.job[1] = 'a';
            Huqinwei.age = 27;
            Huqinwei.height = 185;
    

    结构体成员变量的访问除了可以借助符号".",还可以用"->"访问(下边会提)。

     

    引用(C++)、指针和数组:

    首先是引用和指针:

    int main()
    {
            struct stuff Huqinwei;
    
            struct stuff &ref = Huqinwei;
            ref.age = 100;
            printf("Huqinwei.age is %d\n",Huqinwei.age);
            printf("ref.age is %d\n",ref.age);
    
            struct stuff *ptr = &Huqinwei;
            ptr->age = 200;
            printf("Huqinwei.age is %d\n",Huqinwei.age);
            printf("ptr->age is %d\n",ptr->age);
    //既然都写了,把指针引用也加上吧
            struct stuff *&refToPtr = ptr;
            refToPtr->age = 300;
            printf("Huqinwei.age is %d\n",Huqinwei.age);
            printf("refToPtr->age is %d\n",refToPtr->age);
    
    
    }
    

     

    更正:之前给引用的初始化语句写错了,而且没注明引用是纯C中没有的东西(在这么个以C为幌子的博客中)。

    引用是C++特有的一个机制,必须靠编译器支撑,至于引用转换到C中本质是什么,我有个帖子写过
     

     

    结构体也不能免俗,必须有数组:

    struct test{
            int a[3];
            int b;
    };
    //对于数组和变量同时存在的情况,有如下定义方法:
            struct test student[3] =      {{{66,77,55},0},
                                            {{44,65,33},0},
                                            {{46,99,77},0}};
    //特别的,可以简化成:
            struct test student[3] =       {{66,77,55,0},
                                            {44,65,33,0},
                                            {46,99,77,0}};
    

     

    变长结构体

    可以变长的数组

    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    typedef struct changeable{
            int iCnt;
            char pc[0];
    }schangeable;
    
    main(){
            printf("size of struct changeable : %d\n",sizeof(schangeable));
    
            schangeable *pchangeable = (schangeable *)malloc(sizeof(schangeable) + 10*sizeof(char));
            printf("size of pchangeable : %d\n",sizeof(pchangeable));
    
            schangeable *pchangeable2 = (schangeable *)malloc(sizeof(schangeable) + 20*sizeof(char));
            pchangeable2->iCnt = 20;
            printf("pchangeable2->iCnt : %d\n",pchangeable2->iCnt);
            strncpy(pchangeable2->pc,"hello world",11);
            printf("%s\n",pchangeable2->pc);
            printf("size of pchangeable2 : %d\n",sizeof(pchangeable2));
    }

    运行结果

    size of struct changeable : 4
    size of pchangeable : 4
    pchangeable2->iCnt : 20
    hello world
    size of pchangeable2 : 4

    如上,本例中变长结构体本身长度就是一个int的长度(这个int值通常只为了方便表示后边的数组长度),而后边的数组长度不计算在内,但是该数组可以直接使用。

    (说后边是个指针吧?指针也占长度!这个是不占的!原理很简单,这个东西完全是数组后边的尾巴,malloc开辟的是一片连续空间。其实这不应该算一个机制,感觉应该更像一个技巧吧

    20191113:这块可能有点抽象?建议去了解一下手动开辟空间malloc和指针相关知识,所谓“变长结构体”,不是一个你理解的结构体!至少不是按正常结构体用的,他像是一个逻辑性的概念,空间是malloc开辟的,结构体是以指针形式存在的“虚拟”的概念,简单说,这个“结构体”不在栈空间!

     

     

    20160405补充:

    非弹性数组不能用"char a[]"这种形式定义弹性(flexible)变量,必须明确大小。

    弹性数组在结构体中,下面的形式是唯一允许的:

     

    struct s
    {
            int a;
            char b[] ;
    };

    顺序颠倒会让b和a数据重合,会在编译时不通过。

    char b[] = "hell";也不行(C和C++都不行)

    少了整型变量a又会让整个结构体长度为0,compiler不允许编译通过!不同的是,其实C++形式上是允许空结构体的,本质上是通过机制避免了纯空结构体和类对象,自动给空结构体对象分配一个字节(sizeof()返回1)方便区分对象,避免地址重合!所以呢,C如果有空结构体,定义两个(或一打,或干脆一个数组)该结构体的变量(对象),地址是完全一样的!·!!!!!!!!调试看程序运行,这些语句其实都被当屁放了,根本没有运行,没有实际意义,C压根不支持空结构体这种东西(或者说我也没想好什么场合有用)

     

    struct s2
    {
    //      char a[]  = "hasd" ;
    //      int c;
    };
    int main()
    {
            struct s2 s22;
            struct s2 s23;
            struct s2 s24;
            struct s2 s25;
    }
    


    例外的是,C++唯独不给带弹性数组的结构体分配空间(可能怕和变长结构体机制产生某种冲突,比如大小怎么算):

    struct s
    {
            char b[] ;
    };

     

    struct s
    {
    //        char b[] ;
    };

    C++中两者是不一样的,空的结构体反而“大”(sizeof()返回1)
     

    20160321补充:这个机制利用了一个非常重要的特性——组和指针的区别!数组和指针在很多操作上是一样的,但是本质不一样。最直观的,指针可以改指向,数组不可以,因为数组占用的每一个内存地址都用来保存变量或者对象,而指针占用的内存地址保存的是一个地址,数组没有单独的保存指向地址的这样一个结构。数组的位置是固定的,正如指针变量自身的位置也是固定的,改的是指针的值,是指向的目标地址,而因为数组不存储目标地址,所以改不了指向。企图把地址强制赋值给数组的话,也只是说把指针赋值给数组,类型不兼容。

     

    结构体嵌套:

    结构体嵌套其实没有太意外的东西,只要遵循一定规律即可:

     

    //对于“一锤子买卖”,只对最终的结构体变量感兴趣,其中A、B也可删,不过最好带着
    struct A{ 
            struct B{
                 int c;
            }
            b;
    }
    a;
    //使用如下方式访问:
    a.b.c = 10; 
    

    特别的,可以一边定义结构体B,一边就使用上:

    struct A{
            struct B{
                    int c;
            }b;
    
            struct B sb;
    
    }a;
    

    使用方法与测试:

            a.b.c = 11;
            printf("%d\n",a.b.c);
            a.sb.c = 22;
            printf("%d\n",a.sb.c);
    结果无误。 

    但是如果嵌套的结构体B是在A内部才声明的,并且没定义一个对应的对象实体b,这个结构体B的大小还是不算进结构体A中。

     

     

    结构体与函数:

    关于传参,首先:

    void func(int);
    func(a.b.c);

    把结构体中的int成员变量当做和普通int变量一样的东西来使用,是不用脑子就想到的一种方法。

     

    另外两种就是传递副本和指针了 :

    //struct A定义同上
    //设立了两个函数,分别传递struct A结构体和其指针。
    void func1(struct A a){
            printf("%d\n",a.b.c);
    }
    void func2(struct A* a){
            printf("%d\n",a->b.c);
    }
    main(){
            a.b.c = 112;
            struct A * pa;
            pa = &a;
            func1(a);
            func2(&a);
            func2(pa);
    }
    
    

     

    注意:盗版是得不到更新迭代的(手动滑稽)https://blog.csdn.net/huqinweI987/article/details/23625823

     

     

    占用内存空间:

    struct结构体,在结构体定义的时候不能申请内存空间,不过如果是结构体变量,声明的时候就可以分配——两者关系就像C++的类与对象,对象才分配内存(不过严格讲,作为代码段,结构体定义部分“.text”真的就不占空间了么?当然,这是另外一个范畴的话题)。

     

    结构体的大小通常(只是通常)是结构体所含变量大小的总和,下面打印输出上述结构体的size:

            printf("size of struct man:%d\n",sizeof(struct man));
            printf("size:%d\n",sizeof(Huqinwei));
    结果毫无悬念,都是28:分别是char数组20,int变量4,浮点变量4. 

     

    下边说说不通常的情况:

    对于结构体中比较小的成员,可能会被强行对齐,造成空间的空置,这和读取内存的机制有关,为了效率。通常32位机按4字节对齐,小于的都当4字节,有连续小于4字节的,可以不着急对齐,等到凑够了整,加上下一个元素超出一个对齐位置,才开始调整,比如3+2或者1+4,后者都需要另起(下边的结构体大小是8bytes),相关例子就多了,不赘述。

    struct s
    {
    char a;
    short b;
    int c;
    }

    相应的,64位机按8字节对齐。不过对齐不是绝对的,用#pragma pack()可以修改对齐,如果改成1,结构体大小就是实实在在的成员变量大小的总和了。
    补一个代码,压入1字节对齐,定义s,然后弹出,使用默认,定义s2,两个结构体大小分别为7和8

    #include <stdio.h>
    #pragma pack(push,1)
    struct s
    {
            char a;
            short b;
            int c;
    };
    #pragma pack(pop)
    struct s2
    {
            char a;
            short b;
            int c;
    };
    
    
    
    int main(){
    
            printf("%ld\n",sizeof(struct s));
            printf("%ld\n",sizeof(struct s2));
    
    }
    
    $ ./a.out
    7
    8
    

     

    和C++的类不一样,结构体不可以给结构体内部变量初始化,。

    如下,为错误示范:

     

    #include<stdio.h>
    //直接带变量名Huqinwei
    struct stuff{
    //      char job[20] = "Programmer";
    //      char job[];
    //      int age = 27;
    //      float height = 185;
    }Huqinwei;
    

     

    PS:结构体的声明也要注意位置的,作用域不一样。

    C++的结构体变量的声明定义和C有略微不同,说白了就是更“面向对象”风格化,要求更低。

     

    那么熟悉了常用方法,都要注意哪些常犯错误呢,见C语言结构体常见错误

     

     

     

    展开全文
  • 阳数码管和阴数码管用法区别

    万次阅读 2015-03-26 18:47:29
    阳数码管和阴数码管用法区别

    共阳数码管和共阴数码管用法区别

    学习单片机将近一年半了,今天突然发现,我学习东西只是单纯的去记忆知识,并不涉及什么推理,基本上也没有什么思考.学得不真,学得也不深.长此以往,自己的思维将会变得越来越呆滞…….
    总结能梳理自己的思绪,所以从今天起开始写博客来记录自己的学习过程……..
    好了,废话不多说,今天在使用数码管的时候发现数码管的亮度很低,怎么调都不好使…..不是因为数码管没有驱动(用了74hc573作为驱动芯片),也不是因为电压不高(单片机IO输出5v)。。。。
    先贴出电路,相信大家很快就明白怎么回事了。。。。
    这里写图片描述
    共阳数码管公共端为阳极,接一个IO口,电流非常小。。。
    解决办法:可以在各个阴极接三极管放大。
    共阴数码管公共端为阴极极,接多个IO口,电流非常比较大。。。
    这里写图片描述

    展开全文
  • Modbus测试工具ModbusPoll与Modbus Slave使用方法

    万次阅读 多人点赞 2017-09-14 13:15:39
    Modbus测试工具ModbusPoll与Modbus Slave使用方法

    一、介绍

    Modbus Poll :Modbus主机仿真器,用于测试和调试Modbus从设备。该软件支持ModbusRTU、ASCII、TCP/IP。用来帮助开发人员测试Modbus从设备,或者其它Modbus协议的测试和仿真。它支持多文档接口,即,可以同时监视多个从设备/数据域。每个窗口简单地设定从设备ID,功能,地址,大小和轮询间隔。你可以从任意一个窗口读写寄存器和线圈。如果你想改变一个单独的寄存器,简单地双击这个值即可。或者你可以改变多个寄存器/线圈值。提供数据的多种格式方式,比如浮点、双精度、长整型(可以字节序列交换)。

    Modbus Slave: Modbus从设备仿真器,可以仿真32个从设备/地址域。每个接口都提供了对EXCEL报表的OLE自动化支持。主要用来模拟Modbus从站设备,接收主站的命令包,回送数据包。帮助Modbus通讯设备开发人员进行Modbus通讯协议的模拟和测试,用于模拟、测试、调试Modbus通讯设备。可以32个窗口中模拟多达32个Modbus子设备。与Modbus Poll的用户界面相同,支持功能01, 02, 03, 04, 05, 06, 15, 16, 22和23,监视串口数据。

    二、Modbus Poll使用

    1)、安装注册:  

     安装完毕,在桌面能够看到ModbusPoll的快捷方式,双击该快捷方式,打开软件,打开后界面如下图所示。

    单击Connection->Connect,弹出注册窗口;打开压缩包解压后的readme文件,复制ModbusPoll的序列号,粘贴到注册窗口的注册栏,如下图所示,点击OK,破解完毕。

    2)、程序主窗口:

    按照上面破解流程,按“OK”按钮即可完成注册。然后直接进入主窗口,如下图所示:

    modbus poll 4.3.4程序主窗口

    其中:Tx = 4表示向主站发送数据帧次数,图中为4次; Error = 0表示通讯错误次数,图中为0次; ID = 1表示模拟的Modbus子设备的设备地址,图中地址为1;F = 03表示所使用的Modbus功能码,图中为03功能码; SR = 1000ms表示扫描周期。红字部分,表示当前的错误状态,“No Connection”表示未连接状态。

     

    3)、参数设置:

    单击菜单【Setup】中【Read/Write Definition.. F8】进行参数设置,会弹出参数设置对话框。

     

     

     

    其中:A. Slave为要访问的Modbus从站(从机)的地址,对应主窗口(主画面)中的ID值,默认为1。  B. Function 为寄存器功能码的选择,共四种,分别对应关系如下:

    代码

    中文名称

    寄存器PLC地址

    位操作/字操作

    操作数量

    01

    读线圈状态

    00001-09999

    位操作

    单个或多个

    02

    读离散输入状态

    10001-19999

    位操作

    单个或多个

    03

    读保持寄存器

    40001-49999

    字操作

    单个或多个

    04

    读输入寄存器

    30001-39999

    字操作

    单个或多个

    05

    写单个线圈

    00001-09999

    位操作

    单个

    06

    写单个保持寄存器

    40001-49999

    字操作

    单个

    15

    写多个线圈

    00001-09999

    位操作

    多个

    16

    写多个保持寄存器

    40001-49999

    字操作

    多个

     C. Address 为寄存器起始地址,默认从0开始。  

    D. Length为寄存器连续个数,默认为10个,对应组态软件的通道数量。  

    E. Scan Rate为读取数据周期,单位毫秒,默认为1000ms。   

    设置完成单击OK按钮,模拟窗口将显示定义的寄存器列表。

    4)、显示设置:  

    数据显示方式设置:  

    默认情况下,寄存器数据的显示方式为Signed方式(16进制无符号二进制),数据范围为-32768~32767。如果用户要以其他数值方式显示,可以通过菜单【Display】进行选择设置,如下图所示:

     

    地址格式设置: Modbus Slave默认使用PLC地址,【Display】菜单中【PLC Addresses(Base 1)】为默认选中状态,默认寄存器的起始地址为1开始,此点与组态软件的Modbus串口和TCP数据转发驱动是相同的。如果测试时需要设置起始地址为0开始,可选择【Protocol Addresses(Base 0)】。一般情况下使用默认PLC地址即可。

    使用工具栏的”Communication Traffic”按钮,可以显示出当前发送命令和接受的数据。

    5)、串口连接:  

    单击菜单【Connection】中【Connect.. F3】进行串口连接,如下图 :

     其中:Port3,表示使用的串口(COM3),根据实际情况选择不同的串口或者TCP/IP进行连接。Mode,表示Modbus协议模式,使用串口时有效;使用TCP/IP时自动为TCP模式。Response Timeout,表示读取超时时间,从站在超时时间内没有返回数据,则认为通讯失败。Delay Between Polls,每次扫描的最小间隔时间,默认为10ms。Remote Server,表示TCP/IP模式时的终端从站设备的网络设置。IP Address,表示TCP/IP模式时从站IP地址。  Port,表示TCP模式时从站网络端口。用户可根据需要对参数进行设置,默认为:串口1、波特率9600、数据位8位、无校验位、1位停止位。确认设置后点击OK按钮即可。如果连接并读取正确,此时主窗口将显示读取寄存器的相关信息。

     6)、寄存器值改变:  

    在主窗口寄存器地址上双击鼠标,弹出修改对话框,如下图:

     

    在Value输入框中输入值确认即可。范围为-32768——32767。  

    其中:Slave为要访问的Modbus从站的地址,对应主画面中的ID值,默认为1。  Address 为当前操作的寄存器的地址。图中为对寄存器40001操作。  Use Function为所使用的功能码,可以选择06或16功能码进行写入。

    7)、查看通讯数据帧:  

    单击【Display】菜单中的【Communication…】或者单击工具栏上【101】按钮,可以调出串口收发数据帧监视信息对话框“CommunicationTraffic”,用来查看分析收发的数据帧。如下图所示: 

     其中:前6位为数据帧的序号。  Rx表示接收的数据帧。  Tx表示发送的数据帧。  

    8)、断开连接:  

    点击【Disconnect  F4】即可断开连接结束测试,此时主窗口中出现红色的“No Connection”表示未连接状态。

     

    三、Modbus Slave使用

    1)、安装注册:
    安装软件,安装完成之后,双击执行ModbusSlave快捷方式即可。

    注册方法:单击Connection->Connect,弹出注册窗口;打开压缩包解压后的readme文件,复制ModbusPoll的序列号,粘贴到注册窗口的注册栏,点击OK,破解完毕。ModbusSlave的安装破解与ModbusPoll类似,在此不再赘述。

    2)、主窗口:
    软件主窗口如下图所示:

    此时处于“Noconnection”未连接状态,如果只测试“04输出保持寄存器”,则可直接点击跳到第3.步,直接进行连接即可。

    3)、参数设置:
    点击菜单“Setup”中“Slave Definition.. F2”进行参数设置,会弹出如下图对话框。

    其中:A.Slave为Modbus从站地址,对应主画面中的ID值,默认为1。
    B. Function 为寄存器功能码的选择,共四种,分别对应关系如下:

    代码

    中文名称

    寄存器PLC地址

    位操作/字操作

    操作数量

    01

    读线圈状态

    00001-09999

    位操作

    单个或多个

    02

    读离散输入状态

    10001-19999

    位操作

    单个或多个

    03

    读保持寄存器

    40001-49999

    字操作

    单个或多个

    04

    读输入寄存器

    30001-39999

    字操作

    单个或多个

    05

    写单个线圈

    00001-09999

    位操作

    单个

    06

    写单个保持寄存器

    40001-49999

    字操作

    单个

    15

    写多个线圈

    00001-09999

    位操作

    多个

    16

    写多个保持寄存器

    40001-49999

    字操作

    多个

    C. Address 为寄存器起始地址。默认从1开始。
    D. Length为寄存器连续个数。默认为10个。

    设置OK按钮,模拟窗口将显示定义的寄存器列表:

    其中:ID,表示模拟的Modbus子设备的设备地址;F,表示功能码
    点击对应的寄存器,即可修改对应寄存器的值或者状态。比如2寄存器值修改成9,9寄存器值修改成100。

    4)、显示设置:
    数据显示方式设置:
    默认情况下,寄存器数据的显示方式为Signed方式(16进制无符号二进制),数据范围为范围为-32768——32767。如果用户要以其他数值方式显示,可以通过菜单“Display”进行选择设置,如下图所示:

    地址格式设置:
    Modbus Slave默认使用PLC地址,“Display”菜单中“PLC Addresses(Base 1)”为默认选中状态,默认寄存器的起始地址为1开始,此点与组态软件的Modbus串口和TCP数据转发驱动是相同的。如果测试时需要设置起始地址为0开始,可选择“Protocol Addresses(Base 0)”。一般情况下使用默认PLC地址即可。

    5)、连接:
    点击菜单“Connection”中“Connect.. F3”进行连接。弹出连接对话框:

    其中:Port2,表示使用的串口(COM2),根据实际情况选择不同的串口或者TCP/IP进行连接
    Mode,表示Modbus协议模式,使用串口时有效;使用TCP/IP时自动为TCP模式
    Flow Control,表示流控制,串口模式时有效;
    Ignore Unit ID,表示TCP模式时忽略无效的组编号
    用户可根据需要对串口参数进行设置,默认为:串口1,波特率9600,数据位8位,无校验位,1位停止位。确认设置后点击“OK”按钮即可。此时主窗口中红色的“No connection”表示未连接状态的信息消失,表明从站处于正常连接状态。

    6)、寄存器值改变:
    在主窗口寄存器地址上双击鼠标,弹出修改对话框,如下图:

    在输入框中输入值确认即可。范围为-32768——32767。
    其中:Auto increment选项钩选上后,对应寄存器的值可以每1秒种增加1。

    7)、查看通讯数据帧:
    点击“Display”菜单中的“Communication…”,可以调出串口收发数据帧监视信息对话框,用来查看分析收发的数据帧。如下图所示:

    其中:前6位为数据帧的序号。
    Rx:表示接收数据帧。
    Tx: 表示发送数据帧。

    8)、断开连接:
    点击“Disconnect F4”即可断开连接结束测试,此时主窗口中出现红色的“No connection”表示未连接状态。

     

    四、Modbus主机/从机模拟程序

    1)、安装vspd虚拟串口工具。通过工具添加COM2和COM3两个端口。

    2)、接下来打开已经安装的modbuspoll和modbus slave软件,分别按“F8”配置主从端的相关配置,如图:


    以上配置的是10个计数器从机设备ID为1但只读取前6个计数器的数据,可根据自己的情况设置。

    2、接下来按分别按“F3”进行连接,注意修改连接界面的端口,主从机分别选择我们虚拟出来的com2和com3端口,因为我只用到了RTU模式,所以其他选项如波特率9600,比特位8,校验位1,无等价位等可以保持不变,然后点击确定进行连接,未连接成功窗口第二行会给出提示信息。

    通讯开始,主机端显示:TX=232,Err=0,ID=1,F=03,SR=1000ms。意思是,发送232次命令,错误次数,从机ID,功能号,轮询间隔。

    使用工具栏的”Communication Traffic”按钮,可以显示出当前发送命令和接受的数据。

     

    Modbus Poll 4.3.4 破解版下载:http://www.cr173.com/soft/21405.html

    Modbus Slave调试工具下载:http://www.cr173.com/soft/21410.html

    Modbus调试精灵 7.04绿色版下载:http://www.cr173.com/soft/5480.html

     

     

    展开全文
  • phylip的具体使用方法

    千次阅读 2017-08-03 11:24:28
    phylip的具体使用方法

    phylip的具体使用方法:

    1. 打开ClustalX软件(对序列进行比对),点击“文件”→“载入序列”;点击“比对” →“输出格式选项” →“phylip格式”前打勾;点击“比对” →“完全比对”;比对完成后,关闭程序,并将生成的带.phy后缀的文件拷贝至phylip软件包的“exe”文件夹下。


    2. 打开seqboot软件,按照路径输入所拷贝的“.phy”文件,回车


    3. 输入“r”,回车→输入1000,回车→输入“y”,回车→输入“5”,回车→出现“press enter to quit”字样时,回车,退出程序,完成seqboot(上图中的J选项代表评估方法,默认为bootstrap法进行评估,可更改选项;R选项默认多少次,输入1000表示共进行1000次的republicate)。自动生成文件“outfile”,可用记事本打开。


    4. 将刚刚生成的outfile文件更名为infile1,打开dnadist软件(采用邻位相连算法构建进化树,如采用其他算法,则用其他软件),按照路径输入文件名infile1,回车


    5. 输入t,回车→输入20,回车→输入m,回车→输入d,回车→输入1000,回车→输入y,回车→等待……等待……等待……时间长度视序列多寡长短及重复数多寡而不等,直到出现“press enter to quit”字样时,回车,退出程序(D选项为距离模式,默认为F84;T选项为点突变的“转换/颠换比率”,通常在15~30之间;M选项采用和原来一样的重复数;输入d,采用data sets)。自动生成文件outfile。


    6. 将outfile重命名为infile2,打开neighnor软件(采用邻位算法),按照路径输入infile2,回车


    7. 输入选项m,回车→输入1000,回车→输入奇数5,回车→输入y,回车→等待……一定时间后出现“press enter to quit”字样时,回车,退出程序。生成两个文件outfile和outtree。Outfile是分析结果的输出报告,可用记事本打开,outtree可用treeview打开。


    8. 将outfile更名为outfile1,outtree文件更名为intree1,打开consense软件,按照路径输入intree1,回车


    9. 输入y,回车→等待……一定时间后出现“press enter to quit”字样时,回车,退出程序。生成两个新文件outfile和outtree。Outtree就是最终结果,可用treeview软件打开观看。

    展开全文
  • <h3 th:text="${#arrays.length(types)}">14</h3>个分类
  • 阴极和阳极RGB LED是两种不同类型的LED,其功能相同但工作方式不同。本篇文章主要介绍如何在Arduino开发板上使用这两种不同的RGB LED。 RGB LED广泛用于Arduino平台的许多项目中。他们致力于组合任何色调的基本...
  • pagehelper使用方法及参数说明

    千次阅读 2020-07-28 15:49:12
    pagehelper使用方法及参数说明 使用方法: @Override public PageInfo<Person> getByPage(int currentPage, int pageSize, Map<String,Object> map) { PageHelper.startPage(currentPage,pageSize...
  • 数码管的使用方法

    千次阅读 2014-09-03 18:02:44
    数码管是嵌入式开发中比较常用的一个模块,本篇文章根据本人近期查阅的资料以及学习笔记整理成文,尽可能详尽的讲解常用数码管原理和使用方法。有不足和疏忽的地方,请不吝指正。 目录 1.工作 原理 2.电气特性 3....
  • Session使用方法详解

    万次阅读 2018-06-27 17:20:59
    Session的声明与使用 Session的设置不同于Cookie,必须先启动,在PHP中必须调用session_start()。session_start()函数的语法格式如下: Bool session_start(void) //创建Session,开始一个会话,进行Session初始化...
  • 毫伏表的使用方法

    千次阅读 2016-06-15 10:03:37
    常用的单通道晶体管毫伏表,具有测量交流电压、电平...现将其基本使用方法介绍如下: 1、开机前的准备工作:  (1)将通道输入端测试探头上的红、黑色鳄鱼夹短接;  (2)将量程开关置于最高量程(300V)。
  • MERGE INTO 的使用方法

    2016-06-19 19:26:19
    使用该MERGE INTO 是因为最近工作中的需要,首先说下使用的原由,数据模型中的日期类型是varchar2(10)的类型,如今要修改为DATE类型的,保证数据的不丢失,涉及到200多张表,425 个字段,所以要一个一个字段的数据...
  • 【qt】QSqlTableModel 使用方法

    千次阅读 2019-06-13 16:06:01
    QSqlTableModel 使用方法 2013年03月27日 ⁄ 綜合 ⁄ 9196字 ⁄ 字型大小 小 中 大 ⁄ 評論關閉 Qt QSqlTableModel 使用心得 連接資料庫 執行sql查詢,條件顯示,排序 獲取記錄數,列數以及記錄內容,欄位內容 ...
  • HttpClient类包基本使用方法

    千次阅读 2016-08-29 11:00:08
    HttpClient类包基本使用方法 1.1Get与Post: HttpClient类包主要目标是发送和接收报文,即HttpGet和HttpPost 1.2使用HttpGet时分为7步: A. 创建HttpClient对象,由于HttpClient是抽象类,所以一般...
  • std::map的使用方法

    千次阅读 2016-08-12 18:28:41
    std _map 的使用方法
  • ResultSet 中的getString 方法用法

    千次阅读 2019-01-28 15:50:27
    ResultSet 中的getString 方法用法
  • TrueCrypt使用方法及详细教程介绍

    万次阅读 2018-03-04 11:26:30
    TrueCrypt使用方法及详细教程介绍TrueCrypt是一款非常好用的免费开源加密软件,目前,有很多网友都不知道TrueCrypt的使用方法及相关信息,针对此类问题,本文就为大家图文详细介绍TrueCrypt的使用方法及安装教程,...
  • DBGRIDEH 用法指南

    2012-02-18 16:22:48
    DBGRIDEH 在Delphi中被广大编程爱好者广泛使用,其功能在原delphi 自带的dbgrid基础上做了较大的扩展,是目前比较成熟且稳定的控件之一,本文是一篇较详细的用法介绍指南,整篇85页内容,涵盖大部分常用功能,文章...
  • Netmeeting使用方法

    万次阅读 2006-08-11 23:27:00
    使用方便,无需注册就可以随意使用.Netmeeting功能强大,除了语音,视频,它还有如下功能:文字聊天,电子白板,文件传送,程序共享等等.新手入门:1 ,第一次运行Netmeeting,程序位置是:"开始-〉程序-〉附件-〉通讯".要是找...
  • sql中limit使用方法

    千次阅读 2017-12-16 18:33:42
    从第二行输出,输出2行 注意,0标识第一行,如 limit 0,2 此处以mysql为例,但是我相信物以变通在oracle上也一定适用 1、下面是几种limit的方法:原则看看下面几个例子应该就...
  • matlab stem 函数使用方法

    万次阅读 2018-04-20 19:55:12
    例子:N=[0 1 2 3 4 5 6 7 8 9 10 11 12 ];X=[0 1 2 3 1 0 -1 -2 -3 -4 -5 1 2];M=N';subplot(2,2,1),stem(N...显示如图:N是序列号 即从0到12号13个数,注意必须和X中的数的个数相同,不匹配的话会提示错误;若只...
  • WebBrowser用法总结

    千次阅读 2017-08-22 16:57:17
    WebBrowser用法总结
  • MOS管的使用方法

    2020-03-20 14:17:42
    1、三个极的判定 栅极(G):中间抽头 ...使用时,D极接输入,S极接输出。 P沟道:箭头背向G极。使用时,S极接输入,D极接输出。 3、寄生二极管判定 N沟通:由S极指向D极 P沟道:由D极指向S极 一句话:不论...
  • NIKTO介绍及使用方法

    万次阅读 2018-08-29 13:35:08
    NIKTO使用方法: 1、 命令:nikto -update #升级,更新插件; 2、 Nikto -list-plugins #查看插件; 3、 Nikto -host http://1.1.1.1 #扫描目标:域名方式; 4、 Nikto -host http://1.1.1.1 -...
  • RedisTemplate 用法

    万次阅读 多人点赞 2018-01-23 17:01:38
    如何使用RedisTemplate访问Redis数据结构 Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)...
  • #include的使用方法

    千次阅读 2018-10-23 09:57:46
    另外写一下文件包含命令的使用方法:   1、当一个文件被包含时,其中所包含的代码继承了 include 所在行的 变量范围 。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含...
  • mybatis generator 使用方法教程

    千次阅读 2018-05-09 19:01:59
    参考:http://www.jb51.net/article/121482.htm1.selectByExample和selectByExampleWithBLOBs的区别(包含Example的使用)?1234567891011121314151617181920212223@Test public void testQueryStudentExample() { ...
  • Bus Hound 的使用方法

    千次阅读 2017-09-14 17:36:52
    原文地址::http://www.cnblogs.com/ChYQ/p/5371806.html 相关文章 1、如何查看BUSHOUND内容----... 2、bushound使用说明----https://wenku.baidu.com/view/ded529eea6c30c
  • AspNetPager分页控件使用方法

    千次阅读 2012-12-08 09:20:47
    今天做项目时学会一种新控件AspNetPager.dll用法,很想把这方面的经验和大家分享一下,欢迎大家一起进来讨论讨论! 一、前台显示界面代码Default.aspx(注意,代码运行环境是VS.2005) @Page Language="C#...
  • 舵机的使用方法和一些注意事项

    千次阅读 多人点赞 2020-04-16 22:26:40
    下面我们就来看一看舵机的使用方法和一些使用过程中的注意事项: 一般的舵机总共有三条线:电源线(供电线)和信号线,其中红色的是电源正极,黑色或者褐色是电源的负极,橙色或者白色是信号线: 接线方法:电源...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 361,293
精华内容 144,517
关键字:

共用法