From 994058a3390ceb3b3bae244db433c18b4ded99c9 Mon Sep 17 00:00:00 2001 From: CaoWangrenbo Date: Wed, 19 Feb 2025 19:57:21 +0800 Subject: [PATCH] update --- serial_module.c | 4 +- serial_module.so | Bin 37160 -> 37168 bytes test_send.jpg | Bin 6920 -> 22208 bytes test_send.py | 105 ++++++++++++++++++++++++++++++++++------------- 4 files changed, 80 insertions(+), 29 deletions(-) diff --git a/serial_module.c b/serial_module.c index eb92914..57fcf5f 100644 --- a/serial_module.c +++ b/serial_module.c @@ -11,7 +11,7 @@ #include // 引入 pthread 库 // 宏定义 -#define USE_FEC +// #define USE_FEC #ifdef USE_FEC #define FEC_SIZE 32 // 前向纠错冗余数据大小 #else @@ -202,6 +202,8 @@ static PyObject *serial_send(PyObject *self, PyObject *args) { // 拷贝该帧对应数据段 memcpy(send_buffer + HEADER_SIZE, data + offset, data_len); + printf("Received frame: seq=%d, len=%d\r\n", frame_counter, data_len); + // 计算 CRC32 校验和 uint32_t crc = calculate_crc32(send_buffer, HEADER_SIZE + DATA_SIZE + FEC_SIZE); memcpy(send_buffer + HEADER_SIZE + DATA_SIZE + FEC_SIZE, &crc, CHECKSUM_SIZE); diff --git a/serial_module.so b/serial_module.so index 6a5dec947d8ad8e1c1a05fa896b0f43db349f367..5a19e54161d17d253571bb0dc98f073b42e1908e 100755 GIT binary patch delta 2158 zcmZ8j4Nz276u$TFzGWA5VTr#*U>8ggQCCRWP8CQZBP5&{i5*P3=-BFbmHkFQT0>Q-DIR9% zT=W|3)J2;c5>zP!lu8j57v0dQi>43cZrwf&T?CE6HgiFms*|0gqCQ|!0bRj1S_P(% z=sBMTbe0d%(Zs3BtA_BK1Nvu&@Q=x*ADLl5T(WC)ICwHJoOpO>d24!V}cLfGGcj`fC!aup9bX%F90|!*EBqm{3{Ni@+NN9~Sr#33B#^!eZ&3XQ_wTEHt z15$av+u4sPqQ-g9##hkgP!+$B8sS3xmvkFcC2XaFY_yD^th*0Vt)r*4^(jX_P+vVj z%1xMp!=(B@g8aKR%Bi@s^_ZkTziFyay+9ZHV3T!bqUBj$16tKP`za5VDi`EZ{OQ(-28fSf{_&vno!9?zwXrs0Le{g;p z+kNmF=gR#&ji|+YKmG>iafovfry(v!T#Wb$;u^#+ZgJj(xbIKSTM>KiaDE-}VmIdm zXG41r=T^kqh%Y1N+~vFoQAS*kxX{P>E=FRB4;QDA@xwjNZy^T#g$dvZX2RF$$#e{K zrYD!mu$jYknp<>Oke(>hA`kiJVfZ8q{T#+m8c7==2iLcu6lpSeknV*8NUhL` zv=jP}J_b{Ug@(v!8I^kIn4ZVt66LWkJ!Ck+5*^Wo!3kCY4o7rSRT@UYZ*XP}&L|}x zNBuDl)0^t2W=!}o#1~IeHgoHPGCcJ*3OO{dU)gUPejqd7napcP&$xa=c0DmQ}-yC zeh8A=795wTM#D@_x|K`}8*PTCufAhrrr}cHe}PN#+KoXPS_{(VOl(@)<}6wUbW0X> Tg9GVqSc~*5v>~kr>Ph|&D$<(( delta 1962 zcmZ8i4NOy46u$ShueL?`6DU8Wv={`%Q4tZCPC!?EZ2m^cAV6`0xtS$83jPXUk4>n`wY@jy(GhA&hGc66*rh8~0UI zRIP10SzmYKdg%N2SBfLt7)R5fkJp9WHpr{GWFRJvkU-)~G!UTDg|CT}-EVoL)l`n& z(!(N^m7anxRJyP{F9mp$N)RQAR_Idcs7oAF9aqpf(5N+sr6kHZ8LMSfdzY+$KCPLq zfdC(!X`?si-4}AYBjn@?=+f!}F24}nE0*{i(9l@$557*X!kyr+s8ehTaVmWCQM2H* zj7qBq6FVjEYo!GS5pbO441-J)tnnam#~YkNkOnV-Ld10*(^Q6uHanEv0Hj< z+*yeMQ}R729XPr-Pfq^*A!8r6l};1v{HD3+vSV6sRj?HNRU*?qV(eR7Ooo>TTP>qf zb-&ZR5{c{D=nno#3dta?wW*Z2?_#E4x44Bg%c$Qr=QGAS_#Ui>oP3N#jcg)H6YSaJ z#X@{gOdQ5ad3Pf`i_jNeEtfO4Ba1!w0M6`u6WX*3Tar=kF>m-9%0<4flO$S6>OhdR z&LcGoV;-r4pCGfH&z08f7tZ%81=|JW$bxEpXw7W&qV&e|Lm{*?hA9Y{(P`turQBV7 zlDAAAQlU(2XH>9B+hy~VaeC<8$0QLp?9>x>x|ctYJ9o9;_cQ#RE!b|Jdw{&Stliu9 z6U->^L?Jjbls<-p$THdhha+=oDzM1I^a30F!7WaJ976_6#+u^axxi2W5fu9(-e59A)~y?>Mfivy4%@Wo*7>yz;24 zU5qf@^o3sESq-z@qJLr>t>}=6&mW9QhiU{-iAON|24i}}&4>#S>k*}+`8{GK z;tvCiH6i}?Cu41hfo{fn5w8t0M(|I0X^1f+Vn5=mh%1K~D@HtlxE=A05ylR2B%BQ4 z;37J{`-`ywME*7kz^zP%t~s%E6+A}k22+wQtQV!WV2O!GkAqVDCBo{YD4GBzXlH=~ zZ5o_NisEAX;g_Un&hI8XOfr~eqR@6}wZ+%}6K?SomEtU&JV{L?mK^l|2+4D!=;x3< zcN*OXAKijY1jHX+D!^&kUn+K!ikPd2`kzIZ8ta|k|fqlmuw@+^b*(-Jb|cLWa| z=UB%t!OT10n-f9XVP=k1AMb6AAHfpm0tF0nj@QDAHW!hf#6vmFT)^{QWX0oRc3wQi z_qR1a(XhuTJFPMh)do`TyBQ~(qgb&YI`hp`(@2Rz-Pt9

