VS2010 Windows API 串口编程 (二)

news2024/12/29 14:32:44

目录

一串口通信基础      

1.1串口通信原理与特点     

1.2串口通信的传输方式     

1.3串口通信的同步技术     

1.4串行接口标准     

二 API函数实现串口通信   

2.1打开串口 

2.1.1串口是否有驱动    

2.1.2连接串口    

2.1.3串口逻辑端口号大于10无法打开问题 

2.2串口配置 

2.2.1设置缓冲区大小    

2.2.2设置串口状态  

2.2.3设置需通知的事件      

2.2.4清空缓冲区      

2.3异步接收数据     

三示例代码 

3.1连接串口并设置参数     

3.2发送与接收数据 

3.3关闭串口 

一串口通信基础

        提到串口让人想起并口,它们是计算机中两个比较重要的通信方式.

串口:也叫COM口,把字节的二进制位按位列队进行传输,每个字节占一个固定的时间长,速度慢,但是传输距离远,有9针和25针两种,是阳插座(插座中有针凸起),目前25针较少使用;Modem\鼠标\USB口\老式摄像头等都是用串口.

并口:把字节的二进制位用多条线同时传输,速度快串口8倍左右,传输距离有限,一般计算机内部数据传输用此方式,平常使用的有打印机,扫描仪等;为25针,阴插座(插座有25个针孔).

1.1串口通信原理与特点

        串行端口是CPU与串行设备间的编码转换器,当CPU经过串行端口发数据时,字节数据列队成串行位,串行端口接收数据时,串行位转换成字节数据.所以必须安装相应的驱动程序.

        串行通信有成本低的特点,而且可以在现有的电话网络上进行传输,家庭通过电话线上网即是这种方式.只要配置一个相应的通信接口,如:Modem.

1.2串口通信的传输方式

        单工:只能从一头传输到另一头,如只能从A向B传或者B向A传,如看电视,只允许电视台向电视发数据,不允许电视向电视台发数据.在单工传输方式上一般采用两个通信,一个通道传输数据,一个通道传输控制信号.

        半双工:允许互传信息,但是不能同时进行,如对讲机,A说话时,B不能说话,B说话时A不能说话.

        全双工:允许双同时通信,如讲电话.

1.3串口通信的同步技术

        物理连接建立后,需要使用一种机制使对方正确解释发送的数据,发送方安位发出数据后,接收方如何识别这些数据,并如何正确组装成正确的字节.这就需要同步技术.数据同步技术一般解决如下问题:

? 确定发送数据起始时间

? 发送数据的传输速率

? 发送数据所需的时间

? 发送时间间隔

3.1异步传输

        按字节为单位传输,异步传输方式也叫起止方式,在被传输的字节前后加起止位,起止位无信号时处于高电平,接收方检测到低电平信号表示开始接收,收到停止信号表示传输完成.

3.2同步传输

        以数据块为单位传输,在块的前后加一个特殊字节表示起止,传输效率高,线路利用率高,设备负担也大.

1.4串行接口标准

        常用标准有RS-232C,RS-485,RS-422等,其中RS-232C被广泛用于计算机串口通信.RS-232C标准要求一般线路不要超过15米.

二 API函数实现串口通信

        API函数串口编程,可采用简单的查询方式或定时方式,也可采用复杂的事件驱动方式,所谓事件驱动方式是当输入缓冲区中有数据时,将自动调用某个方法执行相应的操作.定时方式是在一定的时间间隔内判断缓冲区内有数据被写入,此方法效率不高,查询方式就更落后的一种方式.所以设计的好的串口通信程序一般用事件驱动,有实时,高效,灵活等特点.

一般编制串行通信程序分以下几个部分:

? 打开串行端口:打开通信资源,设置通信参数、设置通信事件、创建读、写事件、进入等待串口消息循环。

? 读取串行端口信息:当串口发生EV_RXCHAR(接收到字符并放入了输入缓冲区)消息后读取串口、数据传输错误处理、字符串处理如回车符、空格并相应转化成数据,如果模拟量还要进行数据检验等功能。

? 写串行端口信息:将要发送的信息写入串口,相应进行错误处理。

? 断开串行端口连接:关闭事件,清除通信事件,丢弃通信资源并关闭。

2.1打开串口

