RE2,C++正则表达式库实战

article/2025/7/29 1:53:20

RE2简介

RE2

RE2是,一个高效、原则性的正则表达式库,由Rob PikeRuss Cox两位来自google的大牛用C++实现。他俩同时也是Go语言的主导者。Go语言中的regexp正则表达式包,也是RE2的Go实现。

RE2是,一个快速安全线程友好,PCRE、PERL和Python等回溯正则表达式引擎(backtracking regular expression engine)的一个替代品。RE2支持Linux和绝大多数的Unix平台,但不支持Windows(如果有必要,你可以自己hack)。

RE2的特点

回溯引擎(Backtracking engine)通常是典型的完整的功能和便捷的语法糖,但是即使很小的输入都可能强制进入指数级时间处理场景。RE2应用自动机理论理论,来保证在一个尺寸的输入上正则表达式搜索运行于一个时间线。RE2实现了内存限制,所以搜索可以被制约在一个固定大小的内存。RE2被设计为使用一个很小的固定C++堆栈足迹,无论它必须处理的输入或正则表达式是什么。从而RE2在多线程环境非常有用,当线程栈不能武断的增大时。

当输入(数据集)很大时,RE2通常比回溯引擎快很多。它采用自动机理论,实施别的引擎无法进行的优化。

不同于绝大多数基于自动机的引擎,RE2实现了几乎所有Perl和PCRE特点,和语法糖。它找到最左-优先(leftmost-first)匹配,同时匹配Perl可能匹配的,并且能返回子匹配信息。最明显的例外是,RE2去掉了反向引用(backreferences)和一般性零-宽度断言(zero-width assertion)的支持,因为无法高效实现。

为了相对简单语法的使用者,RE2,有一个POSIX模式,仅接受POSIX egrep算子,实现最左-最长整体匹配(leftmost-longest overall matching)。

xkcd

¹ Technical note: there's a difference between submatches and backreferences. Submatches let you find out what certain subexpressions matched after the match is over, so that you can find out, after matching dogcat against (cat|dog)(cat|dog), that \1 is dog and \2 is cat. Backreferences let you use those subexpressions during the match, so that (cat|dog)\1 matches catcat and dogdog but not catdog or dogcat.

RE2支持子匹配萃取(submatch extraction),但是不支持反向引用(backreferences)。

如果你必须要反向引用一般性断言,而RE2不支持,那么你可以看一下irregexp,Google Chrome的正则表达式引擎。

玩转RE2

安装

你可以下载发行版的代码包,然后解压进行安装。这里介绍,另一种安装方式:

需要安装Mercurial SCM和C++编译器(g++的克隆):

下载代码,并进行安装:

hg clone http://re2.googlecode.com/hg re2cd re2make testmake testinstallsudo make install

在BSD系统, 使用gmake替换make

使用RE2库

使用RE2库开发C++应用,需要在代码中包含re2/re2.h头文件,链接时增加 -lre2以及-lpthread(多线环境使用)选项。

语法

POSIX模式,RE@接受标准POSIX (egrep)语法正则表达式。在Perl模式,RE2接受大部分Perl操作符。唯一例外的是,那些要求回溯(潜在需要指数级的运行时)实现的部分。其中,包括反向引用(子匹配,还是支持的)和一般性断言。RE2,默认为Perl模式。

C++ 高级接口

这里包括两个基本的操作:

  • RE2::FullMatch: 要求regexp表达式匹配整个输入文本。
  • RE2::PartialMatch: 在输入文本中寻找一个子匹配。在POSIX模式,返回最左-最长匹配,Perl模式也是相同的匹配。

例如,

vi re2_high_interface_test.cc

#include <re2/re2.h>
#include <iostream>
#include <assert.h>int
main(void)
{assert(RE2::FullMatch("hello", "h.*o"));assert(!RE2::FullMatch("hello", "e"));assert(RE2::PartialMatch("hello", "h.*o"));assert(RE2::PartialMatch("hello", "e"));std::cout << "Ok" << std::endl;return 0;
}