DNyo(Dq7qKY zhpMMR(R!2e%>#;P*s;DtN?7&IdsD@>4~<-)=NzGsbZn5rPe*qI+^a030&J)<;~9X@ zs+LeC^i>sNsmy8}7SF9N$4Xr|ZiT_>R_yT0nx)hQcWZP=4cgiSsezYkt$3muYaeOp zN^scC+EJt2J91vJOPm2a&6?+5%&eU$nilVOv_-V-oTQ+Y;MkKw*MnmtBlcgQe0CTB diff --git a/test_send.jpg b/test_send.jpg index 469e20876937ee695c673f619d39c63f1eca3bb5..ee402f9b2621b63e46ae9e55eca5cde51e8d035e 100644 GIT binary patch delta 21763 zcmV)&K#aeLHo&a`ux|o?{j>2Fx1jhN!&m+`@kXl+j+LcZ&v~ie+_odOw}}jrNXN3O zsbYNveE$IZA^zQ(H|?wON8&|?!<_`j;I9i?=-=>*Yj+UK9mcqBB-A6gxhVTgQ17$} z8WrFBw`U-@jz6g5(`|3GOUrwx7FgK;c;rA;fdnuh^#mT3^KZa^%`(=<{t6HAzfRKZ zVusq^!d?eRV2Ut_8Z26HU+_^YKNMK% zzp@Ja8f^mCN!zG@NAU@DU$?#4c{i$kkojgEo9)|372MxzlMzQP%f}RKV{s!SiIgL7`nybs zDoYy-schoDWBrHp)%erHhXrs=sAQ)8=0MT%}t2d$eV{(er=sSDAloyB~udF4g`MH^VXT-pj&kKEB%b_K)`J z+$_($+j&2K==%Z~cJJqRnVvS+#vc~{0Be7UpS3^i7vtS?;_aV=66;R!M0Oel&x9hq z5njOz*6l69TaCpcBPAW3OO3$Bn?ZljkN7Kfrmr{r6WijQzKyMYhI61M`OE@M(F@27 zvEcOcBi|nGtG{sM3j9>?)`js~;xE9@7XJWe>zYn~oul|KOw#AnwD>P(jkOiJ3vCN5 zK$LeG21X%3+A+z&bDex9Z%$EjX{mCi?-@?lP)l`WoAc9M8hzOo8z|5GJFg0~u<@%# ztra;axYwnI=Y(g7Z{eDqO0?$um0e3QK#dHsx~nK(m}8yIRblvL@IS?G{g?3j;-0lGt#W*=Cq%vQ$!V`Hor1*x zba0Eg%8l7L&T(BA$8BH0{{RyFIcKi;S6hVYcG^FM^vBT}H(P|bw9*#F=%SVR!%GY# z6wXIdFf+;gAkq9w;ZGR&cjDpj?bNzfkFDE(YBStKn}?NeI=qJf=Z%f|RMW-PrA|@9 z)^(~%ldATYBT|ZXQQ0nM?z^?iuUq|wGlH<#>`fZ^mRTGI8jd!e5*FvC@i3h_vxhUN z3icj4J=V7K^>;LSv88jM!4KA++^%EZsn`=5xi`m5CbjhMk9Pa zPH=h0$w4qC&Ybg!TukA)+W?! zH2q3wwCnquaSXQ>+sTGWBUWJ>w0jF6W(vfBPBT|`Bd>naeb0Ve(VYCiA04l2EB~JqgQQkrzqZdjUp zyq@!>xmd_2=Kv8-UpbJ@k*>gd^`?kji9$YQ>xvt6Y5*PaitK8oT)Gv$vn5Uuo!yd~ zY1t`g^^K&Yt?x^xL+5Er4T9qO`FwI}6UE|cVbwZrQ=S=9sSat%ljl-@P_NBSr75{T zWks~4z9QsquL+VqyGc@e9^b8Xf3wzwdE$SMo&@lS(R95;>Yg#vEkCohN!}}KktNhh zW0}<)q)ZOiV2nbNLbfqng}Cyqwh`YSUVr-4-+s>*N5a1lALB*dfuZYqZ-Aq-*EMYe zTXT&{)paX7XSRt-vb>Fd_K}d|XpBnOB|@3aC5(n$OA%62jF&I8tkU&P z%_em4EiN0y@s>X*!cw7LgymUbRw6IjR+E0u4N5bQ!6~^$a=nw~lvJZBMV$Wtg|)3O z!+s{Q*Yz(kt*tdwnZ#-fIxLFVP)-RTcR2U2)j!$0;%2$=tKjZ`pYbQez8{N9ywoo* z(oHreW){m0?C>OIo0f2~sAj+gvO=gKN9E_jR1$nq@cz<-f5Js+u#Qyb;W7AE>96cz z9)D*&FykZpcU}Jg)5Yy{;^&E3v?I*Dn}nKH>YO!h`snmYD{Fh{Z-!WGmR=s$tsFd- zGM*}gT}LagXF6Dam&q6?u3vhZbCjhwCZeOrl)19LG~8-Bh2%QKN~s2sezwEbzPliBB%R9RT2Lxq6Qp98(s&I3P z_0Nv*Ude2hbGcC^!i#9tNgpc-9f`&V01RaI^*H&9_L$UvB>1!9-xYYdpktu;GsC*B zkD^H;vWv_A03vU-+%7_#A^pG~I+BdaMR4X=s`z{?l^6TTCvPn-4Xo3iR};l4wb z=NwB)u4xwVbY%%uSGPNq;|g?>?^dLgUA^ej_LUN9n>sxgSzi}www^3&FCnk|3vGBI z-@D5bT|jn!ZotkmMsPFfTR*Yi?Fnh)Z;E$c3;Zu)lW6w(Mb-Vru-mge)N@+LOqU!YQwA9~!F3b3K8LoGNuZDA#I9K)$ov73H zeD3m%o2e@(#uu7V_oURN%ggpYfjUVt{Kxa_T^_gum%b9VB#%GF+Cnxv{{W@Nf2Dc% zhV^wf(XR1^JcC|^th4_BYj_C4o4n5-=>zIK?ce(?d(`!uSDHUAsO<)Q1umOsX?v$( zNnxpfTZK63nG{!n{@Xquk5m1iFXd)zeTvs|@ZZ|n>dxQehNkHviBc#G&e$OoTgHD5IVbs6_1d!aIVoRL$nCTXEgIi$q@L+* z7a8|Hoj$+LyI%=iTDOEX-9A=|JBx@>tZfi~fX)`m{JB-?*d+lYyRLeQW{Kd94$fh$ zc=N>;mIzgf*v3B5bjKVYEqF}!F2m?+N5j4vuwROne;Ir^sN7lTIuu6KCEQU zhu(@*#k&!nqm8IJB-cJcB-tTWgq>z{{SQCvb@$geg_>v!<*|gl`G!dwy#FD_Sg7aw$tLh z^t18L+iT-ivHLcD%Dy@H!QtC$$#t854G`OSayuIVbs^Pmq)SU5-5w-gwND1+=jGji z$K^Ypv6t-cZTm2O$^HfXpJg$;{vFUEk5iHYHa+{3JB9fI*Iyc%VH?E00$kgK?Xb9Ti`oyRUd>ZU(hf8ee^3_J(o{{Yyd z$9^vHAH(ezThz1-5=nG>-Ahb{X|(5QVG>IN$fcrfs&Y_*K*u-&zY>4pZ1}@g@IQt= z9eA5bR?&11?KjZBa`7{@;ZY>J&P1VJG{6`GZabRG1%k&sO*vPnrB0lGoTFsan`x!Y z?`EQ&i6wVt?Q1`&#_>N1tctxnuK_w(yiGV$tmQb$jAI!>ZP0?IrwLV+IJr4gl7wAI zB_%Z|?s$LVkHNFxVXCi(ET-{_z_!*F6KKX;lXkJJQ2^mGM&(=(z~hb^iuCPIK~IDq z0^q#Xv_q)2iDPFDptb{lb8O6OJElO~6c=Hf3@;=Mn&`e9_*cQ&9)V>(rQv-hJz_l% zOSxT9Y$G>2F03G!4?6+A;ZK*JzTUk04Y|`V;j+=Jq>d|zuA^C{o=~U@EK7zz!WFl3 z=zXj8Y_}lIXyE0DuU;P3RQX{jQ{}bwbtaseok=wpEu-$)ZhRkq6L^KfxV%mm1D9Yc z{ZgHH)~!muC)#r;`?15(oN2~Xs8fTf7&p&T_l{E5D*pg5X@lXHkGxr<{66?MYo*O4 z?xzjjw|!%yG(rtN-Nf!m^1)I}XabNyVgbfMuSWj>f|CBjT91Gdf7(01z8r*UR+BVd zF}H?nq&uX7J8RH?K>)13X@M9i%Q!Ls!Q?CJz69`BfqoHuUXDwj1KC^IKDQM5m9CLx z9AbDDP|k{}v_4}b4c(izYwR!E7vk2T@W!tM$6i+vEIG}>~7wVx>y zhGh_#vZwBB`LLXyBDW4>D&=));v5xOxXCy}mJs$$N(wN4a&nfpbJbs&tF0N|U&UOa zhZf)-T}rg@l;c*Eqlv8<*Q~KnbgRmBqfJ5*_HHnw)j29|oF>%W;(jB1Bk*RA`gW;QqXV-OSbLCnWE#wZrJF`aH5prCq7&tXwR`I8Td_&{Sd&Yh?@Mf%6ThwH| zhTBT<3R{?e9oe2mFDgNoBj~5?T-!3;muCp!uGmU zDPy)Z*R>%G#Xoka3_*7c1|;*&O>h!?A^0|)t$3$ivk56%CAIMU7iHtX0i3^z!@g-Jzxt+c>ru`7F8nc*=CSy2QfgDF2tie;7{Sl?iAE5qC_fvxI&_+UkcQV&b7XEn7jxO{aUOYgjajfjl`$N69P&3@TKnh(e_C=of+>I;Z&xe@7F^WP{U~&glEW>cmf30tS zh@qI`7bC2cCmT=QmDZMSo95E@`&YJ)U5_s%;(i0ks;o-O>dw9ztEq-=q!ebkl&QxT zA7uTarsA7aoi$N8Q}-37xQ~NT+polb44hyO5L%t28U3C+z8_sbT*B zA>DJ2`;1=K!`>PFmV8^`FBNH;`gp&8LcA7t@lIim_B1XLgMpIx8Qb2zxzqmuXqhbZ z_cq=GxrQMtyRDt=n*#3TowlrilFrP;z@cTn@j%y?QaQx&2KKL zJoY486}f|YDoN9DP!1bzcV%}4eZMq*)E~0f?EUcf!rH#4;LiYyIjpqVo+lcu)R>S& zSzGs#usAs5ryVQZJYn&RR`ITn3u*ol)I=7undh0B79ud2W3?n>zy*lM9G=z6{6g1k z^}Tteg5@WN?RHEVPF2y`EFYnN9sAdxTP&rHq~VH;X8rC~;-4+{wePA{*Gt;^9^OO8 zd9Mj(wDDO5YWP}j*t)dgUUBx)q?b1{f`#KbbGXJzUd>I$^3}f?_&xA{NYU->^_vZC z^j$wv@ZOnqbrpn?Nj=<+4qunt5Sc@tlwbn93}km+9f(K!Mp#3l=px#G-8>I>c%|p@OGIm6C&t(OGEj^jlr)>S2uIY<_3NSnSsx+a_eLE&=g( z9Qcdk{9ot9)emU)4^{K}y>iT3b4nEr!;p`57 zrFo~u#E^V&x4Mo)8^shY9D%Wh1b}}E-n@C#Rr>yh6sPR&+PUKJe$BrUBF(VyYB!V! zkVC559i(;6C9P?HJ`s53bOrE6rJ(AGZ+ECiIa?qlkjorWDyU=+fwi3DuT$E(T{B+R z?(Sa9M9ni?oun`sJF9m80L1#%m*8{aGkH7QTX>FbgxoriMWV)_l_7xr?;sJ7ago-g zQ+&S=mLr~j3P-zJI7$4{KIy<7)vW}ER1z@8M-_`BvD=P+N#xemvE6MOci1zE!K1NU zb0{PqdR{1^q3&AP@DKPY<+PH1!XFdutspNX-WHuvRB~9dSL3+Xe`n1*;62xY{7QL}@8H<0E&oc-Xn`4y!8&oOwr_5`!>xYA^o#Cm_miS$vZv$IUvTj`;e0sZ9? zV+;P-9@Re56x4aPOzpv7aTwXSQr+2n*+X9N#9A(i;cpwm;~g`~*8Cfx0jDpV_YgI< zkz;PpDn}b_Mrhk%Jh4Z>`D)&?rO&5nw%U_;+eW&7n&~EEX>PYoCA%T{R$RaoZv--s z%rU_#epd@ZO7Z(HS6zLbQShAmP^Ce$MQ<9I28y2sr$?71Un%e@lZ)nrR@8 zOLvH!*uzA6=joBucRq%{c*1kMvXXOYq_3jwvH1QvP=-3C>8E)+JHF>L;B9ilNuJxp zdaccWmF(8HHqxe+=HPki9B+)BfNd&BIBejO4;AP?x0JX40JIl_H2p8c{x;GyEfCsA zdvASpe3CG@yw=xDmb#OFTe4cKHl7&m3|#%A7#Pp*Sm%oK^Lmu4 zWpyJ;O-|2VwzjM1)Y}7vbhBzTYDG1BYtg-#^Y@Q!H1CGK2=GUTSH!j&#g?C@-`iVj zI(*9|z1TPNTy9oYVZoh~8S5FVUKQ884{z|kUmy6xOOi;JU6RQSoC@rIP0Q8SfCFcL zC;8VCc{dOV^D~p4ZP*K`{{UtE zMmF6!i^jmoyPgfQb;tYF`0SvZlV|ElO=$NzjX&cj?DY2wZFi*Vk^IARJ)ci(EXKAi zek1YZm+7vy+ZDpcpU)EdL`$>SO_QBu=m8nATb%5JBJcf;kgHzWJTv+sNlqs-f9 z(_no60DcgAdy45I*E~NQK%HjP4#dvBnf0po+V+B=IMuC>J*HprsIs|@+B{$5cf+p@ zpAKEir05p0Ud458Ba#Re7?)swpkxg7{&n;3i*(&bz*oA!yVfjqSS;-9rM7zsfOU!~ zp;e9JboUDxHZha0v!n$~q%&nejxZ7*s#OvHw1(2 zre1%Id~x6#Ws~Fe;)u(CZk8O3b^Xd$*j^fnMfm>!@Y25PAm>t4gF zN&f&94v_H<4cn`G4%-qZhwybCOOEon$%Bx=`P{p%A}0>+#!pjItp4 z4gvh@PS-0Jlz)VO=)LExfqnz>S8*{{Tnp zw31x%pd9|*$-?gR=Ds-i*Z%+n@c0+;l3jDe9};{EZ*6^l{{Ra(h;2w9PBVth!QJpiuyl>S&cwcLG&Sym5dC3%C|IUV6XU(@pUQ?CJ2Q z!+#KdIOukINY%BQiw4znxgKrvGQGk_G$|et+xPCQt+XO+Dw|Xv*s$38RWOv}R-#VU z-79Hx^E_S(tnrg{skg1$?|Xll<~rwvZ4R+%dSvo{l51}@qA>yqR*^^MR~hs*?_acT ztEc!k{s~2QuD6FG)JV}@&R1CobYtQRbpeWk6k&^kMhQSai=T~rRr_K123Cnfplo-F_PQvHLaI{0s1&nXW+~x{0+3H5*%a<0_NO zHsxr4rDEHQM5S4H@<9ZaYVvWvQFI-v#kH-I-$r_ro;p?O-jiCbds(M*#kAY~6UII* zv%7;yO+LEbm?w^Z?lr-FTuEZk^;)n%F(#}^k+MP8$z695X+v5N9Ofo8f`&nkI*FX82XN^wUc*x zf03LZ5O{z_y(75;Z_%sSUR!xQB^+jTQ{^z;21=Y`Aa^zAI#snvK?PB78 zD}b}baSoj$B#PJ}fdi01&VB2vkKt#>N$mc{ej00~FmMi@L8*z94u<;x?2GP^3L2OJ9IJQpq0-X+zbxR|m*ED^#p_ZP|xKpnYbUFCunnfb;D$GvMO zWQ=6J?sF1%r?OlD${-N&^8{{Yi89DXfck9Rn>@h+c#XXO%QG7wjy z;SVSL_pdSdlYcdrjddV|GQ7dck7QN;mD5%GsT_Mj{EV$C(tB$ZxQ=7F#!l0W9GrCT zT_=c|*HG|nqH8GZWrE;uj|Io?*SABRfS&w)YmU;dbxWuOaVo0+01A^`yjB-lzksY# zXH}JClP7L+4Ab%XFX>f($l68_e(~xS(FkD(qu!*Tax+D6EfMSm6j4z3x+seDxVCMJ zl1Ko3PAktpYF`}qbKzgYNxXC73y7_)ZTv-}y~OgIC?`?1Op2 zVA?zf{t4~z7T?7G0JJB@ZCAthBJWPT@eTdfp3!3yMs+)*8>@9AYm@lb%0KW{58G?v zuf~svULgIHbx#55x+jJ_4deT%Z3`J>zP-4B+*_r@k~vja-Z`DtHH=_Lxp%;0hwww= z?~HyD*#7{+cksi1#f@Qcd#o>+I@`wL;@OSU$bltNyx?G!AzKZDji(>}3U%YlZxR01 z{vpxzzYSPvH@Z2N*6r*q!hdKq*Aw1HcP8BKk)peWcN3gMql{pECO(|0`^o8KzT=+@ z2)H))U#auTSxFU|Ukq%Ka1Pw+9|#gMdJ<8!>a9B|<9gtv!D3$FY}IsYWhP==JnGr{Jx& ztER%f5Qg>TirN77&hQ~IMmC^MROENhxdQ+IJ$Fif@b&%Dsh(W?+=FQk2dDQd%>Mvo zmA&z=#eWQ5_#eYM#;v7X>$b_RMW$(QBi!lYbr&iW4d?=^W!D5_AdaWs{{UwVZ{gOl z`&fKZ_+#;N#kQ9EW`pA^yB`VZH^r^vc#`h!5f9oyPn}gQ_N-fWre7lp#rfY)>70BDUQIhos+V z5ova@V|A+C+AGb87#4C|mK)1spupn3hq(Ab;FR$7^IB+uWm`!MP4<~i*Vu5}w_{x^ z15)xy>~ix)c4v@8v9^4TZ9s$Q<$o%c=f#=6)uL2gSW@0LhZqP0FA4UEBFCYtnusmY?Fy zt-1TZVX`5Q0AlHmKc#ukh=^Z~Isc9Z9?6owc?&PX^r)p830fwjcW~Z--BwD9aOQrh2ULJNT9ffEyCg^YtZh z{cFzrXK8PB;$1=7AjJqE70y9H{c~Q5vJdU3qIrgX#^+!ier4zI>G;9ZGK3t ztfiG_jq@yNm0Tu3W7|BBsTI*xK6U7DyYfF%7eLd5QKGb98~{ia*+C_So1vqBUCgn? zyDD*#-@TmR55}@IPYmmmI>`-`*;L7r9V1b=wSvi*t<%95l#Mzd zc|6H7zcCp&aCr9huC92(D&{odE3?r+z{M0%US8TBxKTwFotZ>8@Ee;sAp?>)uQ>g# z{3oP%^Y(n#yba<=FD278dqZh|smG^-_Lqg!hFG{iIXDA@)bU=LeJcmY_Dyx+WR68H z(caoQTx78m$H(LSXp3>0XisDEf5RR<{f>M+cdYy}_{!ACyV??VXJtL;KECH;=9P0>o@j)){{#&pCoG2 z$svn#5N1MhGB2FacOC#+`8JtJk*VwmN(MgnxmR@xm11cKllg7p9VZ0o*DT60O8Mt{{Ru~{Mu;KDqv?2P`9{2Kkb{uX>I)%-D`cpvt2PYYLPUyf!DI8{zd65TVWPwPTlgB!U!Dl`K=T)Tx)Dl ztfiYHXxJN^jAN~SmwwVd3jLaN?*QEE9}e`N45dtHblq(xm6LQp6-1eXM(WcX z?Z_%}K^4!8#8ty$9I3@@wR^4hJFt^Vnp*1G)6FHR<3I37O(R?IzwIO8Ukz&-X^LBD z??c>2eq@edZ7(10XKLWTQP=RL)PHBci$5HHX`hYX@T)X2buORr8tG=ZZ9*$?YGl5? zD&M?iEPr-?$19RC(>N8^{{X=^^)ClQ`$t)LgI?5Z>_4-#X8Q;Bh1$X%Nm>{|48#U~ zvPc5=&lxzcLH&;WWui9A*B(vcCiIndf+z(zR9(=FKIQo z=P1j^e#X1(qUw77hdecsK56j6ul980f-`nW7(d)fvvCeaMM2?QHkl))FxLm4!GFT8 zT}G&XyR+ByuL0Ycl_h3*KgA1k{{Ra<(PCUNva#nKf72Sg&&5zl2ge)PnEm}K*?c2&XI#(VXxq?(PHk6W0(vg(VEh|^qWmcM2rr&cxfx5K%l zPufHwAG(LYZpYZQ>VHMAkN*HtH%sGATcGLCNX(3i0S| zmdYlwGCO&3Di@Ia&4G-cdUfvVM_!+Qse~rgH|i#b;!8^?V$p1LO<(NKF#W;TFqtHC zwP6F_rFK3wyC&ws_f7DwAePaM%l)$(8Ka4U^ye!f1oqkQT)&5{R9{0WPCU_%VVdgv zNj$UodfL`Ai5fW19f7sC=Bi7bCc-tOlSuVoa&iwt$i*!bS3gs?pixB?HXXu$vixNs zi$OB~0CMixkI+vUtv;veTpz~&0Em!yPSP(8C5)FBx}A&5V+tGwk#B5mmm~sI2fU1u z0m6njIKh-RvG`T{bL%>Hg}-YL9l@#T^M$y)j^Y)w+k|QDp_(_&;ea=*;Bt2CJ90?# zjU(cQrK@We`evu%TY+Y=?O7*(nU&0h?HNBZk@Es~kT!-Jfg--9{{Vuz{>HvE@Q=j% zUyYh1?D{{98a+Gg*LFrTZ+Bs53>XfrB9)aPc@&bQ`Eqqo3HZ|c;m?aLuD`ROvin4g zjk-uf>_!Y#kg)^i1$hHKMRruf)3v3&jWGC$IHtB*AFUoH_{H#d;fKM0eKW-07WG^B zJSTViOzT=_i7#!Uk)%X>ObJ7beezor1!9yVe7l6Sng!;mHNLHW zk=W_+2bN!wPld&liIqoJEmv)U-Z zk+(>!B*-5s_gsBJuLC@vE+#s3J$$WRi}e@aU%>58_LBI|XYiBakAyXi2TZuPlHz&n z^$SLs<3;l@84T)wG4h^3$pB<$BkHSv*el}Bo{_Gj={h9tN zcq`#g#i_h|@efn`4wI&MS*`7_9U4Gpp7zS!7ZIr^JBJ{2B#;Jc^jhl1-t7c($J3(@ zqPy}ot6|!jvQMGQnERF2q40Nt{4c0@clMFe{130rZVjG)qxO57c6TvP{*elTRq>TE zw*Zggud=LT9!ZT?7(n%?r_@=Wr#f>v?8&=xPlj;7F+}E0XV(`w3t9(a^HBBZPguBzy z36^-ntEvekT!Y69GxZhe-xOw5__?RrcQ$sN4@_MO;r=N^vHV8T=RF?TfH?GuVfx~< zrbBjDGky|yXG`$BdajqD*e$)f>MB+gJO*eYC;tF{)n1RN&uwpDMZ@g?sQ*9c&THGvfMV1N9I;;Lw z=1Xbeh)kB#uB^UWV7lBS?0NqHY$^QM*QM$HS=78o5eFj9KgZ>gyskxkvrJ@J6`1Xo zGm!lLpF_<$$@^94bH_-0&C3llLbZu6?0iap(z4~Fvy)9_k?=FL5X`%eL6Qf!tq%gl zs(7ozKil_S9!r-l&|BH1*o*~5NQarYsoYFlfyHv#L&%qL24YmUah`^|j~nYVcxP5~ zq(>UT_A%#Lyg{Rw2XNbg?~qP<@_FX2!i$G1x;+ttmQt;N56m&widq3UA(x!>qPd=b z=b*LGs-VX7fg)BVFh&0`1%`O-Xw(?8%IU+5d0BJ4N26!y$JJr#*Hl);lC1pczVkA_V2>_gtqN#<+R^xjuRePKsXMiy$HrWY}Jbk zXAm;2t=e#Mlirq7{{WA+Yl59SceyZ_MPU z@Snv$99Z0G7h2|>V`^lG7Ppn9R!qVG+>K5~dF+(kqw78Ne z-SQQ<3ELdk)Y_-*Rqz(YUgt>h9mUyEk#7Zrid)zj0)hCEUn_Vc;NQbtFHw(Iv+$fo zX!Eq(T}?8Kj1jU&Wj~0oNzwc-;gKJZz8cfQFvh`U7zgy`zK$5VM*e4n(&o6&hq{b9 z#)j8c?U0u*8xV7U$P1t5D_;Ey$C3%=t=Z`scAIbZeKNueXvy8>Tf(Th^}>Pq)LMWA zN6azLYUb(^e9q^P{8@w#ih69&K%u_HX2j#EH)M7FKMLT!E8Q79b)+*KD1ngi(CnWd zrFu`rYh`bWI&8=8jWW=%9@nk@0=$3Y4~aBLJXd5}Qnz1!vz$y!-~}d2$gtTw9q7xC zRU)pI%$eDw9vtv*hkQY)>X(x zH~oUp&En5Bf~eeBkHGf)e@gog;XJ55DR|iDK3#^8t)KU9PyWqY(07`@V;cKEQ>)VE zk+qK!ZcHe&h_4-fSwF(On%4RB*qNc&+rSPTcwy*&LF-ZTBpi8NCym(n+21Y+A?m6gq z`gN^;60=58dNbCToScsIloH$=bv)5rl3JdU3QfatPT*#ikYusQ>C@h#MImdE_`Ben zFCJ+&{vWz!M!fq)v@^6p{D*6K9VGzqxg?4=9_lNutdAF6OJ^0G&9p{I(&ARPjDH)8 zX^3CP6r$X99j<Z4UU&_Zw&7mwdAvbBE}t9jiVqFv~!c* zyt*A)`QtF$%^^DmRir2R*HR*Ue(i{CaBGC|x5wXsx+br2VWH{%AiP+nVHuXn81~@c zjG1yrq1rx`Ib0M}p%LaT@=`q0LU*@+_@Ewrn}@`ESpvT*z{@$o9)vaz*1o*c{6%!u zaF`O@ySYfV1`D{hINZn69+mNKov+*YyT->>vq`L@yYY>&iIJ4NBaj#p3hn^skU%|+ zeR-$+AG5Z;j(d+E_?Gah9NS##phF-dozX;yr|XYTYMk;O{2lF~rd2el$u-n}#`v4# z?-$zm1H^i^ovE~QTIg4|I&`q<@u7-Dw~>*9g~=eOJd@k5YmNT^f`5E}@g2?8&xU?1 z{94s-ZgtDsRMNElPU7a{%zg48DS*is1^)nxXy=ZV>6!<_AA=g_h;1$WXB^XMf7)?F zskQE*Jkh}skSvT6M`ajN-4~C4O6)ve@O$=l@V25gPlP@d)147^eZ1Iy_BRYjMQKzr z0ERP#!sL_O*A5n~EIlb*UFqs|;vA~UCAE)k@XN-7_mTid_p7b3)NCzLUTdUL)k!1L zzHRV@?}#Lh(@L<_bmol8V^|}wxw@V)m+FwY$4p~r;Euih2TSnxj-+va*Z zzPMSAhvKOKT>k*1Yqqv%diJ%OKaMKCtMDhp+QY{#tKj`IUo5dt?Qay_-WAR{+VL{| zernN2T}=6rgYnDaE`_0g_~y!8Qsr&Dy*|{dPx6nJ?6ExiSC{ywN$}^6H47gVXh~^$ znuLfhgy<%QMOm+I0q94~=DP;u0>F-(_8$>`0r-mB#u3=rTF2jo2jPIO%{kq`7Vq zvq-1mtyOeu%}-B)5>#HNmZ&&U??urmxe60 z3(Z4Skz34r{f)J-2vkrq0qb6mqFKjdqd{+Opd!l0VC|M;{cB0v*__)<%l&|1SJ#$e z*dYnVe)k{!diwW&;QT*m_?_e8z+fhlgO0-8&ObIa@<;3e50$Hfw0z08+JbKTDf<8BEas%)Ffp&kT zZ&#cC(f%@*!8ZO9y|Q?I-Ff0^Z1kw7eW^X{npU8HE#fD(`F1bWsBz|2K%S@0-aq(7 zXX4-4HZP1?MZtzGd&O6NDk*Y`9U;_7Xw(JcAT%c#{wDP2PiHXh zG^LR<$_*nGw(X(Rx=F*qO$@<^{YIfJKO6Ma$ZWtCN0Z7z)A)jnL~Bv+UC zyG8w$bPpJ6wi@@r&2HmRhW=%`8kVDS$Yt{zb`~qEa;kcOLBKsv74~1kUxNPt19Y29 zj}?4ue-z(o*7EsinjN%pMj21+We$;w>c=eYAb$CX(8x)5l8 z@Ubnfye*;I==yB_CA69iIvHejw?$ag^CK}JxMRy4bm@xwcf*aXUCZWcns<`yxlNIO zuFwZ!cN3G7$4)(JPuoBC5%^p1&%vGx)cyi|F}eQOyZC{pSxnJtHy0C5k_k8>S7brC z7cKIt_u!iL4JYK93)+D;-U7V7Mo6-flHVn<%M;2aV?sLmaeE?DQI|uXqt@LZSwejEw^)-pDMtA5JHi>WRI9CgZO9GqqzV?4RIzKkU_HTj0KmHyx+#Bmw__0ADiK zbS+~{C|_=s;Mzy+!}}3@3h-u`;F1>@Ai+8HptGjGizE z6~=hW{tGSpC1_WM-^13vE7!4~-s$=(!x_dq+{qhv{_T5|<0!!^T=C^jbDL=&RNTY> zBWdHD;<5EYqX6cJtUr$Ql}vykgl_);w~XWU{cFiQTH(A!r^fM&{{X^4a-i+# z78{N~TJ`UXEie2gnmUj%Ye+hTs=ZuW8 z3Nei2;0oV`9imZkRI-phR^v58#p@ilR+dlFYxq@x9anJ8X=_-REe)GVeA{(mGDzn% z@Nn4AYO8HHfl*ilMq-JbQr)sIOr#A1&0Gk^nh;-ZG<%#@*Aa0-*&rId+l z$NvCo%LLRsSMYW@qYRP!e^yDpVUVtxCa%%3`bZG_5Dj|;c^B=KVyEHuk>Z)JB!=I^ zTI8C|@rEBUf7atUUO%u$1!w;a_{_`&ol{7lvSAMoqoey?++EcX!T+CALR zG~gLZ`OW79-~vy~J8_PB*XJjLEXJ{|X}V^%?+h2x#|_&?c8EUtoUT zx~`S*7xp&su9Kzs_TuZsucSe7re0rLr828fB0jk$!Fs~8pEV%^Rmr7jmD$pq>?JISMqlcF~DX3;G8i7sjpY@ zxBM3O;og;hCAY(mfx5o1f!G_pQ&x`3Hs^whi7OC#{M%2c2a5PR@DKFt`ys)5^qU7uH^v})!GQI5$QJ}~{DzCHNuN_flTKa2Hf z$>uA)a^^_+f9vv>+CMJU$w>s#N#c*tyr4&*-2kCAEj6R(Y726oF4V0 zX;WHR66(t0#SHBz4< z>H1gheyRuAl#|K*Ym*e6%%t`_zvAm{@n(+Uj^PXk1F8Q2N>N@t;|Z=}xsF>%{Mj4D z7Yh_wf90FVx!`)9P6u-FhgQLTY>shfGD$WIpB z0nhzA&U5TRHH;R9ZP>HmwwC8c7Yv-e%!eM{VIR`FZwx8&ZQO!^l#X-G9fslgewE4i zUgX?D!g;*HmvSqy10;szoB_!>C)AT(si$~df2a6$qj-rFE4*?Iz;enba6e2B!nLU- z7^U3v@fe8FsRaJhviq)a{{Zk$n2gs8DD9kgC*`lPei1j9uXxSK&ULF`5B@93Ko5+auDYyJ-^TAUtWACeYd_WaG;j)3Iq6Q)?far>Y=~O{EcfjZ<)QRF&-7v ze_Zpr(aD5M7NfH1=MD+wl@;I%2F>dCUWQxCy!HD zeiFEjO*u$I8QgcN>-g2le)Qy>+)_I43wdVEniL^PQU-Dd$_F2nMdLW!uAOonhn1+p zO8Sk%{{XF0cyX2zZK8;(1siZl;|8Vie@tmEo}ypjm@xW)O>2H;WkL>}6&CgjYu32T zPtM*6$E7|?w^v=vah^VvOGe(_Vz*X3X>XXU+Y4ZW+PIoMQ(NtxWLpOrUQeY!vOG5t z76)$NKBu4lwMS;HA~Uhi91&7#pu-$WrIeseh83M{Z!{8Go5Ubo1#p1# zw44n6M?Z}&yM~_Pe=Kf&LPNV8kYRzj{{X(fT3uS72v*PlG;fDdXi1>zvfO`Z_*+lZ?pkRT{Huu@4iu;#DJi`{7*opCWJY z{cF-bE8R{101InOe}yDG>DHxr>Hd`e0O4M5G~RBbcd-4>7+i-3pZQ@Y{{R)5#*#*J zE%;!O706Y={?M0!+~j}ttKD?zMW@0|2TBqW(doO~?Z#Qjlhgg7UJ>CNi+Lfqk{4MT zJw|nPLz1o-ou?fR2srd3+P%5%(Yz6(IC1{~AUkg}pSpaNf8+B0bnC@R3HCT@(2Z)4 zZ|uANhY$Y%1n>-e=Eu#ml21?b{VVJL0D_Z!vR@XlOk>3xKku6xMgEoYAN&)uaf)oG z-i#5DeXHxQfGof9S2FTH;VqOO`~|hH${IhH`4?SlZ!>qt<|{7(UGJPkJjllK_`x$M z13sr9el>xje^|ZkjBs9Eoyvekb~#`$FdTmu``vnHxvjs6*3jShG2l6PM_Z4e$)LMyOO@A&nDhFP)vm}$;#?p81Rjr+a1UbQM@_N>s zimK2u9!`6DS2IU1-&MI`!b z!o5cef6u=)o7ihf8n#3=qB8eUijj%gkJh5FIkSssAL`eqPL%l=0rg-%TAqbAd{_Sf z1*5SyKMcGTdE zRL&1_6lRv*D4}mD2^r_DXrkv~qt|F0J9A~ykzCF0;Vxji}}goFoV_Fnp)@y zxgzuttP%%|;jl(?MzF?RJ)!`T&Z7YPe}nxhrL6MZ%pkUNEQgSgu21D%r^3I0{{R>M zGx*<5_;c|80KnH*TE3=@C8e$8iE0`(gwA9wIY1Z68^I@#Ml+F}qe`r`OGITk#V>iB z=ZBS`u$>tQA=hZ#o;I5O;nw9*Wec9_ITiWi;6L~xm&Z%T^L`?HSn$4w83QY%f5SGR zARWOBAW(jc!1L+P=x2yba9hU`4i|;oeXENWf7QB@0KgTj zlw1|eFL@6C0D^Y8Wj4sJ$ID_^M#WSCo?93P*qrlUTK>+>Bii`5$a3HCncXi=!V7Re zL0>KZ0Kq-3e47RvNhTqmVUgCpr~RKw{g=g)D-1V{FAjc*3jY8~+MmVpBB3|L=yiB} z1#M@i*_q~TOpFQMJT4_|f7wP;*m0ip{{R6?;t4Gymr=Zm7b&(dimXDDxQ)yU5J@Kl zn$!4`a*=p;31jGQK>q;8Ub#ItUAaY$(NwbZ;AXb8WjAzldr899Ju=$W6BE0ae$L$E zKAw~=t7KnbxCHaYIpVSOtz{0KD3W3OrCh4ENaS^{Z(Q*}isDO)e+Lm^eq+X1WK~%t zQk#{mZL=WMV~7#=bAehVw`_dmDd1KV7im7Q7AZq1UI;a>44bzh-~(LGQ?Z(s?#;8% z9D!1`y320BD9IdsYAZd`LlNT}4r+L&h(gS&PtHJ5)ST99VXauUv9dskj*2tIHtt1= zFwA(~q@PR>Xn`l5f7u>MHZcQmPvy_^{#2J>3wa^~J7WYAbJsN~Y8?-cf8ewPAKCu^ zMVqu-Lgo=6jNs;2uw-O)DzZSk1duOSC2|YlLdU%~ z=h?D4;{cJo8jMqBlw_2h&IPWehyv~x9m%NL^oA0NjzQpx`j6qi>}&9UM%1Cd_=Biw zo*|As!h0z0MU+zxagu?gPIjIjoDtr=8^a$9J_7hAadF|_h59@!k`{tnh)vY7^PCAM zF8q4tsn(|*e+~Vu_D9G601v(l{Al>SB9Dgu01G@z;sj|n8T8F2X<|}NK4}q3C)J1o zzJmB&{{RGU{j>fcDqU;ZCx?6?3o`Ss>uV&ghZ$v#(PufwXDEJ^_FwGT@%H}r#L3{j zV^T-9TLxV|GZ+O7dvJh&IM^Gme(2}d=)VhiqCG-Ef91F!4_=t8{{2;Uk+nQ zEq)5YtlXd(yYVgb*W1WB$%)&^{E!OwR@4DdHx4nJQrq2<-z#u^t2tt7wWGJ8m7Jce z`4|2Qe@*ab!&+Cve+c+5;je-;y)*54z0`KlX;x8MM3R^W&J-#Q>=rzp2L4FvT$lV4 z&*8=Y0E~Q9@b}|ShwP!bmqUkCvGIk(vZ`F$#4YBxvy*EOWq_%M6=V(NwYvt|9dqmd z0Ps;;X>~sjcsJ!N6U4b75rOh?oPs*zs3Rb8e_u3y!u}tdMg6G$7hhXVBx`YPuAz&{ zP_C zZz)God#g6#oPd3ETT*GQMI_?2M^o@ae_VrC@Y?D|QHk%TWdvZ1yLAT!y=M91xzZw? zoxgK#q-;1CRc^kclV3D`&sIAAk7~XZ*6$d}rCrGzJZyH%eAoHGI3yjT836j@rF|3P zJJ~Hf9X-Tx1u^OFzz%W*eNWe|X)kqKv4YlS-~1EdiPL3_4iR}E{{Wv;UsHb1e;c9E zJX0f{8^+p^A5F?XrF^mf00j4%FYIZZatJ^_r!ln z=%r^T=w)9;^EJLLUnQS|ESh<7=IUWV-TuUC@cxdl{%Y zt81K7oLx>wy^m#mefPw8y(zPhxL%9+^ q4I-uoIU5+C>0IU2+?E#?F>cIeFrkZdCpCpelqCF(sX@v~Bmdd6&@{~e delta 6355 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 Vo2BC;8T6`B!Wi?{-mO@J|JerCcQyb3 diff --git a/test_send.py b/test_send.py index 3eddd33..fe9e1ad 100644 --- a/test_send.py +++ b/test_send.py @@ -1,43 +1,92 @@ import serial_module import cv2 import time +import threading + +# 全局变量 +frame = None +frame_lock = threading.Lock() +thread_started = False + +# 摄像头读取线程 +def cap_thread(): + global frame, thread_started + cap = cv2.VideoCapture(0) + if not cap.isOpened(): + print("Error: Could not open camera.") + return + + # 标记线程已启动 + thread_started = True + + while True: + time_now = time.time() + ret, temp_frame = cap.read() + if ret: + with frame_lock: + # 在图像上打印时间 + # print(f"Time: {time_now:.2f}") + cv2.putText(temp_frame, f"{time_now:.2f}", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 4) + frame = temp_frame + else: + print("Error: Failed to read frame from camera.") + time.sleep(0.1) # 短暂休眠,避免频繁尝试读取 # 初始化串口 serial_module.init("/dev/ttyUSB0") -cap = cv2.VideoCapture(0) +# 启动摄像头读取线程 +threading.Thread(target=cap_thread, daemon=True).start() -# while True: -for _ in range(100): +# 等待子线程初始化完成 +while not thread_started: + time.sleep(0.1) + +# 主线程处理逻辑 +# for _ in range(100): +while True: time_via = time.time() - ret, frame = cap.read() - frame = cv2.resize(frame, (224,224)) - cv2.imshow('frame',frame) - frame_jpg = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 50])[1].tobytes() - print(len(frame_jpg)) + + # 检查帧是否可用 + with frame_lock: + if frame is None: + # print('frame is None') + time.sleep(0.1) # 短暂休眠,避免频繁检测 + continue + + # 调整帧大小 + try: + frame_resized = cv2.resize(frame, (224, 224)) + except Exception as e: + print(f"Error resizing frame: {e}") + continue + + # 编码帧为 JPEG 格式 + try: + frame_jpg = cv2.imencode('.jpg', frame_resized, [int(cv2.IMWRITE_JPEG_QUALITY), 50])[1].tobytes() + except Exception as e: + print(f"Error encoding frame: {e}") + continue + + # 打印帧大小并发送数据 + print(f"Frame size: {len(frame_jpg)} bytes") serial_module.send(frame_jpg) - cv2.imwrite('test_send.jpg', frame) - # # 创建一个大小为 3.5K 的二进制数据 - # file_size = int(3.5 * 1024) - # empty_binary_data = bytearray(file_size) - # empty_binary_data = bytes(empty_binary_data) - # # 发送数据 - # serial_module.send(empty_binary_data) + # 保存帧到文件(用于调试) + try: + cv2.imwrite('test_send.jpg', frame_resized) + except Exception as e: + print(f"Error saving frame: {e}") - print(time.time() - time_via) - time.sleep(4) + # 打印时间消耗 + print(f"Time taken: {time.time() - time_via:.3f} seconds") + + # 控制循环频率 + # time.sleep(4) + + # 按 'q' 键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break -# # 发送数据 -# data = b"Your binary data here" # 替换为你的二进制数据 -# serial_module.send(data) - -# # 接收数据 -# result = serial_module.receive() -# if result: -# frame_number, pdu, rssi = result -# print(f"Frame Number: {frame_number}") -# print(f"PDU: {pdu}") -# print(f"RSSI: {rssi}") \ No newline at end of file +# 释放资源 +cv2.destroyAllWindows() \ No newline at end of file