C——Linux下的串口编程

C——Linux下的串口编程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baweiyaoji/article/details/72885633

之前在学习安信可A7模块时,是在PC上使用串口调试助手做了GPS的坐标数据信息的采集,同时分析了一些语句的含义。在这过程中,涉及到对嵌入式开发人员一个非常重要的知识:串口通信。在前篇也说到,我们将会自己写程序来对GPS数据进行解析,而这些数据正是靠串口来传输的。所以,本篇博文将进行关于串口通信的学习。

一、串口接头

首先我们得知道串口长什么样,常用的串口接头有两种,一种是9针串口(简称DB-9),一种是25针串口(简称DB-25)。每种接头都有公头和母头之分,其中带针状的接头是公头,而带孔状的接头是母头。
以DB9为例,如图:
C——Linux下的串口编程_第1张图片
各个针脚功能说明:
C——Linux下的串口编程_第2张图片
在TXD和RXD数据线上:
  (1)逻辑1为-3~-15V的电压
  (2)逻辑0为3~15V的电压
在RTS、CTS、DSR、DTR和DCD等控制线上:
  (1)信号有效(ON状态)为3~15V的电压
  (2)信号无效(OFF状态)为-3~-15V的电压
这是由通信协议RS-232C规定的(请看后文)。

注:一般我们需要的就是2,3,5接口,连接时是TXD接RXD,RXD接TXD,GND接GND。自己的TXD口接RXD口,自发自收,测试串口是否正常。

二、串口通信基础知识

OK,知道了串口的样子了,接下来就要更进一步,学习串口通信的基础知识了。

1、什么是串口通信?

串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。

2、串口通信协议

在串口通信中,常用的协议包括RS-232、RS-422和RS-485。
•RS-232:标准串口,最常用的一种串行通讯接口。有三种类型(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是RS-232C,它将mark(on)比特的电压定义为-3V到-12V之间,而将space(off)的电压定义到+3V到+12V之间。传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。
•RS-422:最大传输距离为1219米,最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。
•RS-485:从RS-422基础上发展而来的,最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。

3、同步通信?异步通信?

同步通信:是一种比特同步通信技术,要求发收双方具有同频同相的同步时钟信号,只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后便在同步时钟的控制下逐位发送/接收。如:SPI总线。
异步通信:指两个互不同步的设备通过计时机制或其他技术进行数据传输。也就是说,双方不需要共同的时钟。发送方可以随时传输数据,而接收方必须在信息到达时准备好接收。如:串口(UART)。
接下来在后续的串口编程中讨论的都是异步通信,所以对同步通信不做过多的赘述了。
这里提一下UART和USART,实际上,从字面意思即可理解:
UART:universal asynchronous receiver and transmitter(通用异步收/发器)。
USART:universal synchronous asynchronous receiver and transmitter(通用同步/异步收/发器)。
USART在UART基础上增加了同步功能,即USART是UART的增强型。
我常使用的S3C2440上就是支持的UART。

3、通信方式

•单工模式(Simplex Communication):单向的数据传输。通信双方中,一方为发送端,一方则为接收端。信息只能沿一个方向传输,使用一根传输线。双方是固定的。
•半双工模式(Half Duplex):通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。
•全双工模式(Full Duplex)通信允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。

4、数据格式

我们有必要先弄清楚异步通信的数据格式。
C——Linux下的串口编程_第3张图片
(1)起始位:起始位必须是持续一个比特时间的“0”,标志传输一个字符的开始。
(2)数据位:数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定,一般可以是5位、7位或8位。传输数据时先传送字符的低位,后传送字符的高位。
(3)奇偶校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个“1”;如果是偶校验,需要保证传输的数据总共有偶数个“1”。
  举例来说,假设传输的数据位为01001100,如果是奇校验,则奇校验位为0(要确保总共有奇数个1),如果是偶校验,则偶校验位为1(要确保总共有偶数个1)。
  由此可见,奇偶校验位仅是对数据进行简单的置逻辑高位或逻辑低位,不会对数据进行实质的判断,这样做的好处是接收设备能够知道一个位的状态,有可能判断是否有噪声干扰了通信以及传输的数据是否同步。
(4)停止位:停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是“1”,标志着传输一个字符的结束。
(5)空闲位:空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。

好了,一些基础知识暂时先到这里,更深入的知识得自己自行了解了,接下来便是重头戏,在Linux下的串口编程了。

===========================================
这里同时可以参考我之前的博文:STM8串口 (有相关经验的话)。对比一下两者的区别来进行学习。

===========================================

1、首先是操作串口需要包含的头文件:

#include    /*标准输入输出的定义*/
#include   /*错误号定义*/
#include 
#include   /*文件控制定义*/
#include     /*PPSIX 终端控制定义*/
#include  /*标准函数库定义*/
#include 
#include  /*UNIX 标准函数定义*/
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、串口相关操作
打开串口:
我们都知道,在Linux下,除了网络设备,其余的都是文件的形式。串口设备也一样在/dev下。
这里写图片描述
所以我们可以通过open系统调用/函数来访问它。
示例:fd = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY);
O_NOCTTY:可以告诉Linux这个程序不会成为这个端口上的“控制终端”.如果不这样做的话,所有的输入,比如键盘上过来的Ctrl+C中止信号等等,会影响到你的进程。
O_NDELAY:标志则是告诉Linux,这个程序并不关心DCD信号线的状态——也就是不关心端口另一端是否已经连接。