编译程序:

 g++ -o re2_high_interface_test re2_high_interface_test.cc -lre2

执行re2_high_interface_test,程序正常运行,显示结果Ok

子匹配萃取

两个匹配函数,都支持附加参数,来指定子匹配。此参数可以是一个字符串或一个整数类型StringPiece类型。一个StringPiece是一个指向原始输入的指针,和一个字符串的长度计数。有点类似一个string,但是有自己的存储。和使用指针一样,当使用StringPiece时,你必须小心谨慎,原始文本已被删除或不在相同的边界时,不能使用。

示例:

vi re2_submatch_ex_test.cc

#include <re2/re2.h>
#include <iostream>
#include <assert.h>int
main(void)
{int i;std::string s;assert(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s, &i));assert(s == "ruby");assert(i == 1234);// Fails: "ruby" cannot be parsed as an integer.assert(!RE2::FullMatch("ruby", "(.+)", &i));// Success; does not extract the number.assert(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", &s));// Success; skips NULL argument.assert(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", (void*)NULL, &i));// Fails: integer overflow keeps value from being stored in i.assert(!RE2::FullMatch("ruby:123456789123", "(\\w+):(\\d+)", &s, &i));std::cout << "Ok" << std::endl;return 0;
}
g++ -o re2_submatch_ex_test re2_submatch_ex_test.cc -lre2

预编译的正则表达式

上面的示例都是每次调用的时编译一次正则表达式。相反,你可以编译一次正则表达式,保存到一个RE2对象中,然后在每次调用时重用这个对象。

示例:

vi re2_prec_re_test.cc

#include <re2/re2.h>
#include <iostream>
#include <assert.h>int
main(void)
{int i;std::string s;RE2 re("(\\w+):(\\d+)");assert(re.ok());  // compiled; if not, see re.error();assert(RE2::FullMatch("ruby:1234", re, &s, &i));assert(RE2::FullMatch("ruby:1234", re, &s));assert(RE2::FullMatch("ruby:1234", re, (void*)NULL, &i));assert(!RE2::FullMatch("ruby:123456789123", re, &s, &i));std::cout << "Ok" << std::endl;return 0;
}
g++ -o re2_prec_re_test re2_prec_re_test.cc -lre2

选项

RE2构造器还有第二个可选参数,可以用来改变RE2的默认选项。例如,预定义的Quiet选项,当正则表达式解析失败时,不打印错误消息:

vi re2_options_test.cc

#include <re2/re2.h>
#include <iostream>
#include <assert.h>int
main(void)
{RE2 re("(ab", RE2::Quiet);  // don't write to stderr for parser failureassert(!re.ok());  // can check re.error() for detailsstd::cout << "Ok" << std::endl;return 0;
}

编译程序:

g++ -o re2_options_test re2_options_test.cc -lre2

其他有用的预定义选项,是Latin1 (禁用UTF-8)和POSIX (使用POSIX语法最左-最长匹配)。

你可以定义自己的RE2::Options对象,然后配置它。所有的选项在re2/re2.h文件中。

Unicode规范化

RE2操作Unicode的码点(code points): 它没有试图进行规范化。例如,正则表达式/ü/(U+00FC, u和分音符)不匹配"ü"(U+0075 U+0308, u紧挨结合分音符)。规范化,是一个长期,参与的话题。最小的解决方案,如果你需要这样的匹配,是在使用RE2之前的处理环节中同时规范化正则表达式和输入。相关主题的更多细节,请参考http://www.unicode.org/reports/tr15/。

额外的技巧和窍门

RE2的高级应用技巧,如构造自己的参数列表,或将RE2作为词法分析器使用或解析十六进制、十进制和C-基数数字,请参考re2.h文件。

“回溯”与“非回溯”的区别