2.1.1串口是否有驱动

        如何判断PC机中串口是否正常,驱动是否安装,串口名(逻辑端口名)是多少.如果PC机有串口同时驱动正常,那么在注册表的HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP目录下,包含字符"Serial"或"VCom"项下面的值就是,可以有多项,如下图:

项SERIALCOMM下有一个值----COM11,表明有一个可用串口,如果目录下包含字符Serial或VCom的项下没有任何值,表明没有串口或者驱动不正常.以下是获取串口逻辑名的代码:

#define MAX_KEY_LENGTH   255

#define MAX_VALUE_NAME  16383

HKEY hTestKey;

if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hTestKey) ){

        TCHAR   achClass[MAX_PATH] = TEXT(""); // buffer for class name

        DWORD   cchClassName = MAX_PATH; // size of class string

        DWORD   cSubKeys=0;                  // number of subkeys

        DWORD   cbMaxSubKey;             // longest subkey size

        DWORD   cchMaxClass;             // longest class string

        DWORD   cValues;             // number of values for key

        DWORD   cchMaxValue;         // longest value name

        DWORD   cbMaxValueData;      // longest value data

        DWORD   cbSecurityDescriptor; // size of security descriptor

        FILETIME ftLastWriteTime;     // last write time

        DWORD i, retCode;

        TCHAR achValue[MAX_VALUE_NAME];

        DWORD cchValue = MAX_VALUE_NAME;

        // Get the class name and the value count.

        retCode = RegQueryInfoKey(

                  hKey,                   // key handle

                  achClass,               // buffer for class name

                  &cchClassName,          // size of class string

                  NULL,                   // reserved

                  &cSubKeys,              // number of subkeys

                  &cbMaxSubKey,           // longest subkey size

                  &cchMaxClass,           // longest class string

                  &cValues,               // number of values for this key

                  &cchMaxValue,           // longest value name

                  &cbMaxValueData,        // longest value data

                  &cbSecurityDescriptor,  // security descriptor

                  &ftLastWriteTime);      // last write time

        if (cValues > 0) {

                  for (i=0, retCode=ERROR_SUCCESS; i

                           cchValue = MAX_VALUE_NAME; achValue[0] = '\0';

                           if (ERROR_SUCCESS == RegEnumValue(hKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL)) {

                                    CString szName(achValue);

                                    if (-1 != szName.Find(_T("Serial")) || -1 != szName.Find(_T("VCom")) ){

                                              BYTE strDSName[10]; memset(strDSName, 0, 10);

                                              DWORD nValueType = 0, nBuffLen = 10;

                                              if (ERROR_SUCCESS == RegQueryValueEx(hKey, (LPCTSTR)achValue, NULL,

&nValueType, strDSName, &nBuffLen)){

                                                       int nIndex = -1;

                                                       while(++nIndex < 20){

                                                                if (-1 == m_nComArray[nIndex]) {

                                                                          m_nComArray[nIndex] = atoi((char*)(strDSName + 3));

                                                                          break;

                                                                }

                                                       }

                                              }

                                    }

                           }

                  }

        }

        else{

                  AfxMessageBox(_T("机PC机没有COM口....."));

        }

}

RegCloseKey(hTestKey);

2.1.2连接串口

串口是系统资源,也当作文件一样操作,所以也用CreateFile函数,如果调用成功返回串口句柄,如果失败返回INVALID_HANDLE_VALUE值.函数参数说明如下:

HANDLE WINAPI CreateFile(

 __in         LPCTSTR lpFileName,//串口名(逻辑端口名),如:”COM1”,”COM2”

 __in            DWORD dwDesiredAccess,//访问模式,对串口有读/写权限

 __in            DWORD dwShareMode,//共享模式,有读/写/删除共享,对串口通信只能独占模式

 __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,//文件安全属性,对串口设置为NULL

 __in            DWORD dwCreationDisposition,//创建方式,串口通信设置为OPEN_EXISTING

 __in            DWORD dwFlagsAndAttributes,//文件属性标记,是否异步方式,在些设置

 __in_opt HANDLE hTemplateFile);//文件句柄,如果不为NULL,新文件从该够本复制或扩展,如果函数执行成功,返回新的串口句柄.

? 第一个参数:逻辑串口号,用字符串”COMX”表示,”X”是串口序号,关于电脑中的逻辑串口号,在注册表HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP目录下,包含字符"Serial"或"VCom"项下面的值就是,可以有多个

