Linux的串口非标准波特率设置更改

用的是全志的R528 SDK,Linux内核是5.4,新增加一个250000的非标准波特率

参考网络大神文档,实践并记录宝贵的经验。

方法:

1、修改内核的/include/uapi/asm-generic/termbits.h文件

这个CBAUD原来是0010017改为0030017,是用来做掩码计算的。

 

  图1

这两个是新加的

 

 

  图2

 这个头文件一共更改这三个地方。先说为什么增加波特率使用0020001而不在B4000000后面递增使用0010020,这是因为这个低位的20已经被占用了,

如下图3,所以找了没被占用的位置,0020000的中2这个bit位置在c_cflag中没被占用(c_cflag是用于设置波特率和其他一些信息的)。

第一处的0030017也是这个原因,就是将波特率使用的这些宏定义包含进去。

 

  图3

2、/drivers/tty/tty_baudrate.c文件

这个文件就是获取波特率具体数值的文件,应用端的数据传入到内核,内核解析并获得250k波特率这个数值就是在这个文件,

先在文件

头部的波特率列表中增加所需数值,如图4,其中的250000和B250000为新增加。

 

  图4

 修改函数speed_t tty_termios_baud_rate(struct ktermios *termios),图5

 

   图5

其中圈起来的地方是新加的,这就是根据刚才新加的部分进行波特率修改,新的0020001,与CBAUDEX2进行运算判断高位位置,

之所以cbaud+=30是因为前面已经有了30个波特率了,见图5。这样内核就修改完了。

最后重新编译内核, 重新烧录系统镜像。

 

3、应用程序测试验证

应用端的配置,应用端通常使用tcsetattr这个函数进行配置,在使能之前,对齐c_cflag进行赋值就可

struct termios , termios_new;

termios_new.c_cflag |= 0020001;

(其余配置省略)

tcsetattr(fdcom, TCSANOW, &termios_new);

这里说一下为什么不能使用cfsetispeed、cfsetospeed 函数。

因为这两个函数只能指定原来标准的波特率,设置我们非标准的0020001的时候就会设置失败

       //ret = cfsetispeed(&newttys1, 0020001);
            //printf("reti = %d\n",ret);
            //ret = cfsetospeed(&newttys1, 0020001);        
            //printf("reto = %d\n",ret);

 

应用层测试代码

baud_test.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include "uart_oper.h"


#define UART1_DEV_NAME  "/dev/ttyS1"  /*需根据实际端口修改*/
#define BUF_LEN 100


int main(int argc,char const * argv[])
{

    int fd =-1,ret =-1;
    char buff[BUF_LEN]={0};
    int i =0;
    int n =0;
    int len = BUF_LEN;
    int baud = 0;
    if(argc !=2)
    {
        printf("arg is not 2\n");
        return -1;    
    }
    baud = atoi(argv[1]);
    printf("baud =%d\n",baud);
    fd = open(UART1_DEV_NAME, O_RDWR | O_NOCTTY | O_NDELAY);
    if(fd < 0)
    {
        perror("Can't open uart1 port");
        return(void *)"uart1 dev error";
    }
    ret = set_serial(fd,baud, 8, 'N', 1); /*可能需要根据情况调整*/
//    ret = set_serial(fd, 115200, 8, 'N', 1); /*可能需要根据情况调整*/
    if(ret < 0)
    {
        printf("set_serial error\n");
        return -1;    
    }

    for(i =0 ;i<100;i++)
    {
        buff[i] =0x55;
    }


    while(1)
    {
        n = write(fd, buff, len);
        printf("n =%d\n",n);
        if(n < 0)
        {
                printf("send write error\n");
                sleep(1);
                return -1;
        }
        sleep(1);
        
    }


    return 0;
}



uart_oper.c
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include "uart_oper.h"

/**
*@brief  配置串口
*@param  fd:串口文件描述符. 
         nSpeed:波特率,
         nBits:数据位 7 or 8, 
         nEvent:奇偶校验位,
         nStop:停止位
*@return 失败返回-1;成功返回0;
*/

