找回密码
 注册
关于网站域名变更的通知
查看: 507|回复: 1
打印 上一主题 下一主题

linux串口相关的程序自动启动,后台运行失败???为什么

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-7-30 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
用了TI AM335 sdk 7.0 ,串口程序(GPRS_P1)在终端下打开,添加“&”后台运行(./GPRS_P1 /dev/ttyUSB3 192.168.2.101 6001 6001 &),符合预期,但是,放在系统开机的时候自动运行,串口无法读取数据
$ i: w0 ^6 ]8 T- n/ W- a在rc3.d中添加了启动脚本,(系统默认启动级别是3)GPRS_P1是程序的可执行代码 , /dev/ttyUSB3 192.168.2.101 6001 6001是程序运行参数(argv),这是缺少哪部分的知识,请大家指点一下
5 L8 x3 l  r3 G( m
  • /usr/GPRS/bin/Debug/./GPRS_P1 /dev/ttyUSB3 192.168.2.101 6001 6001 &. ]+ q3 R7 ]* Y* Y9 v& g

: Z$ C7 [3 l1 l3 R: [5 [! e7 s
) q* C8 c6 f; C# a

' L% d% N: C6 p# t下面是我的串口程序
3 z+ E) C+ R- Q; D5 ]# X
  • #include "uart.h"2 O: F- [$ c1 o/ K5 S. ?
  • 6 {7 E! M. `2 K# J& Z5 I1 [$ n1 y
  • /*******************************************************************
    5 o; {  T3 h  D6 F7 I
  • * 名称:                  UART0_Open
    4 t! n. n6 Y/ o
  • * 功能:                打开串口并返回串口设备文件描述, p# O2 w8 j! c
  • * 入口参数:        fd    :文件描述符     port :串口号(ttyS0,ttyS1,ttyS2)
    ; `" l. n6 K2 s  k- P2 r. X/ L8 p8 q
  • * 出口参数:        正确返回为1,错误返回为0- E! w7 i: t) N) b
  • *******************************************************************/- b! E! w1 _. O# N# V. X# X
  • int UART0_Open(int fd,char* port)
    7 D( O2 {) g( z7 x; f  p3 o+ V, h3 e
  • {
    6 |0 L' p$ A& i1 z

  • 8 I& ^. Y% M: R2 ^
  •     //fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);         // O_RDWR 读写' r0 q0 z' X  ^6 j. t
  •     fd = open( port, O_RDWR|O_NOCTTY);         //zu se2 T( y7 V' b0 F# T6 L
  •     if (fd == -1)& N# G- {" n( Y0 G4 w8 o- E3 I. n
  •     {" S- p; d+ M# T9 u5 s9 `0 i5 M" v
  •         perror("Can't Open Serial Port");7 {: U2 s' N  u# J
  •         return(FALSE);
    ' u# D2 R. X' E, Z
  •     }. O0 F5 W- N5 @- b
  •     //恢复串口为阻塞状态% x. ]! ?! g: a2 q% J; j
  •     if(fcntl(fd, F_SETFL, 0) < 0), g/ r3 F* ^$ B% D
  •     {) Z" f, \% U5 F5 t. R2 p* d
  •         printf("fcntl failed!\n");
    + r7 }  G" X! F' G& L1 a* S7 G0 F
  •         return(FALSE);" Z9 ^& u  o1 [$ A5 i- C
  •     }& f' K9 K2 @) |9 q2 t
  •     else" I4 M! z5 ?% K4 q8 s$ C
  •     {
    $ ?& X9 j, {# Z7 w5 Z; Z
  •         //printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
    8 ~2 O$ B9 e( f) U  X8 B
  •     }" \3 u* k8 P# V4 Y; m& j6 @
  •     //测试是否为终端设备7 X2 V8 g+ b9 J# v0 C
  •     if(0 == isatty(STDIN_FILENO))! C5 V- P7 ]# N# ]
  •     {
    8 D8 E+ N4 w, }2 z( J# e6 o
  •         printf("standard input is not a terminal device\n");6 ~! M, R7 Z3 ~/ M
  •         return(FALSE);
    7 e8 L3 e  {% y4 u% Z
  •     }! c. j. _& K3 F5 H% p
  •     else
    # U; \  o' \: x# E8 J
  •     {7 o& L3 D7 I% ]
  •         //printf("isatty success!\n");/ q" a7 m7 [8 k
  •     }  e: m- S( `5 C) l
  • //        printf("fd->open=%d\n",fd);
    " u+ J7 x! i. ^# s
  •     return fd;
    ) ]# p( _0 ]0 P  @9 b$ g
  • }' ?1 @0 W! O' t) i1 e6 @5 N
  • /*******************************************************************5 c+ h# R+ f! @0 N1 e
  • * 名称:                UART0_Close
    4 l% n6 d: U3 x
  • * 功能:                关闭串口并返回串口设备文件描述, y4 E0 N) N" F4 \* e: v
  • * 入口参数:        fd    :文件描述符     port :串口号(ttyS0,ttyS1,ttyS2)
    8 ?& D% I; Q6 e. H
  • * 出口参数:        void0 u; ~4 o+ L: z' Q  V& v' L
  • *******************************************************************/6 x# T; E" {% ^5 p  {

  • 8 O) E6 [  ?* k' M9 r4 a
  • void UART0_Close(int fd)
    3 ]+ |/ X, ^/ D! ~1 m3 N
  • {
      ~4 V% R5 Q( D% w8 |
  •     close(fd);
    ) r) I" s( k' G* D, z/ T- g
  • }
    8 I& ]; Q/ ^% N

  • 1 @" G' [$ E) W$ V8 d
  • /*******************************************************************
    ' ~2 k# @$ ]7 E) g' ?
  • * 名称:                UART0_Set" n' [: f% v3 S4 B4 F$ a
  • * 功能:                设置串口数据位,停止位和效验位
    " U- [" W# q8 Z% u
  • * 入口参数:        fd        串口文件描述符" ]+ f6 g4 [  A3 a- Q4 r
  • *                              speed     串口速度% q( ^  `/ n; t8 o) U7 W0 \, Z
  • *                              flow_ctrl   数据流控制& K% ?' z: o; J4 T
  • *                           databits   数据位   取值为 7 或者8
    & F! P( a0 n" a9 G# M
  • *                           stopbits   停止位   取值为 1 或者2
    ( F+ m9 V4 [- V/ T6 N
  • *                           parity     效验类型 取值为N,E,O,,S
    " N5 h: B( k* b( D
  • *出口参数:          正确返回为1,错误返回为08 E$ E( k4 A1 `) H, I
  • *******************************************************************/
    # c* X' ]. {" g* @1 ^
  • int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)# u; x9 _: n8 z2 Q7 e
  • {
    # C! A) Q5 Z6 C6 D" l+ j  I# J
  •     int   i;
    3 ]5 p0 U. E; r2 _- N) `
  •     int   status;
    % C( f: N& T7 m6 l" T3 `
  •     int   speed_arr[] = {B3000000,B2500000,B2000000,B1500000,B1152000,B1000000,B921600,B576000,B500000,B460800,B230400,B115200, B19200, B9600, B4800, B2400, B1200, B300};7 P  Q& J% {& t+ `
  •     int   name_arr[] =   {3000000, 2500000, 2000000, 1500000, 1152000, 1000000, 921600, 576000, 500000, 460800, 230400,115200 ,  19200,  9600,  4800,  2400,  1200,  300};
      S' C. M' \0 a0 T2 \

  • # s5 k6 G, `5 u( F
  •     struct termios options;- q1 v3 w  i3 K/ o$ r' [  ?3 s; L
  • , ~9 c$ U) Z9 N1 `
  •     /*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.
    . J2 g5 a! l  S# Y1 ]# \/ n
  •     */" k" H# b$ C# H8 A, {
  •     if  ( tcgetattr( fd,&options)  !=  0)
    6 y$ Y  Z/ k6 n. {
  •     {0 [: J+ F: U& \% M6 m
  •         perror("SetupSerial 1");
    ; U& b# Z& X, l
  •         return(FALSE);
    % W& X/ E9 E9 N; J' j5 W  e% g+ \
  •     }
    4 ~8 w' ?- X% u, [
  • # ?. j7 H/ \4 v8 o
  •     //设置串口输入波特率和输出波特率0 i6 d$ {' T3 o6 Y) i8 }& r
  •     for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)1 ?0 y9 n7 I8 N- K+ l8 t  J7 l9 f- q6 a
  •     {4 O4 g0 j8 S5 C6 t3 v2 }0 i
  •         if  (speed == name_arr)" s+ ~0 `# G8 ~* j
  •         {8 ?- I9 i1 r# U
  •             cfsetispeed(&options, speed_arr);' U0 }' ~! Y+ `( \% W3 q
  •             cfsetospeed(&options, speed_arr);
    . p2 e2 P+ J- Q/ D
  •             break;5 e2 w. i8 q! X" T% [2 D
  •         }
      z4 |3 W2 V, a' N4 @! ~. a
  •     }
    % v. C' ~+ }7 a& c! @' ^- l) L

  • ' _2 }: t" Q. w
  •     //修改控制模式,保证程序不会占用串口
    ' D' r, I" x- k6 ]- x. g
  •     options.c_cflag |= CLOCAL;/ W! H( L& J3 W% w3 B: f' `. A  r
  •     //修改控制模式,使得能够从串口中读取输入数据/ X" x0 b: k6 C$ x9 _2 G  i, y
  •     options.c_cflag |= CREAD;
    ) W  t: U1 s4 {+ p3 c: y

  • 5 V# I2 T4 b" L2 J' J
  •     //设置数据流控制' W* j& b- ?( {) J4 N
  •     switch(flow_ctrl)6 A6 N7 ~) `4 s
  •     {+ ~6 j- g  J- Z3 q9 b* `

  • 4 [, ]+ r" Q4 u2 B# o4 a' P
  •     case 0 ://不使用流控制. O6 Z5 t) z+ g& j8 e8 R! }, A1 A6 ]
  •         options.c_cflag &= ~CRTSCTS;/ U/ V5 O' ^0 O, I( A- Y
  •         break;: i$ O( J7 o2 }  o3 T2 k

  • : j" S7 h2 j! ^# u+ i9 g3 j3 q
  •     case 1 ://使用硬件流控制
    : s6 {( h5 Y* y. f0 z
  •         options.c_cflag |= CRTSCTS;/ M. }& y# n8 C* P1 O
  •         break;( W, D" R6 _5 K3 q5 v/ M% l. y5 J2 V
  •     case 2 ://使用软件流控制
    7 e7 ]& z3 ]: a" }. [
  •         options.c_cflag |= IXON | IXOFF | IXANY;) [& R/ j" D" T) Q) B# j" U
  •         break;
    " O! ]9 ~) P- a" F$ F2 C- M; y
  •     }* [; m9 A0 X( `) F% w
  •     //设置数据位* l$ S- T; b6 E
  •     //屏蔽其他标志位
    3 j/ j( q( u' v
  •     options.c_cflag &= ~CSIZE;
    ( M4 f& A0 B9 `  s1 B$ X4 U3 Q
  •     switch (databits)
    ' y* @. g) L( @* T
  •     {
    8 n' m3 h+ c; a4 |/ G
  •     case 5    :
      n0 b, T0 C) P7 _; ^1 \+ G
  •         options.c_cflag |= CS5;
    % U7 Y/ U; K9 h- [$ e9 I& ^
  •         break;- X* T# g: w. P0 N5 S
  •     case 6    :4 T4 j) Z+ w* n
  •         options.c_cflag |= CS6;
    4 l9 ^# c9 N# E& B5 `/ A
  •         break;
    / ~. n5 v+ ?7 s4 o( d% D' ^) x
  •     case 7    :
    3 Q$ {) o3 @8 z
  •         options.c_cflag |= CS7;
    * T( V+ }' F% w, B) ]/ p3 A; A
  •         break;
    ; p4 S6 P% r: f" J" B+ A# N( Z' V
  •     case 8:
    ; O5 X; e) o) ^4 i4 a5 g  q" t* _* _
  •         options.c_cflag |= CS8;
    , L& h) B+ E$ h3 J
  •         break;* K, g* X8 {+ ~4 B1 Z
  •     default:
    1 _5 w, V3 O  i( s, `3 t% u$ n  q
  •         fprintf(stderr,"Unsupported data size\n");
    ! U0 }* \, o+ @, W6 |# Q
  •         return (FALSE);$ }0 W% X8 w9 A6 t
  •     }
      q4 d( {  K6 Y, E5 t9 Q
  •     //设置校验位: a8 R* a0 |( A2 ]: j& e
  •     switch (parity)! r$ a/ ]" U, D
  •     {
    & j3 _4 y3 p5 k3 i
  •     case 'n':
    & {. j; T6 X% ^8 {% \' _& {: K
  •     case 'N': //无奇偶校验位。: A! V9 q; P' W$ c, H
  •         options.c_cflag &= ~PARENB;
    + ^) f/ s+ Q* a+ e
  •         options.c_iflag &= ~INPCK;* i5 ?0 c; |( V5 k( j& e7 ~
  •         break;
    8 ]4 w2 H& R+ B: @# \% Z4 A  v
  •     case 'o':, ]8 [# }" f/ R2 e
  •     case 'O'://设置为奇校验" [! r$ P  ^* `/ q! G) D2 J1 }0 B9 Q
  •         options.c_cflag |= (PARODD | PARENB);
    $ h: _! _. {* ?7 D' }1 K9 z* w
  •         options.c_iflag |= INPCK;- G7 ^6 H& q5 y
  •         break;
      A- v0 b7 a8 g  ?* [* o# B
  •     case 'e':
      E; O) H, y. Y9 g
  •     case 'E'://设置为偶校验- V1 S: h) w1 o6 p7 F* i9 @4 G
  •         options.c_cflag |= PARENB;8 P: S* U/ n. y5 Z8 X
  •         options.c_cflag &= ~PARODD;
    ' s" q( H4 o  E1 p
  •         options.c_iflag |= INPCK;
    ( N# D% B/ o' [3 R* a8 U# o
  •         break;
    * F6 D+ q3 D) @0 b- [
  •     case 's':
    ; c! N: A" Q' |5 R" ?
  •     case 'S': //设置为空格& v: D0 b, o) c* \* S$ u( C- S! H
  •         options.c_cflag &= ~PARENB;; @8 Y4 S' l2 F4 |0 N
  •         options.c_cflag &= ~CSTOPB;
    ; W* h" ?+ Y/ c, A
  •         break;7 Q) ?6 _- r. O. i0 ?- @
  •     default:+ ^8 x  V$ T8 K4 L% u3 ]1 N) Y
  •         fprintf(stderr,"Unsupported parity\n");
    / B; i8 g$ n" |0 y
  •         return (FALSE);
    $ G7 K; L: I8 k5 b: f1 I
  •     }$ }" g5 y. e6 M7 \
  •     // 设置停止位
    % O2 K6 F3 F7 L8 Q) N3 y6 q
  •     switch (stopbits)
    " K" `8 l$ A! O5 b
  •     {% `% g* [/ V- O. w$ ^
  •     case 1:3 z, X( z0 G$ H! ^% p
  •         options.c_cflag &= ~CSTOPB;' w+ ]0 {0 l0 x! D
  •         break;
    ) f% a' G" v6 e
  •     case 2:. R* D; Y2 a  s" t1 ^8 g0 A# w0 s
  •         options.c_cflag |= CSTOPB;' P. l# [) K/ d/ {; n
  •         break;- y. P# @; n' w# s
  •     default:8 X! n2 `8 f  v/ e0 O* P( O
  •         fprintf(stderr,"Unsupported stop bits\n");
    ' K& m" }: h* S$ B9 Z+ X, I
  •         return (FALSE);
    5 U/ t* b( W7 R# Z1 N% I' K
  •     }/ I# e+ k$ c; Q% ?

  • $ S- \2 ]& i& C% i! f0 R
  •     //修改输出模式,原始数据输出2 m% P4 {+ M/ D
  •     //options.c_oflag &= ~OPOST;: i" k+ Z% C# ~, u/ x/ m$ f: r
  •     //options.c_iflag &= ~(ICRNL | IXON);
    0 {6 B0 h, G% `; g# a. O7 E/ ~
  •     options.c_oflag =0;6 {' F8 w  c6 r3 I+ w
  •     options.c_iflag =0;
    9 v! I  V9 D: u' l  L7 _, B

  • 5 b' g" C& |( k, r6 O/ W- ]( O
  •     options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/// \1 \+ Q8 D2 V: q
  • //options.c_lflag &= ~(ISIG | ICANON);
    7 ^4 ^: m/ M( L
  • * _  t& p  y# A
  •     //设置等待时间和最小接收字符+ [, M' M% T+ ?' i2 O% H5 g# O
  •     options.c_cc[VTIME] = 0; /* 读取一个字符等待1*(1/10)s */0 }' r1 q* U% @! J# z
  •     options.c_cc[VMIN] = 0; /* 读取字符的最少个数为1 */) H8 _' B3 |: d4 T- L# a

  • & p3 D$ S1 S" c( H9 |
  •     //如果发生数据溢出,接收数据,但是不再读取 刷新收到的数据但是不读! C+ \1 }7 |# d
  •     tcflush(fd,TCIFLUSH);
    8 }' C5 s/ z+ \/ ?3 S! l% G( c( _

  • 8 D/ ^2 X- v+ U, K7 G7 I
  •     //激活配置 (将修改后的termios数据设置到串口中)
    . f9 [) S) H4 Y. ~
  •     if (tcsetattr(fd,TCSANOW,&options) != 0)
    6 H3 Q. r! |- U# _, F( ~* l& u
  •     {) R7 e# y/ z. F3 H2 z  b
  •         perror("com set error!\n");
    4 p9 l, Y8 c) l& L8 w6 e# V
  •         return (FALSE);
    ) O* o+ t) L6 ~) E
  •     }
    9 x1 ~1 }* p- i+ i4 M$ S
  •     return (TRUE);
    ! e8 q: r( G8 ^) O/ u+ u
  • }' L! I, }1 a& L# D7 g
  • /*******************************************************************
    2 H2 e7 {7 I: S* G
  • * 名称:                UART0_Init()
    4 f. p, V+ c) e8 g5 U+ M4 A2 q
  • * 功能:                串口初始化; u# h: P% ]& r; I1 M
  • * 入口参数:        fd       :  文件描述符% {/ A7 F6 ?9 V( ~6 M, U( ^/ _3 |
  • *               speed  :  串口速度
    * @( E5 j/ `  a2 w
  • *                              flow_ctrl  数据流控制, p. G3 g" r3 \. ?
  • *               databits   数据位   取值为 7 或者8
    - U/ X( B. U) A1 d
  • *                           stopbits   停止位   取值为 1 或者2$ c5 x5 A. D+ E
  • *                           parity     效验类型 取值为N,E,O,,S
    $ S* F( R8 n6 ]
  • *) g" N, ~2 x' B
  • * 出口参数:        正确返回为1,错误返回为0
    ! G0 V, j" m& j) T0 F/ K! P
  • *******************************************************************/$ \# Z. G# O! `/ c: D
  • int UART0_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity)! D6 k- H; C; u
  • {8 W4 i3 Y" _8 [2 O
  •     //int err;
      ~" N& M* W+ U2 M& m+ p8 `3 `
  •     //设置串口数据帧格式  c+ A1 [" J9 [
  •     if (UART0_Set(fd,speed,flow_ctrl,databits,stopbits,parity) == FALSE)7 H1 B" e! j7 f: j+ p
  •     {4 H6 x3 J8 o" w
  •         return FALSE;
    3 ]# ^" M. u" T& z
  •     }6 Q, |* ]: e7 O$ l6 s. T9 K! ^% t
  •     else% R* y! e. [( Q7 g! ^0 J
  •     {
    ! X6 e3 S# K+ g- K4 Y4 G, _: H
  •         return  TRUE;1 V# b% J: W$ B4 I/ y# F# ?
  •     }, g0 J6 ^* w% j/ w; E1 P& w
  • }
      q8 q0 c' e; ^; ?& s

  • , q4 f. V4 t* y! u4 c
  • /*******************************************************************
    3 _5 F3 A8 @* n9 v3 {
  • * 名称:                  UART0_Recv; A, c. f8 h2 b- a
  • * 功能:                接收串口数据
    . |* \+ P$ \; ~
  • * 入口参数:        fd                  :文件描述符
    : b, Y6 R: C( M0 L( R& ~% ~
  • *                              rcv_buf     :接收串口中数据存入rcv_buf缓冲区中1 r! ]3 t% v( W9 i- j
  • *                              data_len    :一帧数据的长度
    3 _2 ]0 A% y( I3 a1 v5 X( v4 K7 Y/ o
  • * 出口参数:        正确返回为1,错误返回为0
    6 a! m7 Q! S; f1 R- j7 F
  • *******************************************************************/+ A5 r2 r( V9 H7 h; ?( k) N8 j
  • int UART0_Recv(int fd,unsigned char *rcv_buf,int data_len)
    $ |1 x3 C$ b! Y5 N) y: `
  • {$ W7 j1 ]0 F7 ~) y! M( j
  •     struct timeval tv_timeout;
    8 G: P" A: f  G% x  s+ g, k
  •     int len=0;/ S7 b/ E, B% t0 E
  •     tv_timeout.tv_sec  = 0;  f( G5 U1 \1 d$ J; v
  •     tv_timeout.tv_usec = 40 * 1000; //微妙 20MS
    * K2 v: f( B7 H2 r
  •     select(fd+1, NULL, NULL, NULL, &tv_timeout); //only read
    + g3 d% D/ }3 D
  •     len = read(fd, rcv_buf, data_len);0 L, J6 W- f% h& F% L( y2 h% y
  •     //printf("len = %d\n", len);2 B5 d8 d3 Y1 ~9 i
  •     return len;+ h0 r& h! p+ n  p
  • }
    / ], h8 K6 l( y+ {% X2 e0 n# Z
  • /********************************************************************
    , @- P+ K8 L) [/ y) r& T
  • * 名称:                  UART0_Send
    , u5 x4 ^# ~7 K  }% [( A0 D  \  r  Z6 u
  • * 功能:                发送数据
    ) l# u4 S9 F4 t. i) T  j6 `
  • * 入口参数:        fd                  :文件描述符7 @/ ^: N; b% D' ?& K% Q
  • *                              send_buf    :存放串口发送数据
    - p* A  S7 M! q- @+ E1 q) d
  • *                              data_len    :一帧数据的个数" ]1 Y$ U$ _. j* @4 K8 g
  • * 出口参数:        正确返回为1,错误返回为0
    ) p: H: t1 e2 g9 W* F
  • *******************************************************************/! o( b! X" \9 k$ A4 z8 V& }% P
  • int UART0_Send(int fd,unsigned char *send_buf,int data_len)2 T$ Z8 W1 F! z$ W' h) ^
  • {4 C1 Q2 e  p3 M, g
  •     int len = 0;
    , e- B! g8 q8 U6 F# V
  • ( D) y8 O1 N! V5 E4 r' \. M
  •     len = write(fd,send_buf,data_len);
    ( P6 X9 C$ M3 i/ v
  •     if (len == data_len )4 G+ A- o0 d( h3 f4 Z  K
  •     {1 l6 T0 l9 b5 Z% r# ]7 I2 f0 V
  •         return len;
    $ a4 c9 l2 E" \* S: P) L/ N9 n7 t
  •     }# o2 s7 M/ K+ @1 {7 ^
  •     else
    8 |3 N/ g8 C8 ]6 n
  •     {
    3 W% _* q/ H# ?0 b
  •         tcflush(fd,TCOFLUSH);
    2 r, u4 W2 y* y/ A
  •         return FALSE;
    " x) P4 x4 l( K
  •     }
    6 S7 C; H- T/ j* }  n+ ~

  • : B# o0 }' G, L- t, I
  • }
    9 O! s' I9 J, x: c0 a
, g' ]" q: `3 C  T) r1 \

! E( u9 ~. k5 n% A
% {: I# w8 x  y9 {# r5 V( A
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 01:19 , Processed in 0.187500 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表