? 第二个参数:是对对串口的访问权限,串口只有读/写(GENERIC_READ/GENERIC_WRITE)权限,可以同时设置成读/写权限,也可以单独只设置读或写权限.

? 第三个参数:是共享模式,有读/写/删除共享,对串口通信只能独占模式,即是0.

? 第四个参数:文件安全属性,对串口设置成NULL.

? 第五个参数:创建方式,有CREATE_ALWAYS/ CREATE_NEW/ OPEN_EXISTING等方式,但是对串口只能是OPEN_EXISTING,只能打开存在的串口,不像文件一样可创建之类

? 第六个参数:文件属性与标志,详细信息查看MSDN,如果想把串口设置成异步方式,那么要设置成FILE_FLAG_OVERLAPPED.

? 第七个参数:文件句柄,新文件从该句柄复制或扩展,如果函数执行成功,返回新的句柄,对串口通信,设置成NULL

以下为代码示例:

HANDLE hCom = CreateFile("COM1", //打开串口1

             GENERIC_READ|GENERIC_WRITE, //允许读和写操作

             0, //独占方式

             NULL,

             OPEN_EXISTING, //打开存在的串口,必须是OPEN_EXISTING,文件还可以CREATE_NEW,串口不能创建

             FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //异步方式打开

             NULL);

if (INVALID_HANDLE_VALUE == m_hCom) {

                           int nError = GetLastError();

             }

如果执行成功返回串口句柄,如果失败通过GetLastError获取错误码.

        

2.1.3串口逻辑端口号大于10无法打开问题

       通过函数CreateFile打开串口,其第一个参数就是串口的逻辑端口名,是用”COMX”表示的,其中X是1~N的整数,当X大于10时,有时会出现无法打开的问题,把逻辑端口名改成"\\\\.\\COM

X"即可解决.

CString szCom;

szCom.Format(_T("\\\\.\\COM%d"), nPort);

COMFile = CreateFile(szCom.GetBuffer(50), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,                                                 NULL,             OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);

2.2串口配置

        对串口进行设置,如缓冲区大小,是否允许二进制,参数配置等.

2.2.1设置缓冲区大小

        设置IO的缓冲区大小根据自己需求,太小容易丢失数据,所以根据自己的需求设置.

BOOL SetupComm(

 HANDLE hFile, //串口句柄,CreateFile的有效返回值

 DWORD dwInQueue, //输入缓冲区字节数

 DWORD dwOutQueue);//输出缓冲区字节数

2.2.2设置串口状态

        设置串口的各种状态,波特率/数据位/停止位/校验位/流控制/二进制等.设置窗口状态是通过函数SetCommState设置的,第一个参数是串口句柄,第二个是DCB指针.DCB结构比较复杂,参数多,所以一般是通过GetCommState来填充一个DCB对象,然后再修改这对象,再把修改好的对像给SetCommState做参数.这是常用的方法.下面是对DCB参数介绍:

typedef struct _DCB { // dcb 

        DWORD DCBlength;           // sizeof(DCB) 

        DWORD BaudRate;            // current baud rate 指定当前的波特率

        DWORD fBinary: 1;          // binary mode, no EOF check 指定是否允许二进制模式,WINDOWS 95中必须为TRUE

        DWORD fParity: 1;          // enable parity checking 指定奇偶校验是否允许

        DWORD fOutxCtsFlow:1;// CTS output flow control 指定CTS是否用于检测发送控制.当为TRUE是CTS为OFF,发送将被挂起

        DWORD fOutxDsrFlow:1;// DSR output flow control 指定DSR是否用于检测发送控制.当为TRUE是DSR为OFF,发送将被挂起

        DWORD fDtrControl:2;       // DTR flow control type DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将

//DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR"握手",

        DWORD fDsrSensitivity:1;   // DSR sensitivity 当该值为TRUE时DSR为OFF时接收的字节被忽略

        DWORD fTXContinueOnXoff:1; // XOFF continues Tx 指定当接收缓冲区已满,并且驱动程序已经发送出XoffChar字符时发送

//是否停止.TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送

//出XoffChar字符中止接收字节之后,发送继续进行。FALSE时,在接收缓冲区接收到代表缓冲

//区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。

        DWORD fOutX: 1;            // XON/XOFF out flow control TRUE时,接收到XoffChar之后便停止发送.接收到XonChar之后将重新开始

        DWORD fInX: 1;             // XON/XOFF in flow control TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出

//去.接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去

        DWORD fErrorChar: 1;       // enable error replacement 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇

//偶校验错误的接收字符

        DWORD fNull: 1;            // enable null stripping TRUE时,接收时去掉空(0值)字节

       DWORD fRtsControl:2;       // RTS flow control RTS_CONTROL_DISABLE时,RTS置为OFF RTS_CONTROL_ENABLE时, RTS置为ON RTS_CONTROL_HANDSHAKE时,当接收缓冲区小于半满时RTS为ON 当接收缓冲区超过四分之三满时RTS为OFF RTS_CONTROL_TOGGLE时,当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF

       DWORD fAbortOnError:1;     // abort reads/writes on error TRUE时,有错误发生时中止读和写操作

       DWORD fDummy2:17;          // reserved 未使用

      WORD wReserved;            // not currently used 未使用,必须为0

       WORD XonLim;               // transmit XON threshold 指定在XON字符发送这前接收缓冲区中可允许的最小字节数

       WORD XoffLim;              // transmit XOFF threshold 指定在XOFF字符发送这前接收缓冲区中可允许的最小字节数

        BYTE ByteSize;             // number of bits/byte, 4-8 指定端口当前使用的数据位

        BYTE Parity;               // 0-4=no,odd,even,mark,space 指定端口当前使用的奇偶校验方法,可能为:

//EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY

        BYTE StopBits;             // 0,1,2 = 1, 1.5, 2 指定端口当前使用的停止位数,可能为:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS

        char XonChar;              // Tx and Rx XON character 指定用于发送和接收字符XON的值

        char XoffChar;             // Tx and Rx XOFF character 指定用于发送和接收字符XOFF值

        char ErrorChar;            // error replacement character 本字符用来代替接收到的奇偶校验发生错误时的值

        char EofChar;              // end of input character 当没有使用二进制模式时,本字符可用来指示数据的结束

        char EvtChar;              // received event character 当接收到此字符时,会产生一个事件

        WORD wReserved1;           // reserved; do not use 未使用

    } DCB; 

以下为示例代码:

             DCB dcb;

             GetCommState(hCom,&dcb);

             dcb.BaudRate = 9600;//波特率

             dcb.fBinary = TRUE;//是否允许传二进制

             dcb.fParity = TRUE;//是否奇偶校验

             dcb.ByteSize = 8;//数据位

             dcb.Parity = ODDPARITY;//奇偶校验方式

             dcb.StopBits = ONESTOPBIT;//停止位

             SetCommState(hCom,&dcb);

2.2.3设置需通知的事件

        设置你关心的事件,当此事件发生时,将得到事件通知,通过SetCommMask函数设置,SetCommMask函数两个参数,第一个为串口句柄,第二个为事件,可通过位或的方式指定多个事件,如下:

BOOL WINAPI SetCommMask(

 __in  HANDLE hFile,

 __in  DWORD dwEvtMask);

示例代码:

SetCommMask(m_hCom, EV_RXCHAR ) ;

EV_RXCHAR事件指当输入缓冲区内有数据时,通过WaitCommEvent函数可获得通知,其他事件同理,其他事件还有EV_BREAK/EV_CTS/EV_RING等,详情参看MSDN.

2.2.4清空缓冲区

        在接收/发送数据前缓冲区中可能有垃圾数据,或者中途想清空缓冲区数据,可以用以下调用以下函数:

BOOL WINAPI PurgeComm(

 __in HANDLE hFile,//串口句柄

 __in DWORD dwFlags//清空方式PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR

);

PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR分别表示:立即中断写操作并清空输出缓冲区|清空输出缓冲区|立即中断读操作并清空输入缓冲区|清空输入缓冲区.示例代码如下:

PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

2.3异步接收数据

        在2.2.3中通过SetCommMask函数,设置了异步通知事件EV_RXCHAR,所以当输入缓冲区中有数据时,将会有事件触发,那怎么获得事件呢?通过WaitCommEvent函数截取,与WaitForSingleObject原理类似.函数说明如下:

BOOL WINAPI WaitCommEvent(

 __in  HANDLE hFile,

 __out LPDWORD lpEvtMask,

 __in  LPOVERLAPPED lpOverlapped);