读写串口:
与普通文件一样,使用read,write函数。
示例:read(fd,buff,8);
write(fd,buff,8);

串口属性设置:
最基本的设置串口包括波特率设置,效验位和停止位设置。这由通信双方协定。

很多系统都支持POSIX终端(串口)接口.程序可以利用这个接口来改变终端的参数,比如,波特率,字符大小等等.要使用这个端口的话,你必须将头文件包含到你的程序中。这个头文件中定义了终端控制结构体和POSIX控制函数。

最重要的就是这个结构体:

struct termios
      {
      tcflag_t  c_iflag;  //输入选项
      tcflag_t  c_oflag;  //输出选项
      tcflag_t  c_cflag;  //控制选项
      tcflag_t  c_lflag;  //行选项
      cc_t      c_cc[NCCS]; //控制字符
      }; 
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其中我们更关注的是c_cflag控制选项。其中包含了波特率、数据位、校验位、停止位的设置。
它可以支持很多常量名称其中设置数据传输率为相应的数据传输率前要加上“B”。
c_cflag成员不能直接对其初始化,而要将其通过与、或操作使用其中的某些选项。
设置串口属性主要是配置termios结构体中的各个变量,大致流程如下:

1.使用函数tcgetattr保存原串口属性
struct termios newtio,oldtio;
tcgetattr(fd,&oldtio);

2.通过位掩码的方式激活本地连接和接受使能选项:CLOCAL和CREAD
newtio.c_cflag | = CLOCAL | CREAD;

3.使用函数cfsetispeed和cfsetospeed设置数据传输率
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);

4.通过位掩码设置字符大小。
newtio.c_cflag &= ~CSIZE;
newtio.c_cflag |= CS8;

