From 0d906284e15fdfa29221a5b64e2f88ee06ebd342 Mon Sep 17 00:00:00 2001 From: CaoWangrenbo Date: Wed, 19 Feb 2025 19:58:05 +0800 Subject: [PATCH] update --- serial_module.c | 123 ++++++++++++++++++++++++++++++++--------------- serial_module.so | Bin 37160 -> 22184 bytes test_recv.jpg | Bin 10573 -> 14573 bytes test_recv.py | 20 ++++++-- 4 files changed, 102 insertions(+), 41 deletions(-) diff --git a/serial_module.c b/serial_module.c index eb92914..9afbb19 100644 --- a/serial_module.c +++ b/serial_module.c @@ -11,12 +11,13 @@ #include // 引入 pthread 库 // 宏定义 -#define USE_FEC +// #define USE_FEC #ifdef USE_FEC #define FEC_SIZE 32 // 前向纠错冗余数据大小 #else #define FEC_SIZE 0 // 前向纠错冗余数据大小 #endif + #define FRAME_HEADER 0xAA55 // 帧头 #define FRAME_SIZE (240) // 每帧大小 #define HEADER_SIZE (4) // 帧头 + 帧序号 + 数据长度 @@ -32,41 +33,49 @@ static uint8_t send_buffer[FRAME_SIZE]; static uint8_t frame_counter = 0; static uint8_t data_len = 0; +uint8_t output_data[8192]; +static int output_len = 0; + // 定义队列结构体 -typedef struct { +typedef struct +{ uint8_t *data; int length; } FrameData; // 队列相关定义 -static FrameData frame_queue[QUEUE_MAX_SIZE]; // 存储接收到的数据帧 -static int queue_head = 0; // 队列头指针 -static int queue_tail = 0; // 队列尾指针 +static FrameData frame_queue[QUEUE_MAX_SIZE]; // 存储接收到的数据帧 +static int queue_head = 0; // 队列头指针 +static int queue_tail = 0; // 队列尾指针 static pthread_mutex_t queue_mutex = PTHREAD_MUTEX_INITIALIZER; // 保护队列的互斥锁 -static bool stop_receiving = false; // 控制接收线程停止的标志 +static bool stop_receiving = false; // 控制接收线程停止的标志 // 前向声明 void *receive_thread_func(void *arg); // 计算 CRC32 校验和 -uint32_t calculate_crc32(const uint8_t *data, size_t length) { +uint32_t calculate_crc32(const uint8_t *data, size_t length) +{ return crc32(0, data, length); } // 解析一帧数据 -int parse_frame(by_ringbuf_t *ringbuf, uint8_t *output_data, int *output_len) { +int parse_frame(by_ringbuf_t *ringbuf, uint8_t *output_data, int *output_len) +{ uint8_t frame[FRAME_SIZE]; int available_data = by_ringbuf_available_data(ringbuf); - + // 检查是否有足够的数据解析一帧 - if (available_data < HEADER_SIZE + CHECKSUM_SIZE + FEC_SIZE) { + if (available_data < HEADER_SIZE + CHECKSUM_SIZE + FEC_SIZE) + { return -1; // 数据不足,无法解析 } // 查找帧头 uint16_t header = FRAME_HEADER; int header_pos = by_ringbuf_find(ringbuf, (uint8_t *)&header, 2); - if (header_pos < 0) { + if (header_pos < 0) + { return -1; // 没有找到帧头 } @@ -74,7 +83,8 @@ int parse_frame(by_ringbuf_t *ringbuf, uint8_t *output_data, int *output_len) { by_ringbuf_pop(ringbuf, frame, header_pos); // 检查是否有足够的数据解析一帧 - if (by_ringbuf_available_data(ringbuf) < FRAME_SIZE) { + if (by_ringbuf_available_data(ringbuf) < FRAME_SIZE) + { return -1; // 数据不足,无法解析 } @@ -89,7 +99,8 @@ int parse_frame(by_ringbuf_t *ringbuf, uint8_t *output_data, int *output_len) { // 计算 CRC32 校验 uint32_t calculated_crc = calculate_crc32(frame, HEADER_SIZE + DATA_SIZE + FEC_SIZE); - if (received_crc != calculated_crc) { + if (received_crc != calculated_crc) + { printf("CRC mismatch! Expected: %08X, Received: %08X\n", calculated_crc, received_crc); return -1; // CRC 校验失败,丢弃该帧 } @@ -98,8 +109,13 @@ int parse_frame(by_ringbuf_t *ringbuf, uint8_t *output_data, int *output_len) { memcpy(&output_data[*output_len], data_segment, valid_data_len); *output_len += valid_data_len; + printf("output len: %d\n", *output_len); + + printf("Received frame: seq=%d, len=%d\r\n", seq, valid_data_len); + // 判断是否为最后一帧 - if (valid_data_len < DATA_SIZE) { + if (valid_data_len < DATA_SIZE) + { printf("Received last frame!\n"); return 1; // 最后一帧,解析完成 } @@ -107,35 +123,51 @@ int parse_frame(by_ringbuf_t *ringbuf, uint8_t *output_data, int *output_len) { } // 接收线程函数 -void *receive_thread_func(void *arg) { - while (!stop_receiving) { - uint8_t output_data[8192]; - int output_len = 0; +void *receive_thread_func(void *arg) +{ + + while (!stop_receiving) + { // 从串口读取数据到环形缓冲区 uint8_t buffer[FRAME_SIZE]; int ret = by_serial_read(&serial_port, buffer, FRAME_SIZE); - if (ret > 0) { + if (ret > 0) + { by_ringbuf_append(&ring_buffer, buffer, ret); } // 尝试解析环形缓冲区中的数据 - while (1) { + while (1) + { int parse_result = parse_frame(&ring_buffer, output_data, &output_len); - if (parse_result == 1) { + if (parse_result == 1) + { // 将解析后的数据放入队列 pthread_mutex_lock(&queue_mutex); - if ((queue_tail + 1) % QUEUE_MAX_SIZE != queue_head) { // 队列未满 + if ((queue_tail + 1) % QUEUE_MAX_SIZE != queue_head) + { // 队列未满 frame_queue[queue_tail].data = malloc(output_len); memcpy(frame_queue[queue_tail].data, output_data, output_len); + printf("output_len2: %d\n", output_len); frame_queue[queue_tail].length = output_len; queue_tail = (queue_tail + 1) % QUEUE_MAX_SIZE; - } else { + } + else + { printf("Queue is full, dropping frame!\n"); } + output_len = 0; pthread_mutex_unlock(&queue_mutex); break; - } else if (parse_result == -1) { + } + else if (parse_result == 0) + { + printf("Parsed data length: %d\n", output_len); + break; // 数据不足或解析失败,退出循环 + } + else if (parse_result == -1) + { break; // 数据不足或解析失败,退出循环 } } @@ -146,19 +178,23 @@ void *receive_thread_func(void *arg) { } // 初始化串口 -static PyObject *serial_init(PyObject *self, PyObject *args) { +static PyObject *serial_init(PyObject *self, PyObject *args) +{ const char *dev_name; - if (!PyArg_ParseTuple(args, "s", &dev_name)) { + if (!PyArg_ParseTuple(args, "s", &dev_name)) + { return NULL; } - if (by_serial_init(&serial_port, dev_name) != 0) { + if (by_serial_init(&serial_port, dev_name) != 0) + { PyErr_SetString(PyExc_IOError, "Failed to initialize serial port"); return NULL; } // 初始化环形缓冲区 - if (by_ringbuf_init(&ring_buffer, RING_BUFFER_SIZE) != 0) { + if (by_ringbuf_init(&ring_buffer, RING_BUFFER_SIZE) != 0) + { PyErr_SetString(PyExc_IOError, "Failed to initialize ring buffer"); return NULL; } @@ -166,7 +202,8 @@ static PyObject *serial_init(PyObject *self, PyObject *args) { // 启动接收线程 pthread_t receive_thread; stop_receiving = false; - if (pthread_create(&receive_thread, NULL, receive_thread_func, NULL) != 0) { + if (pthread_create(&receive_thread, NULL, receive_thread_func, NULL) != 0) + { PyErr_SetString(PyExc_RuntimeError, "Failed to start receive thread"); return NULL; } @@ -175,15 +212,18 @@ static PyObject *serial_init(PyObject *self, PyObject *args) { } // 发送数据 -static PyObject *serial_send(PyObject *self, PyObject *args) { +static PyObject *serial_send(PyObject *self, PyObject *args) +{ const char *data; Py_ssize_t length; - if (!PyArg_ParseTuple(args, "s#", &data, &length)) { + if (!PyArg_ParseTuple(args, "s#", &data, &length)) + { return NULL; } size_t offset = 0; - while (offset < length) { + while (offset < length) + { memset(send_buffer, 0, FRAME_SIZE); // 构造帧头 @@ -192,9 +232,12 @@ static PyObject *serial_send(PyObject *self, PyObject *args) { // 构造帧序号和数据长度 memcpy(send_buffer + 2, &frame_counter, 1); - if (length - offset > DATA_SIZE) { + if (length - offset > DATA_SIZE) + { data_len = DATA_SIZE; - } else { + } + else + { data_len = length - offset; } memcpy(send_buffer + 3, &data_len, 1); @@ -207,7 +250,8 @@ static PyObject *serial_send(PyObject *self, PyObject *args) { memcpy(send_buffer + HEADER_SIZE + DATA_SIZE + FEC_SIZE, &crc, CHECKSUM_SIZE); // 发送帧 - if (by_serial_write(&serial_port, (const char *)send_buffer, FRAME_SIZE) != 0) { + if (by_serial_write(&serial_port, (const char *)send_buffer, FRAME_SIZE) != 0) + { PyErr_SetString(PyExc_IOError, "Failed to send data over serial port"); return NULL; } @@ -222,9 +266,11 @@ static PyObject *serial_send(PyObject *self, PyObject *args) { } // 接收数据 -static PyObject *serial_receive(PyObject *self, PyObject *args) { +static PyObject *serial_receive(PyObject *self, PyObject *args) +{ pthread_mutex_lock(&queue_mutex); - if (queue_head == queue_tail) { + if (queue_head == queue_tail) + { pthread_mutex_unlock(&queue_mutex); PyErr_SetString(PyExc_IOError, "No data available in the queue"); return NULL; @@ -257,6 +303,7 @@ static struct PyModuleDef serialmodule = { SerialMethods}; // 模块初始化函数 -PyMODINIT_FUNC PyInit_serial_module(void) { +PyMODINIT_FUNC PyInit_serial_module(void) +{ return PyModule_Create(&serialmodule); } \ No newline at end of file diff --git a/serial_module.so b/serial_module.so index 6a5dec947d8ad8e1c1a05fa896b0f43db349f367..c3989ddd3621af42ca1ad5e9e78a123b1e8f4eb2 100755 GIT binary patch literal 22184 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 U(sa*ff9V>fLHktJWMjpD0a`#WI{*Lx literal 37160 zcmeHwd3;pW-S;_j=a899GBa5T`yh)b5)u{#5e!RkkS((KV5=RnOqQC>Ss<|@*hovv zLrYw$t<qsfuUP8hoSDO73)ld}SeYjDe%WvkZVvO|Jc&(|yzT+gr*cR9 z3T09jR4~~Pl+~~^{inv8)X+&z+AASp9FBB_RLYo1?Q+Aw-ZNiHv7VLb=^R~%&{Bmr zaxQ=*cT~$A)pDs+2kWR#JzAX9(cc54V30H2(P6a7Cray`wrx3z6qxBuZ?9dG=psP+BT#7g|5@JD7c@aHaJWh^VS?W`T!+=p+y z+fB5w_?v*gyFO@}@hW1b!~?gX!5b1pX^S=y`bv z{`25}NSDQ)TsDLr8h*~QGwQrG1pka7@E6JU=4W$5O2J;OrweH=^Rxe?Mvmhpm9X)e z-y2eh5{=K%__bpcqDtehmv;T^FQXNrQRAaXN&f-rj5z#|r(-?-2!E@_Pm@^2UeNd# z3l$R9#68LYK37LP`1W0g%&R@EMfH8j^%C2J#-9d1`&9jUIrI#LT=EEcVfHf)MU67{iYWlf|u*<4L(;?Y<` zWn+YJcCD4Itx?!%)!a?VM6@l^*iwBpYpQHS>YyZ>B`q0mj7D2oq@sOctS(YPMO&9_ zMIqLr=<96e8k!pttfIZVtva%7b$Kk-5+f)Ui>!?%)+Q(jc4s8FaitorCZbw+O|m)B z&=ge~U^cP}H39|6>I6k29!=PcZjLoTkhm5l8yagauWU>j&nnuN!6Orlrk0u{>a?PL zrOZSYOOrF~F4e}OL)2HiwX!;mR1>XA)e8RnX^*a(t+$iZbtEJYQQeWJS`P(kApV zGv+3A~w@TQ}zNq2+hK6jqYVOonf4>q6#HUb1RxdnImMwPc%rRQ*3w))v2SzhSyC^ z(&pIkX6{FXG8=wUN(*CQ8(!ZUNNR-*Z=c6*u;Hl;=GbV%qXVRldK*47g=MVOhWFX< zZ8p5VR7vVK8(!ZsN&F5QUSGl_ewPg&u<5_Uh7a2CciZqeHv9uNyuQ>*>K+^3KL2{e zh7Z~F?6=`fS10me8-BcvzsH6zu;Gu`@WXBRqc;2q8@|_u*In91J(K-c5qLi^_P@d% z?|Q;r;+c!lUAFH}xcYm-9Z!3nlA`^y-vIh#|D-pO1jaGquP4gMaB=VCtABk9VhF>X0Xo-;jc-Bc42dO$w#~@Z|Bz z6iglRVPMYm!@DEC{G?ApMq(CJb64P1yct+d7P(U>R>02|Lqe~ z-k^kEPr=loQ2rE59R}r3!8FjK{3)0^2+E&=sRN+=DVPRYls^SiM?m>gFb%jUe+s4! zf%2zd>If*mfl+(e3#j&%Fj;?q$2i~u2khh*4*Eamr|bK`0l(*fk2&B!I^f?q;O8Ci zFCFkc2mDh9{GbEA&jEka0pI3;cRJwh4tR?LPCDQw2OM?4S2^JI4tS-3!#n3!BKF~( z;xm-YJ)I~(R~>ed>Z;!Uqk(bTP}}S&or1qq^3Oh(l5;)@clL!3{O85t1E;MpKNx=L zlSDogd@xTb@bn+8mF>dFQ-9tzpQ@WBr>+lo%>OkwS-A69A}icA{{`6X{oX(O`+IB9 zISz_H!cBe^WK;G@{`h7P*Fz@Ux#e`Ys~mqQKn0iC&fu=Ao{~fwbqqu2q26CXh&Y~k zigaj>pycRG_JPvZ`J~ct@Chn$?>+Ft#(cxOWf+ITo%@cU-G@7W+9Q+O4kM`vcey7` zk>w~qUAjNqwO#QX>YWcAo!fiC)3J}vXK&4X1b*}%r*)9pL)+g5ZvFSeJ9kn>%RNfN zTe$OuFr3~g<=>U^bY|^Z{wm0K-9{(~Gg&lkRLX7tIHiu%>;*XguTX2ukENod2|n64 zVD%EP2lj4vLG6z1Z@~rtO9IEF!R^vu$9{LXbNguGQTzK57mynge@pljgg&Q_NB2)rS!= zSq=OEa?%rM=zOtvsVctY3&MGlHgz)fOKg4TcA+k!aKM3 zA*&-#MfX#;L4CdbU$WVNh-O3F*N^MEjWSv!ECUtN+&jP>-gz6T1^wuskw`kz^aoJ1 z&h76?ZFJ^=?SGf%#n|hVy_dn!B~E>Tv5x)x>j&N`~W3+JJl%>ImYiVCS3wgqpt?@wk*==krbKDx?#RmEk@ zRUS{5Jc-E|P;We+7|>)2MoL95Q;EjG7bSli2(smM#Sq)2#`RUYe424@kd$ zT1%h!%t0~lTG=AX`+klTmI|gqGeUc<1_~h|2!(&e^v}V>)(+pkyF+S5kjFR8Hd;J3bYF z>`==0onq7+Ntouy=pBYb88i-xuCFD+iVT z4RBG$BZD$$2}&xUWE<*&h;Di0Z3< zPgQHnETCkg*it}5Sr?fw@Ce1?#M1B$<$Y8T_~nLTbeSFEBPe`g+Z@h%{{}``;JM{} zfiE6HgFh%<0~IR8B+?9H{{hdORrqx{kXD7M)(;Ot3EZQ=uDpKDnA9UVev!K(MgTxbhtAp6BHTkH{%fuMExhG5vptbsm==A zC6%8(R3_J1RF>`p5TWwZ2g~xA49b8f=sZC=eIdnCV`3z+QXXb+J|$g09X>=lq>@8r zo`LL8R(7RXpt{AVlswwG{xv8^_E7H}6liYwYu9W4lZVPbCbcIjyUITfSNDMJXn1E9 zDu?1o1@7%C%R(&plYzZlbuu8-gsrzL?CI?J`aeD-w$2Jn0>Q15vLIRw#iSRd=N;uA za~POc{@Qi7ql^4YFQ0rr&C4p|nR=uHW-bYx>z{)~TpbSePKQgKsO$3Q=9QnmUeDxiN9Ycf(=3UdxE8}01~9;< zB)pa+yDEZR?t`h!bOK4Mp5QGneght@kCY! zRDfY#`E%FZ*RiFKB?L5|DC&TEG@PmB&&@4=H}I9sXqB>Q+G4CH(t*8Y`8V!QcwzT+ zSDEL;*)k*R3vlop*~&qXj-F0A+B48Y)}q-K$woyry+Kwl#U}40V)JC@k#o>~99P$n zVJE&5f0Hrn*m9aBF|>-sxH%^Lo4}vA9`2yAdC43hC+Ve(=mw^8Qz@ccfN0s3OlCXCiPW0%sy{CIV+7 za3%t0B5)=GXCiPW0%sy{CIV+7@c(xN7OzTBFs8Xw8M8NhNbO zoEKW7-Ye8_CNprTu`-?r$rl^PtN2`&j3%R@hIptp+1Pkqs3z9Z+KM;*3{TudaVcI` zjMjt_Eg^dG4{s;p<-w48XD-y*5=;EIeDv;M2yal1JPtc45 zcH?;WF+?w3hFUg7V@}(vS`;nyjwbwsvS{cUDj;j0z~l>y^hV(z&XaDoc4!0II}=A` zsy5crl;(zhZBxIgs0y%Vpy(9kXj5yVy%;1rzPhD35p7O{ro<6cRAJ3|p@Cvhi3xYk zg_-QLlS*dQToo#5n^ZDmLnh;+ta%SW7ZzICXgqv*8tH3)?(e5HuXmBUvE;S>jsE`8 zNMlGZLb?knE$r_@dL7bVz182p8|f==_xJBdn%mpoe-!EOj^pVV9+>{}o&Nq1(l?PV zLAv?`p1vXd3DO&p{@c6#{og_Q4$`NQKK5RJ|654Kf5JXibY~--h?IP!gI~Lb@wOlz zm6hSy1v~Uk*=YP#{88Cw{@_x7(WL?3X3sWu@yH9$ojLI=k|TM%2EpiIom{*nBo4w~ ziNB-3)4Sj1Ae{;PmA>BJKZcMC{lPD}7H1FJ0K))@ek=ZpK_81WMZaQz{xHzzfj*7s zsG{RF=`u*Q+vsEaO1+ ze>->@31N6#)hQo;0s5PuSEbQapvcG9K%a#6a(^2An<@E^LH_~hx1`Z;O3~>Xi?L{5 zFQw5Br|9%f{EMK=cf(WuElkm`1pPzMOYHLH9aa@M$iM4A_oBV-wbNY>N_j$^InG4j zOa#tE;7kP0MBq#W&P3q6;)rvQ(1#K*)SM(ic($ zyp1Oh^WD!V4a*l7kT>t(o9};U-b9C?fAC3v3&DNbp7|!@wEhS~C#(WeH5NAVIi zaqZLaZcWFFS(0x5rbD~%|3qTGV|O}JqHm7MbXuX)jXG`B={BA2(&^ng-J{d}I_=Tv zQJwbbl;L?j9YLLjbXua*GM!fFbfZpNb-GQbyL5WDPWR|^zfOB}s;t@0m)Y`zWX*SI z=DRaf&*pnG^L?55p3KnAcVy+hznIWNF%ENqDX7EF$ zmn>dGd;a6qn38N2A$!(4l&V>MU32KK2#UcN{hp z|Ly2Oiotv`>~T97HFyg+1>=%AbUFIb7R^_v@1o~gFAcvC^bAkNI*c0`?u;vt zjQ13V3CTT=V${fRWn7HGEQ1gG1t9B3kaABRzM2?Z;(3JGS`L5QQ$}A7)LCwUk8WA8 z19|Hec;Y^{a3QgJ#7>M**6&IBp0R|ozC-yZN8O3Mn_f(Zg{NR4NO|``;4}NKFW1)vyaJ%4gk( z@nlLyq37!)xS5JqltIoio)5hlBZB0bn_rG1WsH;*5ATN?8KWg7i@yM686imt@_cgX zEN?4h^7(d>nIM5eegjb^<`0LNB4*KG?-@0ULOo#<*yecVWIO{>-a@!@p+{zY$j-~6 zXs{d#!S6vYAc+f@MKYcRWA6hhNcf3UJd3>rD0bc>@U49G1fy%IM`B6WB{p4?z$$f} z&8#{U+7q_kfr$Hj;3rvopu<~~R|8wY3xKg!!kl+RK3*(DjiC~~BlEvXc`w>Q=G7y5 zDE}p#G86e5!JpxFe@G$nxNiru^>x$$Uo`q=P$r*^FxSRo-No3?h0NB*L=_Ue-FwA{xPmzzMjIHLD|Ut1iVyqJAislt;hH4 z;kyB}@=0X$W&bhAwDDEwNxoNd-h|iN`28evL~7f?50IVT=iUysUAz=$->bRLBe{eB zJ8Ao4{yorkH$Oq;Ihsdx`2hbDvArRSy@&r2f%d(f8wBnVeuPvX&(223_VYgx<-HsM z(ZjrrO4=uj-NP4>(f4zvgK~tQBH&c+JOD@eC}R7^h+Y`&<*!4H@AQb10Q&gT@ZI;} zh@}Y9>FjN=_R)yt$TOb32u42+JPf*rXYYZUf976-bC74}L-Lc{wE&8E_AIdV>*|qx zhjD)dq$%7p6|$TMZUa=pJ;ji6@$9Ps&EcMt2%W|K7s6s0_q>Xh=jO72VeXlRdJ$Zj zuHc><01Z>n2JZPTij|?Djoi~Ey_1~v+!H`4y^7Y#J>P`AOfH*88~1!3X0v(jLKJNq z_q+&NK+$$^&-V~f^w?8y3G1F&`y|*9Tu1Kr1Ie$J@VVRYQVBF^MwBjJ;Zsgtf;WUh5O@A&rF*nHv zDQhhtsh<}oGJ@{)@u7L|;I3>TfFt=&MP7U%?eb{~XcD$(W(Lh?`k&quTfr{_BaUgP6$3 z?ldOt&S;9z0sjNU`JmxEnBpYmn)4oV?5V)7iSrf1c_NLIS%(4hrvv{WrjHF1^&=IB zFx+6)7z)-e1EYalJTBN~l3 z+SfO!tvp+BJ<&RFl0l;JKv{THy0M?!_*DT_tVO^5!=DTMm;@ds0SXw683O`ZHC+Sv z^8pH&^#q0ag#v0s)(P|t{$j!3NW`FBfbkE7ut-GzPfVnVQu8 z>>zEg6x>6c_Z!YfQ=GCLo&8f{y2@2Zyaq@jp7nFcRQO7Rx1bXT@Q{o7X86KXz(7mY=b3M&8r=eo(PrkGrMf83gP?D= z1d6y9+I$yy$!LiG7qs~1NMIuW22j4aKB~qk{0I%n7v_+e65d3Vc@mhze~OU%E|NeQ ze--Zd=1UL4%uU6!s1y4ZSbv96D~`bV$^v_!#r;#9WCM5s8C5+pN1ibE9Y9)lk)sQP ze~a2ihI*8nTCeggx(#RYV~=N2@GQUy;yMls1;G1RHra8t0(4RK$+H-p;A4dhKz z@Nr-npN;n5YnFhA??GkzS|kwUHB^9B2^8^jskGNf0E*B&eKC1)oWlEwEgrZPNeTZd zg)1R}IeaFuB_&YCEwZyoUkB*9if^-|RPfp4PMcJ{foGz|eeDw1$h{PYYb8+6m*7I; z`+@{o`7(0!ItkzkK$I;~+cv%kq4HfXYhnlgJ3`{yDk;18X$sm6QsxfsC$=w2;BNjH zdC(z&2Y4;1zEJ{ucoHGl|gdZk5Uy_vl{1YnamnCqRM=3fxB+$eEi)1<_aD;!C z%5#$hj`DUY&%aBcmoFn=rv&===SbUEByc+WJ8X2gUE31#|(J!b{2FyCkKACyDZ{AdTg7_p%Can+T(X|9u)K(AIb@-{D?Ch+s1fVcLzx$Kz z&-w;{V4w!SR+Jskv+tGAo*h&bjhI5Gn`ZCUKT$hbdFsMNUT2*|NP*4r1u^YSRhAZ#(#$B`Y)DldRW$9;Yq!Jd9W4b;m;A@iu|8LhH<(o`d0=h zrc?Np1gw%k2@iwrUoD-P!*`KPMX(;YGCm2#^ItZal!bW!e)`u0X*yBCL#Sc@T3XZ{9RSLS4@tjx2h zL1vzdAo0wdpt>?^DIA%@fWdS+=)M_F*MWc@e44#}6E_oSS&j zg#`Qr#&dS@!ilgLT#i%L3lN-@>j~ZkAW&Pwa=r2$~zG0ynxIzz8H$~g0iwboPK{SFGm7d9L})3TnPmE zN2vI`yvz?F51;9VHG{j}gY(v#q%Gh2J}BZ&I5H-mob_5|Yaow9%mKsL0){0mueD7h zb4bHdpyUnmUzxZbOyh#*OQySxZ$9XcJ|0DV5r!{QhP~5}=D$%yZLdUAj8oxMSN5Gml+D^Z0Y%QAAw?b{ z?61IF#JmLvQtk*@hF=p}o`~kUNvf0ecPWZgFyBv#{$Vt_C>E|_V)FhF!3jPqm5j~< zc08S?(y4?_mlBhk7JLec?50>2PNv*!oQ9FwCB&y3?FTh)xKtJ)tUQr1bPv?Y^z-3y zAUpR9M56%6k}z){#BzgD>}y0y6@+=0K{kJi9LOI^lPY4lFCpf`k8&yZ3=!`oOSw0r z#KFauL?0zIotT?yHTOa^?84D58IF&MCWDY01uZyIiR58nQHglzt|f1bR5X*YvN$rQ z%Cwjo%2cS#9W9wQ5R-JCCcUZ_yfx@?1yiNPHlkCcT&0lIwnsx=)TmPIA_iT%>k*&4 zkkq>;Wt{rGtUczv6|u~lAn83R`hauZYe;^wq`z(GEcb3S=Ay@k4PO978TdTdMH!dO zl_JO78*nb^LxXd2MbM>R7JB;TS z!}Hc0Vs>};Jh4^W5BQpFYM<`z-|pKg=pvEGp#j<5eRSW}kugkUlA3;G-_{uzqL?Uy zTi3}>=I(xN-&UaHz#f8DHMEXnqr8ajTtSMRzp}}9{~e6Jxd_nQanwhw?!#Mr^wQbTir*t$m&?^r|Ph}U)~~~hm%V* z^|dV{0q`0jD|?ak-;Ifj$X!Wc)7 zB}QPB2*}40G+5H%e4s(MWgdDg;Zlz!xOyzX)nkdEhpQ(NTs@KC>WPGho=8}ehhGYX zTs@J7EZZE!teb%GHz;k z0Y7D#n0(8P7z3BvvK6@z2(Jt3 zGy7or^Mv$VHqQ!Z{N~ky_?K5_b;}}lCMmaeDXNu<;^N#DES&)@++MpniZ;CS3^^5Zd|k zyL|W6sAP)6g0pnoGN`LAm`=?O7XcToTP>KYRIadY(%muwDjg`wVqFy2%cRSFG4VQo z{+I9mjkZ%f$!@23j*6hNQ@qI7c}w?ag6V*rnFDtGzeSA3Ie*%i@BXK@F>a!%(?Xh0 z@eJ7pOm|m-0eUx;J44rKeFk;0jH${4gqvqG%YUJ79v0x1<N7X(kES)%A+Z6 zzQE^0qX8F!M6&0|n#2U^TvUop8g~hnpGt9F0i)95-pMA6swCm!^mW{SxSA776+%#;-*9d(9#mYt+DT}!VK@qwm{E}=p#TOFyj zOf9%ovk?RRNB0kI>mRBC*f1HYrQ0x`^zP=7nl6wSb=TTM{4nw)`Flbh;gvaa%|(dVZdQ*~32Ldps=J>gneafO2uucL6E z!lg$r5BoWVp7W3V*_2>dV>GmJJ`QbHeH-yvq;dT1#@`e8dk%l^;?Kp$xdJ0*A;+ue zDk*dQ04@5tI=2TW5v1H?I?blj5<0EL$wd;wuB6=6bZV#54m#a}lc1m56ZBp{#!qnK z2XJz|KsZ{k5J%~BoKAw{3U20V*7Ft@8CK>OMQ%dyA6X~ZMM69#vK|wBx!WZcSnqzJ zSY&zT3+|~Ct4m!IbH&KFg~zi}1iOX*UQyUBJg$j(1c`fv*YkVfc}oP71Y~=D^^EX8 zBhK}V7yiRy+;)g{3-2o;=sGJ;h&C}IA+jD7;x3T`4v*&^;q4Z|VV zlZS0~P0tm+VmK3j5Z)_9u4lXOervPHe_v#MQ51HFaW{*?lfqm7fhc)dc)uu$JQKhK zEAvJ6KGeivk-c2x!+LNtv3uV~2`b_6%R(dv>@6I&SqRix{xKmPIwl=H>s}G46=Pi! z^2CH)B6wJcI#Ki&5s>w9smSV33YLqhRxWBCpl80zg@(ONxBCs$ZU<}k81q%Tx3_uO z);$@JwEuMqyWZ#^h- z9+ZAvA*PfF-v^rFO^Eys;otM1r1K7O$pR5TdqvSn4xvbhiPMGeWl@+AdAr2Ki^SNA zsPe}q#Mu{#2?>$AK?IUw6dGhgj94zlp((ho7sIJVATBovj-T@^`IOEA(5>krL`g!7 zp=6iHrsN_89TqtXB2C~NO9^Z$=tr)FO&`4;3eS zy2wom6nyk_^8f4&qGW@}LFqcE6w`hvCL9()lySMpNs6hk;5t`~LPEvq6!~>xF5#?A z8^k#ZE6ZAo*6-g%Ex#1ueN1>TEG!p+o5jckg>F)@7@rWO#bO%9ilmrPBK)2_F+3p( zUdC`CrZqNJe?QKD$n1Fav5b1CtB-^74_ zNwz`x@n9rDTQxLAs#~y+LuFH>5<3>eQhO~VSfVvjUm33-WNQNKFA-~(n>q}&`$9$g z<(0A3RiDS#n=Fn!7HXn#)?5{7Xl`x9js=m{md!AQ%@N2z1luP>nxcvNmYO)LZHeLA zPZn=%p*LiH)5+1a>vv~dPo;8Sy-`d z+2!RFP_>arOckK1QA(gz8fzIUTJDH}*qTi=Z2NiG47JqO(v!0$Y)69KEz(V`Teh-% z3E7EX6G5YF!UiKo8HyQ=VSAH^aTd?ws4cKfXlgC7YSgl7nAij(y2&&fy%CAM30BtB zkh9g;HYA}XWZ=yHCM{K}T{*Tb(L0h*JyDEN3n(eJW~mFwQ?fbUP}htPim5tmZ7mjU zs>EI@kf@1nk}XCx6S*r%+QuTfp5(X3uu@%FT_2V0&@{m0GN=Yc7raG&04!SykZ8k| z)I1p~rM9uMF3zZj$?|EJo1<-5=34=e9YJ5ZaP2yZc}4po*-9(W_~H(pHRX%fuUU&m zAjgZ%7%@;aNtCtpeDvZ-q-Arn3X19IwT&$;u}DqBCX4{720`^D*`uh$hL&b3UTaGn zUodZq;%jBvBgWRf1}c_18NPXrpl8syf&wLCmFNQK{dzN)cztDSlnAkg>iX)ICbU!V zFKTIN)ID-l`G$3A^%Adds7Z9Oja3AEa62m0g5s%m_|9>*A2(Y~&|HL3?r)t%Lc-jRr`I5kW(G}pH1 zCO~~?pou2X7*zj&ridO>s1xaN7hhyoV|0aU&C$9_8E+YT8jZ1u55_)h<^#!Ps}`>* zU&-K8CB!@9=L=V!k?O}HtHL{v|ji~-R&~d20 zp!23}SES9*cuK*qMVZtlIk+H1*3uPX6WUKgw*7db1+^}J9)JdLL={`|RH1D!8URr| z=LSGJ##BqH4X7boUN~&y4GlABt5i$+qN7F)GyqvLz44FS4k)^L4V-L>&`SXJ3Rl}3 zso_`-hNMnjv}DVYdd&Ey21~ug5u7tMhfzk_Xc^dYsFjA0xhf5O;H&=y6!OS^A}oNdV&5fAvCQik!+66uZv<#Y^VlU8LO_J z-!|v`Y3I)hO{)t{tF2hJ7-uz8cw`sV# z(#6IQXxykbWCR(6>RKC2*8w>{p)k;ewz;OE2~~`)Qd^BK=hzWUcV@MD72<_HCaaJd zD-BNRyJkT*wX^ERmUt55EZUo#6w!1I=3>#-80G|W$1fRpH8fz-i9rVRrdSJI->FH- zYrL(;$Zf|k9#K8X3k6+b=E$7fp^Q|^3P)3rO)^=fn*&-vJc|=?|*1ng-0V)VxhYj((DwAJ9ZXhEmPzNO`vsR*Eq959{L(x zMagBQ&V-dFpwK)py@}XD8*Q|Q&pyQ3qMEuVftu8wfACb6T8BvHZC3(@)9ScRTYr-$K$jIw?H43H+1c}t}h|WpZ3JejH$c~2LUK&fLZVuBcc1iit zh3i+W!wlt`WJ9bShSR%;tW_G$r51BBlP$nDG}t$|YegHt=#O0j@nb>uE3O>rG*!;C zZ3+gaUuyHb>Gds5(dqTkHe6Y!H@3toBdv|ey6IK4Yabhes7E!`mW!*0U}Mvh@!0f+ z=IX{|O>}x|J8p2BXBL;1C_MJyn_gF4JssDB$oaFTH8wOS+oshuC#RQ|8kuwjpJJ?P zz~F4Rkp|cdPRB-#WLz6=L5E10h$m`lqP4~KxJ$2TXhEuesAw8y(y=J6Luk5jNu_NL zaTkoO83F2=8=%&p4@{#`x|yi$boYWxle`{a1je-spzK~LNJTFNwzfxUYeq7rwIg>e zhH`SQzD@#{dDYPAUUMBH94*YnH59-$i zjK~GZa5jR4)+h|wqhm4t@a8@<-#1GnPM^mg*{yKsp~tZtrR!N~I8}NZlEM7H4|vjJ z*0|042=vUI@Xps79s{2IEYp6{nmiqc@JIM<8c)v?==cr(2!FT6_em^cf7W>OQlKgC zdm3-v3p99otSj}b)e6c~N{`ni{uTw}r3ratYy5W{c)aK>`OQ0iQ#AiXjW@6P0hC7- z6jB_V@BhpM1L2*oD_yMd&iA8MN&Q94ydk(v>!&9a9Iy15mjvrIz5)2b>I>*W@$`Iy zW5?U@Y^}hS45sJH;CHbA>kHW!k=-fvp!P0H$A3fO3z+l!?Qa8*w>p^F$Jtb8EgH4de2Gs}Apv^Ni1avLX^8+o zSR7i1(9=Bx{ySQ~H>7NrXcwLsLjNm6;NRAIoNvaRlz6SwmSo9#|Mb4p^a%u&*ZDSJ z3GjoJw;cG8O|QvDq#gqeq|LyeH2|h^okQ?HFa(}e#}e@b77#Hl!m^9rzB-bi6?M$8 zXs_s+mPlP=OBL2|Yp`OA1Dr2$A_6TOEm_Mr3v6^I4 z6U`-UkX)HaV|C8g>`Pp@16ZXNZZwx%d9~l@*>BgB8MDGJ=ghP`rO;}nPObCEWp|a8 zk6Bb!t^PRHs{@TvZJSfmawpBX%glDtv|Tjlx@2a*Zw>0LvHzP5&TXpYRNe*;OyA{70Bt{>X4SbB zd5Sm-_ju>&oWMvir~B4%q;GGLLk{q9q?socgbwV+DtE@@=- zz#t99isS7~Sa?I4h^e&RUzX8YUU!Bh%uV_GTz! zGQ|>xr08|fG#~;RmOCqnQRiCmOt4s%t{Bb#A%FbOJYmr@`I9jhq zzxo8IC{``IGFI7Khf!OD^1*{4 zRaMawHVxtaHEQy-Xk$amTX+q}n(JsqJ)XM0{BJX(Ac%M3Feg+8ePKz5NkbAEI5}_K zib1l=AJ+0Foj4#WbGY249SZ?r?=PCZ$;149lu57Dcq8YuzZ`VDrzclF&4Wmw-_4iAM{GJ(#(WJZoh5Z-7PHQ;2o2J%N zdgd!VPJaz-(m#MLV3RlNH%I=5@_&IWwOwQ1+;<<<@<(<3%a_T(XY87Kr1c(RG4lKM zyY~Ap1`$g?T3*w>4zYu$zP_q7pj!rWwRe4JAgbbw2?03 zzgZXaEK-a;T91Ml3z>{g-Ox`abaP8ljr`OUMrDYX4wI_&BZae{XKMQ!?MUQ}oI#HU z!igi=En5CX^FxJNz{xvh2>Ggr64>Er@J{*jhme1#TFKKlF80GIzevkF<5%0DqB=GGuW3_4!(BFEWR09jX+LX|w{z~eR?FLwHhF_4S%(Qpx?9VKXmWsK0{-X) pdDCvq^_MPprtKk{I`-e7vXA|X_|tGbnEV&$!h)m8Q8)+4{tuzrs>}cY diff --git a/test_recv.jpg b/test_recv.jpg index 5dcabf54590bc1701c2f3ff6761109d4cd2003c6..bc7115a0c4f7e9c27d2249d42f936ba044f1cf92 100644 GIT binary patch literal 14573 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 literal 10573 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 ATmS$7 diff --git a/test_recv.py b/test_recv.py index 6ef147c..ce09cea 100644 --- a/test_recv.py +++ b/test_recv.py @@ -1,21 +1,35 @@ import serial_module import cv2 import numpy as np +import time -serial_module.init("/dev/ttyUSB1") +serial_module.init("/dev/ttyUSB0") while True: try: + # time.sleep(1); data = serial_module.receive() + if data == None: + continue # print("Received data:", data) if data: + print(f"size of data: {len(data)}") frame = np.frombuffer(data, np.uint8) # 将数据转换为图像 + print(2) image = cv2.imdecode(frame, cv2.IMREAD_COLOR) + + print(f"Image shape: {image.shape}") + + print(3) # 显示图像 - cv2.imshow('Received Image', image) + # cv2.imshow('Received Image', image) + # print(4) cv2.imwrite('test_recv.jpg', image) + print(5) # 等待按键输入 if cv2.waitKey(1) & 0xFF == ord('q'): break + pass except Exception as e: - print("Error:", e) \ No newline at end of file + # print("Error:", e) + pass \ No newline at end of file