第一个参数是串口句柄,第二个参数是Out型指针,接收事件标志的,第三个参数接收事件信息事件状态.以下为示例代码:

HANDLE hEventArr[2];

hEventArr[0] = osRead.hEvent;

hEventArr[1] = *g_OutPutList.GetEvent();

while(1){

             DWORD nResutl = WaitForMultipleObjectsEx(2, hEventArr, FALSE, 200, TRUE/*INFINITE*/);

             if(0 == nResutl){

                           if (g_OutPutList.GetCount() > 1000)

                                         g_OutPutList.RemoveAll();

                           WORD nLen = (WORD)m_nBuffLen + 2;

                           PBYTE pIn = new BYTE[nLen];

                           pIn[0] = HIBYTE(nLen);

                           pIn[1] = LOBYTE(nLen);

                           memcpy(pIn + 2, m_InPutBuff, m_nBuffLen);

                           g_InPutList.AddTail(pIn);

                           m_nBuffLen = 0;

             }

             else if(1 == nResutl){

                           PBYTE pOut = (PBYTE)g_OutPutList.RemoveHead();

                           int nLen = pOut[0] * 0x100 + pOut[1] - 2;

                           WriteCommBlock(pOut + 2, nLen);

                           delete[] pOut;

             }

             DWORD dwEvtMask = 0 ;

             WaitCommEvent( COMFile, &dwEvtMask, &ShareEvent);//等?¨¨待?y串??口¨?事??件t

             if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) {

                           ReadCommBlock( );

             }

}

三示例代码

    关于本文的代码下载链接:http://download.csdn.net/detail/mingojiang/4425803 VS2010编写的,编译通过,是个串口调试工具. 如图:

 

3.1连接串口并设置参数

DCB dcb ;

BOOL fRetVal ;

COMMTIMEOUTS CommTimeOuts;

CString szCom;

szCom.Format(_T("\\\\.\\COM%d"), nPort);

COMFile = CreateFile(szCom.GetBuffer(50), GENERIC_READ | GENERIC_WRITE,//可¨?读¨?、?é可¨?写??

                                                                                   FILE_SHARE_READ | FILE_SHARE_WRITE,                                                                                

NULL,

                                                                                   OPEN_EXISTING,

                                                                                   FILE_FLAG_OVERLAPPED,

                                                                                   NULL);

if (INVALID_HANDLE_VALUE == COMFile){

             return ( FALSE ) ;

}

SetupComm(COMFile,6000,6000) ;

SetCommMask(/*COMFileTemp*/COMFile, EV_RXCHAR ) ;

CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;

CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;

CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;

CommTimeOuts.WriteTotalTimeoutMultiplier = 2*CBR_9600/9600 ;

CommTimeOuts.WriteTotalTimeoutConstant = 0 ;

SetCommTimeouts(/*COMFileTemp*/COMFile, &CommTimeOuts ) ;

dcb.DCBlength = sizeof( DCB ) ;

GetCommState(COMFile, &dcb ) ;

dcb.BaudRate =CBR_9600;

dcb.StopBits =ONESTOPBIT;

dcb.Parity = NOPARITY;

dcb.ByteSize=8;

dcb.fBinary=TRUE;

 dcb.fOutxDsrFlow = 0 ;

dcb.fDtrControl = DTR_CONTROL_ENABLE ;

dcb.fOutxCtsFlow = 0 ;

dcb.fRtsControl = RTS_CONTROL_ENABLE ;

dcb.fInX = dcb.fOutX = 1 ;

dcb.XonChar = 0X11 ;

dcb.XoffChar = 0X13 ;

dcb.XonLim = 100 ;

dcb.XoffLim = 100 ;

dcb.fParity = TRUE ;

fRetVal = SetCommState(/*COMFileTemp*/COMFile, &dcb ) ;

if(!fRetVal) return FALSE;