int set_serial(int fd, int nSpeed, int nBits, char nEvent, int nStop)
{
    struct termios newttys1, oldttys1;

    /*保存原有串口配置*/
    if(tcgetattr(fd, &oldttys1) != 0)
    {
        perror("Setupserial 1");
        return - 1;
    }

    memset(&newttys1, 0, sizeof(newttys1));
    /*CREAD 开启串行数据接收,CLOCAL并打开本地连接模式*/
    newttys1.c_cflag |= (CLOCAL | CREAD);

    newttys1.c_cflag &=~CSIZE; /*设置数据位*/
    switch(nBits)    /*数据位选择*/
    {
        case 7:
            newttys1.c_cflag |= CS7;
            break;
        case 8:
            newttys1.c_cflag |= CS8;
            break;
        default:break;
    }
    
    switch(nEvent)  /*奇偶校验位*/
    {
        case '0':
            newttys1.c_cflag |= PARENB; /*开启奇偶校验*/
            newttys1.c_iflag |= (INPCK | ISTRIP); /*INPCK打开输入奇偶校验,ISTRIP 去除字符的第八个比特*/
            newttys1.c_cflag |= PARODD; /*启动奇校验(默认为偶校验)*/
            break;
        case 'E':
            newttys1.c_cflag |= PARENB; /*开启奇偶校验*/
            newttys1.c_iflag |= (INPCK | ISTRIP); /*INPCK打开输入奇偶校验,ISTRIP 去除字符的第八个比特*/
            newttys1.c_cflag &= ~PARODD; /*启动偶校验*/
            break;
        case 'N':
            newttys1.c_cflag &= ~PARENB; /*无奇偶校验*/
            break;
        default:break;
    }
    
    switch(nSpeed) /*设置波特率*/
    {
        case 2400:
            cfsetispeed(&newttys1, B2400);
            cfsetospeed(&newttys1, B2400);
            break;
        case 4800:
            cfsetispeed(&newttys1, B4800);
            cfsetospeed(&newttys1, B4800);
            break;
        case 9600:
            cfsetispeed(&newttys1, B9600);
            cfsetospeed(&newttys1, B9600);
            break;
        case 115200:
            cfsetispeed(&newttys1, B115200);
            cfsetospeed(&newttys1, B115200);
            break;
        case 250000:
            //ret = cfsetispeed(&newttys1, 0020001);
            //printf("reti = %d\n",ret);
            //ret = cfsetospeed(&newttys1, 0020001);        
            //printf("reto = %d\n",ret);
            newttys1.c_cflag |= 0020001;
            break;
        default :
            cfsetispeed(&newttys1, B9600);
            cfsetospeed(&newttys1, B9600);
            break;
    }
    
    /*设置停止位*/
    /*停止位为1,则清除CSTOPB,如停止位为2,则激活CSTOPB*/
    if(nStop == 1)
    {
        newttys1.c_cflag &= ~CSTOPB;  /*默认为停止位1*/
    }
    else if(nStop == 2)
    {
        newttys1.c_cflag |= CSTOPB;
    }

    /*设置最少字符和等待时间,对于接收字符和等待时间没有特别的要求时*/
    newttys1.c_cc[VTIME] = 0; /*非规范模式读取时的超时时间*/
    newttys1.c_cc[VMIN] = 0; /*非规范模式读取时的最小字符数*/
    
    /*tcflush 清空终端未完成的输入、输出请求及数据
    TCIFLUSH表示清空正接收到的数据,且不读取出来*/
    tcflush(fd, TCIFLUSH);

    /*激活配置使其生效*/
    if((tcsetattr(fd, TCSANOW, &newttys1)) != 0)
    {
        perror("usart set error");
        return - 1;
    }

    return 0;
} 

uart_oper.h
#ifndef __UART_OPER_H__
#define __UART_OPER_H__

int set_serial(int fd, int nSpeed, int nBits, char nEvent, int nStop);

#endif

编译

arm-openwrt-linux-gcc -c baud_test.c 生成  baud_test.o

arm-openwrt-linux-gcc -c uart_oper.c 生成  uart_oper.o

arm-openwrt-linux-gcc -o tt  baud_test.o  uart_oper.o  连接到一起生成tt测试程序

备注当直接执行arm-openwrt-linux-gcc baud_test.c -o tt 的时候报错,找不到uart_oper.h中的函数。

将tt 拷贝到系统中。

终端执行tt 250000

之后用示波器测串口发出的波形。

 

 

波特率传送速率计算:

一、波特率为9600表示的是串口每秒钟可以传输9600bit,每传输1bit所需时间:
1 s / 9600 b i t = 1000000 ( u s ) / 9600 ( b i t ) = 1000 / 9.6 = 104.1667 u s 1s/9600bit = 1000000(us)/9600(bit) =1000/9.6 =104.1667us1s/9600bit=1000000(us)/9600(bit)=1000/9.6=104.1667us
那么8bit就是 104.1667 ∗ 8 = 833.3336 u s 104.1667*8 =833.3336us104.1667∗8=833.3336us
实际项目中,串口通信时数据格式是:起始位+8位数据+奇偶校验位+停止位 ,一般都没有奇偶校验位,所以是10位
也就是一个字节的时间为 104.1667 ∗ 10 = 1041.667 u s 104.1667*10 =1041.667us104.1667∗10=1041.667us
二、波特率为19200每传输1bit所需时间:
1 s / 19200 b i t = 1000000 ( u s ) / 19200 ( b i t ) = 1000 / 19.2 = 52.0833 u s 1s/19200bit=1000000(us)/19200(bit) =1000/19.2 =52.0833us1s/19200bit=1000000(us)/19200(bit)=1000/19.2=52.0833us
三、波特率115200每传输1bit所需时间:
1 s / 115200 b i t = 1000000 ( u s ) / 115200 ( b i t ) = 1000 / 115.2 = 8.6806 u s ; 1s/ 115200bit = 1000000 (us)/ 115200(bit)= 1000/115.2 = 8.6806us;1s/115200bit=1000000(us)/115200(bit)=1000/115.2=8.6806us;
四、波特率为250000每传输1bit所需时间:

1 s / 250000 b i t = 1000000 ( u s ) / 250000( b i t ) = 1000 / 250 = 4 u s ;

从测试结果看是成功的。

 

4、终端命令行执行设置串口的命令

查询串口配置命令
uart0:
cat /sys/bus/platform/drivers/uart/2500000.uart/ctrl_info
uart 1:
cat /sys/bus/platform/drivers/uart/2500400.uart/ctrl_info

查询
root@TinaLinux:/# stty -a -F /dev/ttyS1
speed 9600 baud;stty: /dev/ttyS1
设置
stty -F /dev/ttyS1 ispeed 115200 ospeed 115200 cs8

 

 

参考资料

LINUX的串口非标准波特率更改 - 知乎 (zhihu.com)

本文转载于网络 如有侵权请联系删除