以下照片内容,源自“sregex: matching Perl 5 regexes on data streams”讲演文档.

回溯的意思

回溯方式实现

Robe Pike的算法

Thompson的构造的算法

RE2的各种包装

An Inferno wrapper is at http://code.google.com/p/inferno-re2/.

Python wrapper is at http://github.com/facebook/pyre2/.

Ruby wrapper is at http://github.com/axic/rre2/.

An Erlang wrapper is at http://github.com/tuncer/re2/.

Perl wrapper is at http://search.cpan.org/~dgl/re-engine-RE2-0.05/lib/re/engine/RE2.pm.

An Eiffel wrapper is at http://sourceforge.net/projects/eiffelre2/.

RE2支持的语法

这里列出了RE2支持的正则表达式语法。同时,也列出了PCRE、PERL和VIM接受的语法。蓝色内容是,RE2不支持的语法。

 
Single characters:
.any character, including newline (s=true)
[xyz]character class
[^xyz]negated character class
\dPerl character class
\Dnegated Perl character class
[:alpha:]ASCII character class
[:^alpha:]negated ASCII character class
\pNUnicode character class (one-letter name)
\p{Greek}Unicode character class
\PNnegated Unicode character class (one-letter name)
\P{Greek}negated Unicode character class
 
Composites:
xyx followed by y
x|yx or y (prefer x)
 