PurgeComm( /*COMFileTemp*/COMFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

EscapeCommFunction( /*COMFileTemp*/COMFile, SETDTR ) ;

3.2发送与接收数据

HANDLE hEventArr[2];

hEventArr[0] = osRead.hEvent;

hEventArr[1] = *g_OutPutList.GetEvent();

while(1){

             DWORD nResutl = WaitForMultipleObjectsEx(2, hEventArr, FALSE, 200, TRUE/*INFINITE*/);

             if(0 == nResutl){

                           if (g_OutPutList.GetCount() > 1000)

                                         g_OutPutList.RemoveAll();

                           WORD nLen = (WORD)m_nBuffLen + 2;

                           PBYTE pIn = new BYTE[nLen];

                           pIn[0] = HIBYTE(nLen);

                           pIn[1] = LOBYTE(nLen);

                           memcpy(pIn + 2, m_InPutBuff, m_nBuffLen);

                           g_InPutList.AddTail(pIn);

                           m_nBuffLen = 0;

             }

             else if(1 == nResutl){

                           PBYTE pOut = (PBYTE)g_OutPutList.RemoveHead();

                           int nLen = pOut[0] * 0x100 + pOut[1] - 2;

                           WriteCommBlock(pOut + 2, nLen);

                           delete[] pOut;

             }

DWORD dwEvtMask = 0 ;

WaitCommEvent( COMFile, &dwEvtMask, &ShareEvent);//等?¨¨待?y串??口¨?事??件t

if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) {

             ReadCommBlock( );

             }

}

3.3关闭串口

//禁止串行端口所有事件

SetCommMask(COMFile, 0) ;

//清除数据终端就绪信号

EscapeCommFunction( COMFile, CLRDTR ) ;

//丢弃通信资源的输出或输入缓冲区字符并终止在通信资源上挂起的读、写操操作