5.设置奇偶效验位需要用到两个termios中的成员:c_cflag和c_iflag。首先要激活c_cflag中的校验位使能标志PARENB和是否进行奇偶效验,同时还要激活c_iflag中的奇偶效验使能。
设置奇校验:
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
设置偶校验:
newtio.c_iflag |= (INPCK|ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag |= ~PARODD;

6.激活c_cflag中的CSTOPB设置停止位。若停止位为1,则清除CSTOPB;若停止位为0,则激活CSTOPB。
newtio.c_cflag &= ~CSTOPB;

7.设置最少字符和等待时间。在对接收字符和等待时间没有特别要求的情况下,可以将其设置为0。
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;

8.调用函数”tcflush(fd,queue_selector)”来处理要写入引用的对象,queue_selector可能的取值有以下几种。
TCIFLUSH:刷新收到的数据但是不读
TCOFLUSH:刷新写入的数据但是不传送
TCIOFLUSH:同时刷新收到的数据但是不读,并且刷新写入的数据但是不传送。

9.激活配置。在完成配置后,需要激活配置使其生效。使用tcsetattr()函数。
int tcsetattr(int filedes,int opt,const struct termios *termptr);

最后贴出串口配置的完整代码:

/*********************************************************************************
  *      Copyright:  (C) 2017 TangBin
  *                  All rights reserved.
  *
  *       Filename:  s_uart1.c
  *    Description:  This file 
  *                 
  *        Version:  1.0.0(06/04/2017)
  *         Author:  TangBin 
  *      ChangeLog:  1, Release initial version on "06/04/2017 07:51:59 PM"
  *                 
  ********************************************************************************/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


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;
     }
     bzero(&newttys1,sizeof(newttys1));
     newttys1.c_cflag|=(CLOCAL|CREAD ); /*CREAD 开启串行数据接收,CLOCAL并打开本地连接模式*/

     newttys1.c_cflag &=~CSIZE;/*设置数据位*/
     /*数据位选择*/   
     switch(nBits)
     {
         case 7:
             newttys1.c_cflag |=CS7;
             break;
         case 8:
             newttys1.c_cflag |=CS8;
             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);/*打开输入奇偶校验并去除字符第八个比特*/
             newttys1.c_cflag &= ~PARODD;/*启用偶校验*/
             break;
         case 'N': /*无奇偶校验*/
             newttys1.c_cflag &= ~PARENB;
             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;
        default:
            cfsetispeed(&newttys1, B9600);
            cfsetospeed(&newttys1, B9600);
            break;
    }
     /*设置停止位*/
    if( nStop == 1)/*设置停止位;若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB*/
    {
        newttys1.c_cflag &= ~CSTOPB;/*默认为一位停止位; */
    }
    else if( nStop == 2)
    {
        newttys1.c_cflag |= CSTOPB;/*CSTOPB表示送两位停止位*/
    }

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

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

    return 0;
}

   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113

下一篇将具体结合GPS的数据解析,便能更好从整体上理解、学习了。

阅读更多
Python全栈 学完需要多少钱?
零基础学爬虫,你要掌握学习那些技能?需要学多久?

1、什么是串口通信

串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
串口是一种接口标准…

来自: 遥望盼望,能像清风陪伴她飘去




			
			
    
		


    
		

 /声明:本人只是见到这篇文章对我帮助很大才转载的,但是这个完整的程序里面本来有语法错误的,现在让我改过来了/
—…

来自: 见习馒头



		


    
		


    
		

泰安出了一位股市怪才,炒股2年他只靠1不败铁律,赚爆了 东正金融 · 燨燚
		