Repetitions:
xzero or more x, prefer more
x+one or more x, prefer more
x?zero or one x, prefer one
x{n,m}n or n+1 or ... or m x, prefer more
x{n,}n or more x, prefer more
x{n}exactly n x
x?zero or more x, prefer fewer
x+?one or more x, prefer fewer
x??zero or one x, prefer zero
x{n,m}?n or n+1 or ... or m x, prefer fewer
x{n,}?n or more x, prefer fewer
x{n}?exactly n x
x{}(≡ x(NOT SUPPORTED) VIM
x{-}(≡ x?(NOT SUPPORTED) VIM
x{-n}(≡ x{n}?(NOT SUPPORTED) VIM
x=(≡ x?(NOT SUPPORTED) VIM
 
Possessive repetitions:
x+zero or more x, possessive (NOT SUPPORTED)
x++one or more x, possessive (NOT SUPPORTED)
x?+zero or one x, possessive (NOT SUPPORTED)
x{n,m}+n or ... or m x, possessive (NOT SUPPORTED)
x{n,}+n or more x, possessive (NOT SUPPORTED)
x{n}+exactly n x, possessive (NOT SUPPORTED)
 
Grouping:
(re)numbered capturing group
(?Pre)named & numbered capturing group
(?re)named & numbered capturing group (NOT SUPPORTED)
(?'name're)named & numbered capturing group (NOT SUPPORTED)
(?:re)non-capturing group
(?flags)set flags within current group; non-capturing
(?flags:re)set flags during re; non-capturing
(?#text)comment (NOT SUPPORTED)
(?|x|y|z)branch numbering reset (NOT SUPPORTED)
(?>re)possessive match of re (NOT SUPPORTED)
re@>possessive match of re (NOT SUPPORTED) VIM
%(re)non-capturing group (NOT SUPPORTED) VIM
 
Flags:
icase-insensitive (default false)
mmulti-line mode: ^ and $ match begin/end line in addition to begin/end text (default false)
slet . match \n (default false)
Uungreedy: swap meaning of x and x?x+ and x+?, etc (default false)
Flag syntax is xyz (set) or -xyz (clear) or xy-z (set xy, clear z).
 
Empty strings:
^at beginning of text or line (m=true)
$at end of text (like \z not \Z) or line (m=true)
\Aat beginning of text
\bat word boundary (\w on one side and \W\A, or \z on the other)
\Bnot a word boundary
\Gat beginning of subtext being searched (NOT SUPPORTED) PCRE
\Gat end of last match (NOT SUPPORTED) PERL
\Zat end of text, or before newline at end of text (NOT SUPPORTED)
\zat end of text
(?=re)before text matching re (NOT SUPPORTED)
(?!re)before text not matching re (NOT SUPPORTED)
(?<=re)after text matching re (NOT SUPPORTED)
(?<!re)after text not matching re (NOT SUPPORTED)
re&before text matching re (NOT SUPPORTED) VIM
re@=before text matching re (NOT SUPPORTED) VIM
re@!before text not matching re (NOT SUPPORTED) VIM
re@<=after text matching re (NOT SUPPORTED) VIM
re@<!after text not matching re (NOT SUPPORTED) VIM
\zssets start of match (= \K) (NOT SUPPORTED) VIM
\zesets end of match (NOT SUPPORTED) VIM
\%^beginning of file (NOT SUPPORTED) VIM
\%$end of file (NOT SUPPORTED) VIM
\%Von screen (NOT SUPPORTED) VIM
\%#cursor position (NOT SUPPORTED) VIM
\%'mmark m position (NOT SUPPORTED) VIM
\%23lin line 23 (NOT SUPPORTED) VIM
\%23cin column 23 (NOT SUPPORTED) VIM
\%23vin virtual column 23 (NOT SUPPORTED) VIM
 
Escape sequences:
\abell (≡ \007)
\fform feed (≡ \014)
\thorizontal tab (≡ \011)
\nnewline (≡ \012)
\rcarriage return (≡ \015)
\vvertical tab character (≡ \013)
*literal , for any punctuation character
\123octal character code (up to three digits)
\x7Fhex character code (exactly two digits)
\x{10FFFF}hex character code
\Cmatch a single byte even in UTF-8 mode
\Q...\Eliteral text ... even if ... has punctuation
 
\1backreference (NOT SUPPORTED)
\bbackspace (NOT SUPPORTED) (use \010)
\cKcontrol char ^K (NOT SUPPORTED) (use \001 etc)
\eescape (NOT SUPPORTED) (use \033)
\g1backreference (NOT SUPPORTED)
\g{1}backreference (NOT SUPPORTED)
\g{+1}backreference (NOT SUPPORTED)
\g{-1}backreference (NOT SUPPORTED)
\g{name}named backreference (NOT SUPPORTED)
\gsubroutine call (NOT SUPPORTED)
\g'name'subroutine call (NOT SUPPORTED)
\knamed backreference (NOT SUPPORTED)
\k'name'named backreference (NOT SUPPORTED)
\lXlowercase X (NOT SUPPORTED)
\uxuppercase x (NOT SUPPORTED)
\L...\Elowercase text ... (NOT SUPPORTED)
\Kreset beginning of $0 (NOT SUPPORTED)
\N{name}named Unicode character (NOT SUPPORTED)
\Rline break (NOT SUPPORTED)
\U...\Eupper case text ... (NOT SUPPORTED)
\Xextended Unicode sequence (NOT SUPPORTED)
 
\%d123decimal character 123 (NOT SUPPORTED) VIM
\%xFFhex character FF (NOT SUPPORTED) VIM
\%o123octal character 123 (NOT SUPPORTED) VIM
\%u1234Unicode character 0x1234 (NOT SUPPORTED) VIM
\%U12345678Unicode character 0x12345678 (NOT SUPPORTED) VIM
 
Character class elements:
xsingle character
A-Zcharacter range (inclusive)
\dPerl character class
[:foo:]ASCII character class foo
\p{Foo}Unicode character class Foo
\pFUnicode character class F (one-letter name)
 
Named character classes as character class elements:
[\d]digits (≡ \d)
[^\d]not digits (≡ \D)
[\D]not digits (≡ \D)
[^\D]not not digits (≡ \d)
[[:name:]]named ASCII class inside character class (≡ [:name:])
[^[:name:]]named ASCII class inside negated character class (≡ [:^name:])
[\p{Name}]named Unicode property inside character class (≡ \p{Name})
[^\p{Name}]named Unicode property inside negated character class (≡ \P{Name})
 
Perl character classes:
\ddigits (≡ [0-9])
\Dnot digits (≡ [^0-9])
\swhitespace (≡ [\t\n\f\r ])
\Snot whitespace (≡ [^\t\n\f\r ])
\wword characters (≡ [0-9A-Za-z])
\Wnot word characters (≡ [^0-9A-Za-z])
 
\hhorizontal space (NOT SUPPORTED)
\Hnot horizontal space (NOT SUPPORTED)
\vvertical space (NOT SUPPORTED)
\Vnot vertical space (NOT SUPPORTED)
 
ASCII character classes:
[:alnum:]alphanumeric (≡ [0-9A-Za-z])
[:alpha:]alphabetic (≡ [A-Za-z])
[:ascii:]ASCII (≡ [\x00-\x7F])
[:blank:]blank (≡ [\t ])
[:cntrl:]control (≡ [\x00-\x1F\x7F])
[:digit:]digits (≡ [0-9])
[:graph:]graphical (≡ [!-~] == [A-Za-z0-9!"#$%&'()+,-./:;<=>?@[\]^</tt><tt>{|}~]</tt>)</td></tr> <tr><td><tt>[:lower:]</tt></td><td>lower case (≡ <tt>[a-z]</tt>)</td></tr> <tr><td><tt>[:print:]</tt></td><td>printable (≡ <tt>[ -~] == [ [:graph:]]</tt>)</td></tr> <tr><td><tt>[:punct:]</tt></td><td>punctuation (≡ <tt>[!-/:-@[-</tt><tt>{-~])
[:space:]whitespace (≡ [\t\n\v\f\r ])
[:upper:]upper case (≡ [A-Z])
[:word:]word characters (≡ [0-9A-Za-z])
[:xdigit:]hex digit (≡ [0-9A-Fa-f])
 
Unicode character class names--general category:
Cother
Cccontrol
Cfformat
Cnunassigned code points (NOT SUPPORTED)
Coprivate use
Cssurrogate
Lletter
LCcased letter (NOT SUPPORTED)
L&cased letter (NOT SUPPORTED)
Lllowercase letter
Lmmodifier letter
Loother letter
Lttitlecase letter
Luuppercase letter
Mmark
Mcspacing mark
Meenclosing mark
Mnnon-spacing mark
Nnumber
Nddecimal number
Nlletter number
Noother number
Ppunctuation
Pcconnector punctuation
Pddash punctuation
Peclose punctuation
Pffinal punctuation
Piinitial punctuation
Poother punctuation
Psopen punctuation
Ssymbol
Sccurrency symbol
Skmodifier symbol
Smmath symbol
Soother symbol
Zseparator
Zlline separator
Zpparagraph separator
Zsspace separator
 
Unicode character class names--scripts:
ArabicArabic
ArmenianArmenian
BalineseBalinese
BengaliBengali
BopomofoBopomofo
BrailleBraille
BugineseBuginese
BuhidBuhid
Canadian_AboriginalCanadian Aboriginal
CarianCarian
ChamCham
CherokeeCherokee
Commoncharacters not specific to one script
CopticCoptic
CuneiformCuneiform
CypriotCypriot
CyrillicCyrillic
DeseretDeseret
DevanagariDevanagari
EthiopicEthiopic
GeorgianGeorgian
GlagoliticGlagolitic
GothicGothic
GreekGreek
GujaratiGujarati
GurmukhiGurmukhi
HanHan
HangulHangul
HanunooHanunoo
HebrewHebrew
HiraganaHiragana
Inheritedinherit script from previous character
KannadaKannada
KatakanaKatakana
Kayah_LiKayah Li
KharoshthiKharoshthi
KhmerKhmer
LaoLao
LatinLatin
LepchaLepcha
LimbuLimbu
Linear_BLinear B
LycianLycian
LydianLydian
MalayalamMalayalam
MongolianMongolian
MyanmarMyanmar
New_Tai_LueNew Tai Lue (aka Simplified Tai Lue)
NkoNko
OghamOgham
Ol_ChikiOl Chiki
Old_ItalicOld Italic
Old_PersianOld Persian
OriyaOriya
OsmanyaOsmanya
Phags_Pa'Phags Pa
PhoenicianPhoenician
RejangRejang
RunicRunic
SaurashtraSaurashtra
ShavianShavian
SinhalaSinhala
SundaneseSundanese
Syloti_NagriSyloti Nagri
SyriacSyriac
TagalogTagalog
TagbanwaTagbanwa
Tai_LeTai Le
TamilTamil
TeluguTelugu
ThaanaThaana
ThaiThai
TibetanTibetan
TifinaghTifinagh
UgariticUgaritic
VaiVai
YiYi
 
Vim character classes:
\iidentifier character (NOT SUPPORTED)/font> VIM
\I\i except digits (NOT SUPPORTED) VIM
\kkeyword character (NOT SUPPORTED) VIM
\K\k except digits (NOT SUPPORTED) VIM
\ffile name character (NOT SUPPORTED) VIM
\F\f except digits (NOT SUPPORTED) VIM
\pprintable character (NOT SUPPORTED) VIM
\P\p except digits (NOT SUPPORTED) VIM
\swhitespace character (≡ [ \t](NOT SUPPORTED) VIM
\Snon-white space character (≡ [^ \t](NOT SUPPORTED) VIM
\ddigits (≡ [0-9]VIM
\Dnot \d VIM
\xhex digits (≡ [0-9A-Fa-f](NOT SUPPORTED) VIM
\Xnot \x (NOT SUPPORTED) VIM
\ooctal digits (≡ [0-7](NOT SUPPORTED) VIM
\Onot \o (NOT SUPPORTED) VIM
\wword character VIM
\Wnot \w VIM
\hhead of word character (NOT SUPPORTED) VIM
\Hnot \h (NOT SUPPORTED) VIM
\aalphabetic (NOT SUPPORTED) VIM
\Anot \a (NOT SUPPORTED) VIM
\llowercase (NOT SUPPORTED) VIM
\Lnot lowercase (NOT SUPPORTED) VIM
\uuppercase (NOT SUPPORTED) VIM
\Unot uppercase (NOT SUPPORTED) VIM
_x\x plus newline, for any x (NOT SUPPORTED) VIM
 
Vim flags:
\cignore case (NOT SUPPORTED) VIM
\Cmatch case (NOT SUPPORTED) VIM
\mmagic (NOT SUPPORTED) VIM
\Mnomagic (NOT SUPPORTED) VIM
\vverymagic (NOT SUPPORTED) VIM
\Vverynomagic (NOT SUPPORTED) VIM
\Zignore differences in Unicode combining characters (NOT SUPPORTED) VIM
 
Magic:
(?{code})arbitrary Perl code (NOT SUPPORTED) PERL
(??{code})postponed arbitrary Perl code (NOT SUPPORTED) PERL
(?n)recursive call to regexp capturing group n (NOT SUPPORTED)
(?+n)recursive call to relative group +n (NOT SUPPORTED)
(?-n)recursive call to relative group -n (NOT SUPPORTED)
(?C)PCRE callout (NOT SUPPORTED) PCRE
(?R)recursive call to entire regexp (≡ (?0)(NOT SUPPORTED)
(?&name)recursive call to named group (NOT SUPPORTED)
(?P=name)named backreference (NOT SUPPORTED)
(?P>name)recursive call to named group (NOT SUPPORTED)
(?(cond)true|false)conditional branch (NOT SUPPORTED)
(?(cond)true)conditional branch (NOT SUPPORTED)
(ACCEPT)make regexps more like Prolog (NOT SUPPORTED)
(COMMIT)(NOT SUPPORTED)
(F)(NOT SUPPORTED)
(FAIL)(NOT SUPPORTED)
(MARK)(NOT SUPPORTED)
(PRUNE)(NOT SUPPORTED)
(SKIP)(NOT SUPPORTED)
(THEN)(NOT SUPPORTED)
(ANY)set newline convention (NOT SUPPORTED)
(ANYCRLF)(NOT SUPPORTED)
(CR)(NOT SUPPORTED)
(CRLF)(NOT SUPPORTED)
(LF)(NOT SUPPORTED)
(BSR_ANYCRLF)set \R convention (NOT SUPPORTED) PCRE
(*BSR_UNICODE)(NOT SUPPORTED) PCRE
 

扩展阅读

  1. "perlre - Perl regular expressions" http://perldoc.perl.org/perlre.html

  2. "Implementing Regular Expressions" http://swtch.com/~rsc/regexp

  3. The re1 project: http://code.google.com/p/re1

  4. The re2 project: http://code.google.com/p/re2

  5. sregex: A non-backtracking regex engine matching on data streams

  6. sregex: matching Perl 5 regexes on data streams: http://agentzh.org/misc/slides/yapc-na-2013-sregex.pdf

参考资料

  • RE2官网资料:http://code.google.com/p/re2/wiki/

  • sregex: matching Perl 5 regexes on data streams: http://agentzh.org/misc/slides/yapc-na-2013-sregex.pdf


http://chatgpt.dhexx.cn/article/ewflP0GH.shtml

相关文章

DB9接口定义

注意上表是公头的引脚定义&#xff0c;公头与母头的引脚编号是轴对称的&#xff0c;因此将公头和母头连接时是相同序号的引脚相连接。 作为串口使用时要注意&#xff0c;公头的2号是RXD&#xff0c;因而母头的2号是TXD&#xff0c;公头的3号是TXD&#xff0c;因而母头的3号是RX…

LIN DB9定义

没找到合适的图片所以用上图代替&#xff0c;在LIN中&#xff0c;图中CAN_H&#xff08;7&#xff09;为LIN线&#xff0c; GND&#xff08;3&#xff09;接地. 实物图如下

DB9串口接口定义

公头 母头 定义不同 连线都是2 3 5 但是 公头 2是RXD 3是Txd 母头 2是TXD 3是RXD而且两者的排列顺序,画pcb时注意 以上是公头接线方法~ 母头原理图接线 交叉 但是上图的db9的原理图是母的画法啊&#xff0c;应该是直接从ad的库中调去的&#xff0c;ad的库中只有着一种画法 例子…

DB9定义图

DB9接口定义图

DB9接口定义 串口接口定义 MAX232电路

我们知道老式电脑主板上面都会有9针的串口&#xff0c;即使到了现在&#xff0c; 很多人还是用串口来通信&#xff0c;这是做嵌入式与工控的一上很好的上位要与下位机通信的方案&#xff0c; 因为他接口简单&#xff0c;编程容易。 我们来讲一下定义&#xff1a; 首先普通主…

计算机九针孔什么接口,db9接口-USBCAN-I设备的DB9针串口头中的针脚是如何定义的-电气资讯 - 电工屋...

db9接口定义RXD和TXD接线的颜色怎么接 1)使用串口直通线。 设计电路时&#xff0c;单片机的RXD连接电路板DB9的TXD&#xff0c;单片机的TXD连接电路板DB9的RXD&#xff0c;具体实现可在232电平转换芯片处反接。 (2)使用串口交叉线。 设计电路时&#xff0c;因为串口线已做交叉&…

RS-232C接口定义(DB9)

RS-232C接口定义(DB9)引脚 定义 符号 1 载波检测 DCD&#xff08;Data Carrier Detect&#xff09; 2 接收数据 RXD&#xff08;Received Data&#xff09; 3 发送数据 TXD&#xff08;Transmit Data&#xff09; 4 数据终端准备好 DTR&#xff08;Data Terminal Rea…

DB9 ------ 接口定义

下图是母座和公座的接口定义&#xff1a; 特别提醒&#xff1a;以上是公座和母座的接口定义&#xff0c;如果是串口线&#xff0c;RXD就变成TXD&#xff0c;以此类推。 转载于:https://www.cnblogs.com/god-of-death/p/9368120.html

硬件DB9接口定义

DB9接口定义及串口芯片定义连接 双向同头线交叉&#xff0c;双向异头线直通

RS232 DB9引脚定义

DB9 各引脚定义 1 DCD 载波检测 2 RX 接收数据 3 TX 发送数据 4 DTR 数据终端准备好 5 GND 地信号 6 DSR 数据准备好 7 RTS 请求发送 8 CTS 清除发送 9 RI 振铃提示 RS232常用的是Rx、Tx和GND这三条线 也就是 2-RX 3-TX 5-GND引脚&#xff0c;RS23…

db9串口(db9串口定义及颜色)

串口(DB9)连接线的制作方法是什么&#xff1f;串口(DB9)连接线的制作 (2)DB9&#xff1a;在AT机及以后&#xff0c;不支持20mA电流环接口&#xff0c;使用DB9连接器&#xff0c;作为提供多功能I/O卡或主板上COM1和COM2两个串行接口的连接器 串口显示器-DB9串口有什么用&#xf…

DB9串口定义及含义

原文&#xff1a;http://hi.baidu.com/askhua520/item/e4736b27213cf9d2a417b65f RS232接口是1970年由美国电子工业协会&#xff08;EIA&#xff09;联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。   它的全名是“数据终端设备&#xff08…

傅里叶变换的性质

第三章&#xff1a;3.7 傅里叶变换性质&#xff08;二&#xff09; https://blog.csdn.net/einstellung/article/details/77619150 该篇博文末尾处总结的傅里叶变换的图非常好&#xff0c;贴一下&#xff0c;以备查询。

傅里叶变换尺度变换性质_ENVI基础操作——傅里叶变换

点击上方蓝字关注我吧 傅里叶变换是将图像从空间域转换到频率域&#xff0c;首先把图像波段转换成一系列不同频率的二维正弦波傅里叶图像&#xff1b;然后&#xff0c;在频率域内对傅里叶图像进行滤波、掩膜等各种操作&#xff0c;减少或者消除部分高频或低频成分&#xff1b;最…

傅里叶变换的缩放性质

傅里叶变换的缩放性质 简介代码结果1.缩放前后小孔2.缩放前后频谱 简介 \qquad 傅里叶变换的缩放性质是其最基本的性质之一。假设图像 g ( x , y ) g(x,y) g(x,y)是一个关于 x x x和 y y y的二维信号&#xff0c;那么它们在空域作缩放变换之后&#xff0c;频域坐标也会发生缩放…

傅里叶变换性质----Leson Chap3_8-9

1、线性特性 2、延时特性 3、频移特性 4、尺度变换 5、奇偶虚实性 6、对称特性 当f函数是偶函数&#xff0c;f(-w)f(w). 7、微分特性 8、积分特性 在工程应用中&#xff0c;多次做积分比较少&#xff0c;多次做微分很多。 9、频域微积分特性 工程中&#xff0c;一般实数函数…

信号与系统仿真实验——实验二 傅立叶变换MATLAB的实现及傅里叶变换性质的分析

【 实验目的】 1.利用MATLAB分析非周期信号的频谱 2.观察信号频谱变化验证傅里叶变换性质 【 实验内容】 【 实验报告要求】 (1)记录实验一和实验三中的波形&#xff1b; (2)总结实验二中频谱特性曲线变化的特点&#xff1b; (3)实验目的和实验过程进行总结。 Matlab程序一…