PurgeComm( COMFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

CloseHandle( COMFile );

COMFile = NULL;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP原理(全网最详细)

一、确认应答&#xff08;可靠性机制&#xff09; TCP诞生的初衷就是可靠传输 可靠传输是TCP最核心的部分&#xff0c;TCP内部很多机制都是在保证可靠传输&#xff08;可以理解为发一条消息&#xff0c;上面显示已读未读&#xff0c;可靠传输就是发一条消息我知道对方是否收到…

【wordPress】WordPress删除index.php后缀【亲测有效】(手把手教学)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

BUUCTF test_your_nc

这是一题pwn入门题 使用linux中的file命令查看文件类型 file test64-bit告诉我们是64位程序 IDA64进行反编译 可以看到main函数中直接执行/bin/sh了 使用nc直接连接上面的地址 nc node4.buuoj.cn 28561然后就可以直接执行shell命令了 cat /flag

【Redis】深入探索 Redis 的数据类型 —— 哈希表 hash

文章目录 前言一、hash 类型相关命令1.1 HSET 和 HSETNX1.2 HGET 和 HMGET1.3 HKEYS、HVALS 和 HGETALL1.4 HEXISTS 和 HDEL1.5 HLEN1.6 HINCRBY 和 HINCRBYFLOAT1.7 哈希相关命令总结 二、hash 类型内部编码三、hash 类型的应用场景四、原生&#xff0c;序列化&#xff0c;哈希…

怎样去掉win11快捷方式的小箭头

前有创造注册表新值的方法,现在有了注册表加文件的方法 开始 先下载这个文件,里面有要用到的信息 下载 保存文件到电脑,并解压 有两个文件, 一个是 Remove_shortcut_arrow_icon.reg 一个是blank.ico 把第二个文件移动到 C:\Windows 文件夹, 然后点击打开文件, 如果提示是…

Windows11下Python安装GTK4

在Python下使用GTK无法直接使用pip安装PyGObject库 打卡MSYS终端&#xff0c;依次执行&#xff1a; pacman -Suy pacman -S mingw-w64-x86_64-gtk4 mingw-w64-x86_64-python3 mingw-w64-x86_64-python3-pip mingw-w64-x86_64-python3-gobject mingw-w64-x86_64-libadwaita min…

Kotlin File writeText appendText appendBytes readBytes readText

Kotlin File writeText appendText appendBytes readBytes readText import java.io.Filefun main(args: Array<String>) {val filePath "./myfile.txt"val file File(filePath)file.writeText("hello,") //如果原有文件有内容&#xff0c;将完全覆…

八大排序——快速排序

Hello&#xff0c;大家好&#xff0c;今天分享的八大排序里的快速排序&#xff0c;所谓快速排序是一个叫霍尔的人发明&#xff0c;有很多人可能会觉得为什么不叫霍尔排序&#xff0c;其中原因就是因为它快&#xff0c;快速则体现了它的特点&#xff0c;今天我们就来讲一下快速排…

李宏毅-hw5-translation-有关transformer、seq2seq的探索

一、ppt研读&#xff1a; 1.关于这个 input Embedding 的内容: 2.关于Positional Encoding&#xff1a; 二、慢慢积累&#xff0c;一点点阅读代码&#xff1a; 虽然这次的模块挺多的&#xff0c;但是&#xff0c;这样也就意味着&#xff0c;把这个内化为自己的&#xff0c;就…

【面试经典150 | 数组】合并两个有序数组

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;合并排序方法二&#xff1a;双指针方法三&#xff1a;原地操作-从前往后方法四&#xff1a;原地操作-从后往前 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章…

Axure RP 9 for Mac/Windows图文安装教程

Axure RP 9是一款一款专业级快速产品原型设计工具&#xff0c;使用它可以让用户快速、高效创建应用软件或Web网站的线框图、流程图、原型和规格说明文档。 Axure RP 9 for Mac采用了极简主义的设计&#xff0c;界面布局更加清爽简洁&#xff0c;操作也非常简单&#xff0c;并且…

系统架构设计专业技能 ·操作系统

现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 点击进入系列文章目录 系统架构设计高级技能 操作系统 一、操作系统概述二、进程管理2.1 进程概念2.2 进…

VSCode中配置命令行参数

VSCode中配置命令行参数 在跑程序调试的时候&#xff0c;可以直接使用脚本运行程序&#xff0c;这个时候调试代码只能用pdb ,我觉得不太习惯&#xff0c;而且感觉不是很好&#xff0c;所以想这能不能将运行程序的脚本中的命令直接配置到vscode上&#xff0c;就有了这篇记录。 …

oCPC实践录 | oCPC转化的设计、选择、归因与成本设置(2)

在oCPC实践录 | oCPC转化的设计、选择、归因与成本设置&#xff08;1&#xff09;中初步介绍了平台侧和广告主侧的转化设计&#xff0c;这篇文章介绍平台侧和广告主怎么选择转化目标&#xff0c;归因与成本控制。 一 上周受公司增长部门的同事邀请做了一场分享和交流&#xf…

Cesium 制作风流场,制作风场可视化

需求 Cesium 制作风场 预览 分析 以下是开发中参考的几个博主的案例 博客一&#xff1a;风场热力图博客二博客三 风场数据准备&#xff0c;data.json 由于数据量过大&#xff0c;我这边只做格式展示&#xff0c;想要完整 json 文件&#xff0c;可以在我的资源里获取 […

A Yet Another Remainder The 2022 ICPC Asia Regionals Online Contest (II)

PTA | 程序设计类实验辅助教学平台 题目大意&#xff1a;有一个n位长的隐藏数x&#xff0c;从高位到低位依次标号为1到n&#xff0c;sum[i][j]表示从第i为开始每j位上的数的和&#xff0c;有q次询问&#xff0c;每次给出一个100以内除了5以外的质数p&#xff0c;问这个数%p等于…

免费版Photoshop2024智能人像磨皮插件

Portraiture是一款智能磨皮插件&#xff0c;为Photoshop和Lightroom添加一键磨皮美化功能&#xff0c;快速对照片中皮肤、头发、眉毛等部位进行美化&#xff0c;无需手动调整&#xff0c;大大提高P图效率。全新4版本&#xff0c;升级AI算法&#xff0c;并独家支持多人及全身模式…

企业架构LNMP学习笔记32

企业架构LB-服务器的负载均衡之LVS实现&#xff1a; 学习目标和内容 1&#xff09;能够了解LVS的工作方式&#xff1b; 2&#xff09;能够安装和配置LVS负载均衡&#xff1b; 3&#xff09;能够了解LVS-NAT的配置方式&#xff1b; 4&#xff09;能够了解LVS-DR的配置方式&…

基于SSM的生鲜电商系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Linux高性能服务器编程 学习笔记 第一章 TCP/IP协议族

现在Internet使用的主流协议族是TCP/IP协议族&#xff0c;它是一个分层、多协议的通信体系。 TCP/IP协议族包含众多协议&#xff0c;我们只详细讨论IP协议和TCP协议&#xff0c;因为它们对编写网络应用程序有最直接的影响。如果想系统学习网络协议&#xff0c;RFC&#xff08;…