相关文章

  • 【DSP视频教程】DSP视频教程第7期:Matlab的wifi通信实现,大大方便波形数据远程分析(2022-04-22)

    本期视频教程给大家来一期Matlab的WiFi通信实现,含串口的通信实现也都做个说明。本次视频教程后,我们就对Matlab的一些常用玩法基本都熟悉了一轮。 后面就正式开始DSP算法视频教程。 视频: https://www.bilibili.com/video/BV1xY4y1a72P 本次视频分为以下几个部分: 第1部分:Matlab的WiFi通信实现 (1)实现原理。 (2)TCP通信API。 (3)下位机程序说明 (4)Matlab程序说明,注意乱码问题。第2部分:VSCode调试效果展示第3部分:Matlab的串口通信实现 (1)实现原理。 (2)串口通信API。 (3)下位机程序说明第4部分:Matlab手机版

  • 登录服务器是不是总要输入密码,了解一下免密登录吧

    Linux免密登录我们登录服务器,不管你是通过ssh,还是通过工具登录,总是需要输入用户名和密码,频繁操作太浪费时间了,这个时候就要了解一下免密登录了。下面主要给大家介绍一下免密登录的步骤,跟着操作基本就可以配置成功了,后续就可以直接登录服务器,不需要输入密码了。1.生成秘钥对首先我们需要在自己的本机上生成秘钥对,在任何一个文件夹中都可以,但是最好在自己home目录下中的.ssh文件夹中进行,这样就可以省掉后续将生成秘钥对移动到这个文件夹的操作。在mac上可以通过cd~/.ssh进入该文件夹,window的用户自行搜索吧。进入文件夹之后,通过以下命令生成秘钥对:ssh-keygen-trsa-C"你自己的名字"-f"你自己的名字_rsa"复制生成之后,你会发现多了两个文件,一个是你自己的名字_rsa,一个是你自己的名字_rsa.pub,带pub的是公钥,后续需要放到服务器上,不带pub的是秘钥,需要放到home/.ssh下,如果上面你已经进入到这个文件夹中,那我们不需要移动就可以了,可以直接跳过第二步,进行第三步的操作。如果没进入这个文件夹,那我

  • 在Ubuntu 16.04或Debian 8上安装SquirrelMail

    SquirrelMail是一个用PHP编写的webmail包,它支持SMTP和IMAP协议,并具有跨平台兼容性。SquirrelMail需要一台带有PHP的Web服务器才能正常运行。对于本指南,我们将使用Apache2.如果您还没有安装Apache和PHP,可以在Ubuntu16.04安装LAMP或Debian8安装LAMP查看我们的安装指南。注意本指南是为非root用户编写的。需要提升权限的命令必须带有前缀sudo。如果您不熟悉该sudo命令,可以查看我们的用户和权限指南。安装更新系统并从存储库安装SquirrelMail。首先,安装最新的系统更新:sudoapt-getupdate sudoapt-getupgradesudoapt-getinstallsquirrelmail安装SquirrelMail:配置虚拟主机要访问SquirrelMails的Web界面,请在Apache目录中创建并配置其默认虚拟主机配置文件的副本。配置复制文件中的设置以匹配您的Linode和域设置。SquirrelMail为Apache提供了一个默认配置文件/etc/squirrelmail/apache

  • Windows下flameshot配置

    1.简介Flameshot是一款非常好用的屏幕截图工具,而且还是一款开源的跨平台应用。个人因在Linux上习惯了Flameshot,故迁回Windows系统后也继续使用这款截图工具。2.开机自启打开Flameshot,在菜单栏找到其图标,「右键」->「配置」->「常规」,勾选「开机时启动」。3.自定义截图快捷键Flameshot内置了很多快捷键(「右键」->「配置」->「快捷键」),而且大部分是可以自定义的。但恰恰最基本的「捕获屏幕」功能默认快捷键为PrintScreen,且不能修改!这让习惯Ctrl+Alt+A截图的我无所适从。Flameshot的「捕获屏幕」功能在Linux系统上可以正常修改。 好在Windows系统有强大的第三方软件生态支持。我们可以使用AutoHotKey软件来实现自定义Flameshot「捕获屏幕」快捷键的功能。安装AutoHotKey软件;新建flameshot.ahk文件,在其内部写入以下脚本:;;flameshotremapprintscreen SendModeInput; SetWorkingDir%A_ScriptDir%;

  • 中国(温州)数安港“2022数据智能夏令营”圆满收官!

    7月7日,由中国(温州)数安港、温州市高教园区建设管理委员会主办,每日互动股份有限公司、浙江省大数据联合计算中心有限公司承办的“2022数据智能夏令营”在温州圆满收官!温州市瓯海区委常委、副区长林照光,中共温州市委党校教授任晓,温州市瓯海区大数据管理中心副主任梅拯拯等领导出席结营仪式。 2022数据智能夏令营结营合影。胡铸鑫摄 “2022数据智能夏令营”是数安港今年5月开园后举办的重要活动之一,旨在挖掘、培育“高精尖”数智人才,鼓励更多优秀人才投身数据智能领域,为温州乃至全国数字经济产业发展培育生力军。 温州市瓯海区委常委、副区长林照光为活动致辞,他表示“此次夏令营的举办,是数安港‘育人才’的起点。希望大家勇于实践,推动数据安全与创新发展。充分发挥自身的学术技术优势,为数字中国、幸福温州的建设注入源源不断的力量。” 温州市瓯海区委常委、副区长林照光为活动致辞 聚焦前沿+大咖授课,创新成果重磅揭晓 在过去的一周时间里,50余位夏令营学员在数安港完成了深度的学习和实践。超20位学术界专家、业界知名大咖组成豪华导师团,联合为学员们打造了一系列硬核专业课程,包括大数据产业法规及政策解读、网

  • [分享] 浅谈项目需求变更管理

     “项目一旦启动,变更也就随之而来。”  变更是无法避免的,作为一个合格的项目经理,我们应该有有效的方法来管理项目变更。    先来看一个小案例:    A公司正在实施一个业务系统项目,该项目包括人事行政部、信息部、业务部、财务部、生产部等多个部门人员。  系统采取外包的形式,雇佣了某知名软件B公司的10名开发人员。  系统实施时,出现了下述情况:A公司一个系统的用户向他所认识的B公司一个项目开发人员抱怨系统软件中的一项功能问题,并且表示希望能够进行修改。于是,该开发人员就直接对系统软件进行了修改,并告诉A已经解决了该项功能问题。    在分析案例的问题前,我们先看看,什么是项目变更。    当项目的某些基准发生变化时,项目的质量、成本和范围等随之发生变化,为了保证项目目标实现,就必须对项目发生的各种变化采取必要的应变措施,这种行为就是项目变更。    项目变更产生的原因是多样的。以下是一些常见原因:   (1)项目外部环境发生变化; (

  • Spring Bean 循环依赖为什么需要三级缓存

    SpringBean循环依赖为什么需要三级缓存 这里指的是单例的、非构造依赖的循环引用。很多人都知道Spring用了三层缓存来解决循环依赖,但是不知道其原因,为什么是三级缓存?二级缓存不行吗?一级缓存不可以? 三级缓存 Spring解决循环依赖的核心就是提前暴露对象,而提前暴露的对象就是放置于第二级缓存中。缓存的底层都是Map,至于它们属于第几层是由Spring获取数据顺序以及其作用来表现的。 三级缓存的说明: 名称 作用 singletonObjects 一级缓存,存放完整的Bean。 earlySingletonObjects 二级缓存,存放提前暴露的Bean,Bean是不完整的,未完成属性注入和执行初始化(init)方法。 singletonFactories 三级缓存,存放的是Bean工厂,主要是生产Bean,存放到二级缓存中。 在DefaultSingletonBeanRegistry类中: /**Cacheofsingletonobjects:beannametobeaninstance.*/ privatefinalMap<Str

  • java 提交版本意见修改

    1.接口实现类建议使用Impl结尾,可以比较直观的看出是个实现,实现接口的方法加上@Override,这样可以准确判断是否实现成功。另外,如果在接口中对方法签名进行修改,其实现类会马上编译报错。 2.RandomDP类中定义的privatestaticfinalRandomr=newRandom();如果这个类后续会有多线程访问,建议使用ThreadLocalRandom类,Random在多线程并发时,会有线程阻塞问题,性能低。 3.OutputPerturbDP实现类的方法getC没有处理逻辑,直接返回了0.0,如果是一个默认实现,可以在它实现的接口类中使用default关键字修饰方法,这样在增加其他实现类时,就不需要在重写这个方法。 4.VerticalLRMode类中有只有当前类中使用的但是声明为public的变量,变量和方法的作用域尽量小,如果是private的,后续如果不需要可以放心删除,如果是public的就需要慎重,随着工程代码量越来越大,这个问题会越来越突出。 5.VerticalLRParameter类的方法obtainPara中,使用了大量的字符串,并且其他Para

  • Zookeepr分布式协调服务之基础铺垫(大数据工程师工作笔记)

    01Zookeeper架构原理 1.定义 ZooKeeper在很多大企业里,已经证明了非常的稳定。 ZooKeeper是一种分布式应用所设计的高可用、高性能且一致的开源协调服务。它首先提供了分布式锁服务。 它的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。 由于ZooKeeper是开源的,后来者在分布式锁的基础上又提供了配置维护、组服务、分布式消息队列、分布式通知/协调等。 2.特点 1)最终一致性 客户端无论连接到哪个Server,展示给它的都是同一个视图,这是Zookeeper最重要的性能;可以理解为每个节点上都有一个内存数据库,数据都是一模一样的;2)可靠性 具有简单、健壮、良好的性能,如果消息message被一台服务器接收,那么它将被所有的服务器接收;也就是说我们将数据写到我们的集群里面,只要有一台机器接收了某一条消息,那么其他机器也能接收到,并同步过去;3)实时性 Zookeeper保证客户端将在一个时间间隔范围内,获得服务器的更新信息或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得

  • vimium快捷键

    vimium是一个chrome的插件,有了它就可以把鼠标扔了。 vimium的各种快捷键 j向下滑动 k向上滑动 gg滚动到顶部 G滚动到底部 d向下翻一页 u向上翻一页 f打开页面中的链接 T打开当前所有的标签页列表 p跳转到粘贴板里的链接地址  

  • golang 链路追踪

    Golang中主要结合jaeger和opentracing去实现链路追踪 链路追踪中的基本概念: tracer、span tracer代表了一个流程或事务在分布式系统中的执行过程,tracer由多个span构成的有向无环图,每个span代表tracer中被命名并计时的连续性执行片段 span代表系统中具有开始时间和执行时长的逻辑单元,span之间通过嵌套或者顺序排列建立逻辑因果关系 关系: 分布式追踪中的每个组件都包含自己的一个或者多个span。例如,在一个常规的RPC调用过程中,在RPC的客户端和服务端,至少各有一个span,用于记录RPC调用的客户端和服务端信息。 一个父级的span会显示的并行或者串行启动多个子span。 一个tracer过程中,各span的关系 [SpanA]←←←(therootspan) | +------+------+ || [SpanB][SpanC]←←←(SpanC是SpanA的孩子节点,ChildOf) || [SpanD]+---+-------+ || [SpanE][SpanF]>>>[SpanG]>>&g

  • HTTP无状态协议理解

    TTP协议是无状态协议。   无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。   客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。HTTP本身是一个无状态的连接协议,为了支持客户端与服务器之间的交互,我们就需要通过不同的技术为交互存储状态,而这些不同的技术就是Cookie和Session了。    Cookie是通过客户端保持状态的解决方案。从定义上来说,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。让我们说得更具体一些:当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息

  • sort 结构体 正数负数分开排序

    对于结构体排序的一点点记录,之前遇到过结构体排序,个人比较喜欢使用在结构体当中直接重载小于号的方法, 例如说: structNode{ intindex; intdel; booloperator<(constNode&b)const{ //非递减的排序 returndel<b.del; } }node[maxn];复制 知道里这一点我们就可以拿正数和负数分开了排序了,如下: structNode{ intindex; intdel; booloperator<(constNode&b)const{ //都是正数的时候,非递增排序 if(del>0&&b.del>0) returndel>b.del; //都是非正数的时候,非递减排序 if(del<=0&&b.del<=0) returndel<b.del; //正数和负数比较时,负数在前面 returndel<b.del; } }node[maxn];复制 来写个代码看看: #include<string>

  • mongo异构数据迁移

    mongo异构数据迁移 1.mysql自定义分隔符导出成csv格式 select*fromworld.cityintooutfile'/var/lib/mysql/city.csv'fieldsterminatedby','; 复制 2.手动添加CSV头部 ID,Name,CountryCode,District,Population 复制 3.mongo导入csv格式 mongoimport--host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019"--type=csv--headerline-dworld-ccity/var/lib/mysql/city.csv--drop 复制 4.CSV导入ES 背景:老大发给运维几个csv格式的文件,需要导入到ES里elasticsearch csv-->mongo mongo-->json json-->es 复制 操作命令: mongoimport--host="dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:2801

  • loadrunner 获取接口请求响应信息

    参数说明 1、REQUEST,用于提取完整的请求头信息。 2、RESPONSE,用于提取完整的响应头信息。 3、ResponseBody ,用于提取完整的响应体信息。   注意,这两个变量仅在请求前使用web_save_header注册使用。示例如下:   Action() {     //默认最大长度为256     web_set_max_html_param_len("262144");      //自定义截取字符串,根据左右字符串获取数据     web_reg_save_param("ResponseBody","LB=","RB=","Search=Body",LAST);     //REQUEST为内置变量,保存请求的头信息,需在发送URL请求前注册使用,将请求头信息存入字符串RequestHeader中   

  • PowerBuilder编程新思维3:适配(三层架构与GraphQL)

      PowerBuilder编程新思维3:适配(三层架构与GraphQL) PB在富客户端时代,是一线开发工具。随着网络发展,主流架构演进到三层架构的时代,PB拿不出有力的三层架构,已经明显力不从心,市场份额也江河日下。今天我们来细数一下PB的三层架构方式及其改进方法。   PB三层架构方式 方式一:EAServer  这是PB官方首推的三层架构,但是用三句可以总结,无感的体验,无奈的价格,无语的速度。 事实上除了EAServer这个选择,可以自己开发服务端,比如topwiz公司的PBNIServ 使用BPNI查询数据,经过自己设计的传输格式,使用BLOB将数据传到客户端。 我也尝试了Node.js插件的方式来实现,使用JS开发服务端逻辑。但是PB的单线程的模式,注定在速度与资源消耗上不能利人满意。   方式二:代码转换  这是PB传统版本最后推广的PB.net的实现方式,把PowerScript转换成JAVA或者C#,在成熟的J2EE和.NET环境中运行。这简直是官方版的《PB从入门到放弃》,结果我都不想置评。   方式三

  • 心理学书籍推荐

    第三本(自我效能感:控制的实施)美国前心理学协会班杜拉著讲的是一个人怎么建立起完成一个任务的自信心。积极心理学,成功心理学的理论基础很多都在这本书。 第四本(自我) 乔纳森-布朗的书了解自己、了解别人必看 第五本(情绪) 卡莱特著 第六本(消费者行为学)第8班迈克尔-R-所罗门著 第七本(自我导向行为)第9版 第八本(组织行为学)史蒂芬-罗宾斯的经典著作 第九本(人格科学)华东大学出版社 第十本(压力管理策略)第5版 第十二本(伯恩斯新情绪疗法)伯恩斯著 第十三本(焦虑情绪调节手册)伯恩斯著 第十四本(发展心理学—人的毕生发展)第4版费尔德曼著  

  • [转]C#多线程学习(一) 多线程的相关概念

    什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。什么是多线程?多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。多线程的好处:可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。 多线程的不利方面:线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 多线程需要协调和管理,所以需要CPU时间跟踪线程; 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;线程太多会导致控制太复杂,最终可能造成很多Bug; 接下来将对C#编程中的多线程机制进行探讨。为了省去创建GUI那些繁琐的步骤,更清晰地逼近线程的本质,接下来的所有程序都是控制台程序,程序

  • OpenFlow协议分析

    OpenFlow协议分析实验手册 启动虚拟机mininet和控制器ODL 启动wireshark,在控制器的ens32网卡抓包 使用mininet创建简单拓扑,并连接控制器,指定交换机为ovsk,指定OpenFlow协议为1.3 #mn--controller=remote,ip=192.168.79.137,port=6633--switch=ovsk,protocols=openflow13 复制 这时候就会产生OpenFlow协议的数据包,我们进入wireshark查看 ovs交换机与控制器建立TCP连接 ovs交换机与控制器协商OpenFlow版本-OFTP_HELLO 控制器查询ovs交换机特性-OFTP_FETURES_* OFTP_FEATURES_REQUEST:介绍一下你自己,ovs交换机! OFTP_REATURES_REPLY:我家住在翻斗大街翻斗花园我家容量........介绍完毕。 OFTP_BARRIER_* OFTP_BARRIER_REQUEST:上面交代的都完成了吗? OFTP_BARRIER_REPLY:完

  • 青蛙过河-sdut

    青蛙过河 TimeLimit: 1000MS MemoryLimit: 65536KB Submit Statistic ProblemDescription 1)一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,石柱L面积只容得下一只青蛙落脚,同样右岸也有一石柱R,石柱R面积也只容得下一只青蛙落脚。2)有一队青蛙从小到大编号:1,2,…,n。3)初始时:青蛙只能趴在左岸的石头L上,按编号一个落一个,小的落在大的上面-----不允许大的在小的上面。4)在小溪中有S个石柱、有y片荷叶。5)规定:溪中的每个石柱上如果有多只青蛙也是大在下、小在上,每个荷叶只允许一只青蛙落脚。6)对于右岸的石柱R,与左岸的石柱L一样允许多个青蛙落脚,但须一个落一个,小的在上,大的在下。7)当青蛙从左岸的L上跳走后就不允许再跳回来;同样,从左岸L上跳至右岸R,或从溪中荷叶、溪中石柱跳至右岸R上的青蛙也不允许再离开。问题:在已知小溪中有s根石柱和y片荷叶的情况下,最多能跳过多少只青蛙? Input 输入数据有多组,每组占一行,每行包含2个数s(s是小溪中的石柱数目

  • tf.matmul()和tf.multipy()的区别

    首先我们分析一下下面的代码: importtensorflowastf importnumpyasnp a=tf.constant([[1.,2.,3.],[4.,5.,6.]]) b=np.float32(np.random.randn(3,2)) #c=tf.matmul(a,b) c=tf.multiply(a,b) init=tf.global_variables_initializer() withtf.Session()assess: print(c.eval())复制 问题是上面的代码编译正确吗?编译一下就知道,错误信息如下: ValueError:Dimensionsmustbeequal,butare2and3for'Mul'(op:'Mul')withinputshapes:[2,3],[3,2]. 显然,tf.multiply()表示点积,因此维度要一样。而tf.matmul()表示普通的矩阵乘法。 而且tf.multiply(a,b)和tf.matmul(a,b)都要求a和b的类型必须一致。但是之间存在着细微的区别。 在tf中所有返回的tensor,不管传

相关推荐

推荐阅读