串口通信流程图
下面我会一一介绍这几个步骤。
1.打开串口
代码(串口为ttyUSB0)
//打开串口
int open_port(void)
{
in…

来自: specialshoot的博客



		
    
		

http://blog.csdn.net/fengyuwuzu0519/article/details/72846205
内核中已经默认支持了串口,启动…

来自: 风雨无阻



          
xxgxgx关注
xxgxgx

132篇文章

排名:22022

SwhiteDev关注
SwhiteDev

15篇文章

排名:409842

Lasuerte关注
Lasuerte

92篇文章

排名:83697

Tonygao11关注
Tonygao11

20篇文章

排名:224584

cfgetospeed函数来完成的。
  cfsetospeed函数…

来自: 陈龙的专栏



		

串口简介
串 行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用…

来自: 稻草人的专栏



这个长长的东西,用它泡水喝,强力补肾! 舜飞
		


    
		

[展开]文章目录

在工业控制中,工控机(…

来自: songshu5555的专栏



		


    
		

http://www.adamjiang.com/pukiwiki/index.php?Linux%E4%B8%B2%E5%8F%A3%E7%BC%96%E7%A8%8B%E…

来自: linuxheik的专栏



		

GNU/Linux程序开发

作者:李迟   

http://www.latelee.org/programming-u…

来自: 专注的力量



泰安51岁股市奇才,炒股2年靠1个铁律,赢数千万身家! 潮望 · 燨燚
		


    
		

typedef struct _DCB {
DWORD DCBlength;
DWORD BaudRate;
DWORD fBinary: 1;
DW…

来自: 一蓑烟雨任平生 也无风雨也无晴



		

 发表于 2017-01-29 |  分类于 树莓派 |  暂无评论 |  阅读次数 54

引言
本文转载自: 
http://etrd.org/20…

来自: qq_31396093的博客



		

    之前要做一个和串口相关的项目,才认真研究了下串口,…

来自: tanqiuwei的专栏



		

买了就跌?卖了就涨?空仓手痒?这篇文章可能帮的到你! 陕西信息科技 · 燨燚
		

串口是一种非常通用的设备通信的协议(不要与通用串行总线Universal Serial Bus(USB)混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信…

来自: guomutian911的专栏



		
  1. 打开串口

  2. 设置串口

  3. 发送、接收数据

  4. 关闭串口…

    来自: elaine_bao的专栏



     		
    
    
     
     		
    
    
     
     		
    
    良心分享泰安股王8年不亏铁律“七不买”口诀! 陕西信息科技 · 燨燚
			


    
			


    
		

2.linux手册参考
3.详解linux下的串口通讯开发
在linux下所有的设备都是文件,串口也不例外,所以对串口的操作也是open,close,write,read这几个操…

来自: flfihpv259的博客



		

http://blog.chinaunix.net/u1/52454/showart_507112.html
在嵌入式Linux中,串口…

来自: Stoneshen的博客



		

阻塞的定义:
       对于read,block指当串口输入缓冲区没有数据的时候,read函数将会阻塞在这里,一直到串口输入缓冲区中有数据可读取,read读到了需要…

来自: storyteller的博客



泰安老股民炒股20年,不搞合作不分成,9点前送牛股 东正金融 · 燨燚
		

struct termios {  
    tcflag_t c_iflag;       /* input mode fla…

来自: Shanks



		

Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比较的复杂,就直接跳过了,好在代码能用,记录…

来自: zhx862012的专栏



		

cfsetospeed函数


来自: xueyuehanzhu123的专栏



		


    
		

聪明的女人从不买面膜,睡前用它擦一擦,皱纹消失显年轻! 久扬商贸 · 燨燚
		

· 并行通信是指利用多条数据传输线将一个资料的各位同时传送。它的特点是传输速度
快,适用于短距离通信,但要求传输速度较高的应用场合。
· 串行通信…

来自: zgrjkflmkyc的专栏



		

http…

来自: 常用网址:http://www.w3school.com.cn



		

下载:sudo apt-get install cutecom
打开:sudo cutecom

查看电脑链接的端口信息:dmesg | grep ttyS*


来自: Tansir94的博客



		


    
			

vspace="0" hspace="0" scrolling="no" allowfullscreen="true" id="aswift_0" width="962" height="73">

			


    
		

#include
#include
#include
#include
#include
#include
#include
#i…

来自: xxgxgx的专栏



			


    
		

系统,人机交互接口是板子上的一个串口。输入命令时,当长度大于8时,发现read读取到的数据是分多次得到的(串口用非阻塞模式读取数据),比如输入的字符长度为25…

来自: coding__madman的博客



		

我的linux是Ubuntu10.10,采用的是VMw…

来自: abcdefg的专栏



vspace="0" hspace="0" scrolling="no" allowfullscreen="true" id="aswift_1" width="962" height="93">

		

前言:本章将正式讲解串口编程技术,利用一个串口收发数据的程序,来分步讲解。

注意:您可以下载我的源代码进行参考。

打开串口

反馈与建议



来自: AnSwEr不是答案



			


    
		


    
		

一、前言

        上一章节我们说的是swagger-ui也就是swagger1,接下来我们说的是swagger升级版swagger2

    …

来自: 愤怒的懒洋洋的博客



		


    
		

转载请标明出处: http://blog.csdn.net/forezp/article/details/70148833
本文出自方志朋的博客

错过了这一篇,你可能再也学不会 Sp…

来自: 方志朋的专栏



		

方法一:(更新时间:2018/4/8)v3.3

注册时,在打开的Lice…

来自: 唐大帅的编程之路



		

下载地址https://s3.amazonaws.com/psiphon/web/mjr4-p23r-puwl/zh/download.html#direct

 …

来自: www.mayixiaocao.cn



		


    
		

因公司的需求,需要做一个爬取最近上映的电影、列车号、航班号、机场、车站等信息,所以需要我做一个爬虫…

来自: 昌昌



		


    
		

现在越来越流行在线看视频了,但是对于我得收藏癖爱好者,还是希望可以有比较好的资源网站的,尤其是种子、磁力链网站。所以就整理了一份干净、好用的TOP10出来:

先推荐一个下载磁力链的工具:

马…

来自: YXAPP的技术分享



		


    
		


    
		

vue-cli3脚手架/单文件/环境搭建。vue3.x版本相对于2.x版本做了许多地方的优化,个人总结主要还是使用上使开发者更加一目了然,配置起来也更加的方便,减少了各种webpack里面的lo…

来自: 欢迎来到☆槿畔☆的博客



		

1.1 解释:当一次服务调用失败后,不会立即抛出异常,而是再次重试另一个服务。
1.2 实现步骤:

在服务调用端配置文件中开启重试机制

spring:
cloud…

来自: 猪精的博客



		

一、前言

        MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置…

来自: 愤怒的懒洋洋的博客



		

一、前言

        Sql是最重要的关系数据库操作语言,现在基本上任何与数据库相关的操作都离不开sql。所以说sql功能是很强大的。

        但是Sql对表的操作…

来自: 愤怒的懒洋洋的博客



		


    
		

一、前言

Sql是最重要的关系数据库操作语言,现在基本上任何与数据库相关的操作都离不开sql。所以说sql功能是很强大的。

我们常用的sql关键字不外乎 group by…

来自: 愤怒的懒洋洋的博客



		


    
		

V2.6B4 绿色版人气:42008
下载

Microsoft Toolkit(Win10激活工具/…

来自: 老K的博客



		

最新版的Proxyee-down为3.12(2018.10更新),因为作者在3.x后的版本中并未发布exe版…

来自: shadandeajian的博客



		

1
【单选题】我国陆地领土面积排名世界第几?(C)
A、1
B、2
C、3
D、4
2
【单选题】以下哪个国家不属于金砖五国(BRICS)?(B)
A、中国
B、日本
C…

来自: ling_wang的博客



		

思路就是1.获得点击左键时当前鼠标的坐标 2.获得移动后鼠标的坐标 3.窗体的坐标=移动后的鼠标坐标-移动前的鼠标坐标

pr…

来自: Maybe_ch的博客



		

问题总结:
在Windows平台下如果PHP使用的是IIS的话那么php在上传文件时是先将文件上传到一个临时目录下的


来自: psw的博客



		


    
		

这个星期装服务器,搞了一个集群,服务器是双网卡,一个网卡连外网222开头,一个网卡连内网192开头,在系统等一切都安全成功,网络配置成功之后,奇怪的事情发生了,内网内任意一台…

来自: u013042928的博客



		


    
		
来自: cong666的博客
		

*创建型模式(4种):工厂方模式,单例模式,建造者模式,原型模式
*结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式


来自: Armymans的博客



		


    
		


    
		

百度网盘不限速 点击下载 提取码:jsk0
对于大多数人来说,每次在百度网盘下载东西的时候总会被限速,如果不想被限速就要充值百度网盘的SVIP,…

来自: qq_41925894的博客



		

下载OTP工具
首先到Office Too…

来自: 过了即是客



		

2018年的到来还伴随着GFW的全面升级,不少装有ssr的境外vps被大量屏蔽,搬瓦更是重灾区,而V2ray是新一代的科学上网神器。

一. 下载与安装V2…

来自: xuhuo的博客



		

DirectX修复工具最新版:DirectX Repair V3.7 增强版  NEW!

版本号:V3.7.0.26539

大小: 107MB/7z格式压缩,18…

来自: VBcom的专栏



		

1
【单选题】中国哪个历史时期的国防是“变法图强,改革军制;奖赏军功,百家论兵”?()
A、元朝时期
B、先秦时期
C、清朝时期


来自: ling_wang的博客



		


    
		

我也有幸…



		

近日恰逢双十一,瞅了瞅自己干瘪的钱包,没忍心入手期待已久的 macPro,只好在虚拟机里玩一下 mac好了,等以后钱包傲气的时候再来个真实的。
安装环境:
windows10 VM…

来自: u011415782的专栏



		


    


        

没有更多推荐了,返回首页

你可能感兴趣的:(c语言,Linux)