EDA365电子论坛网
标题:
linux串口相关的程序自动启动,后台运行失败???请大神指导啊???
[打印本页]
作者:
smileqq
时间:
2019-7-15 18:11
标题:
linux串口相关的程序自动启动,后台运行失败???请大神指导啊???
用了TI AM335 sdk 7.0 ,串口程序(GPRS_P1)在终端下打开,添加“&”后台运行(./GPRS_P1 /dev/ttyUSB3 192.168.2.101 6001 6001 &),符合预期,但是,放在系统开机的时候自动运行,串口无法读取数据
+ k- f* v3 u( T6 L
在rc3.d中添加了启动脚本,(系统默认启动级别是3)GPRS_P1是程序的可执行代码 , /dev/ttyUSB3 192.168.2.101 6001 6001是程序运行参数(argv),好像还缺少哪部分的知识,请大家指点???
" t; i0 x5 [. y" J& z
( t' C& ^ U* q) s3 l9 w
9 ?' F- E- ~- k t8 x' R
/usr/GPRS/bin/Debug/./GPRS_P1 /dev/ttyUSB3 192.168.2.101 6001 6001 &
2 J: R1 R5 H! ]1 y
; n& K6 ]- |7 O! ]
. X( G5 N, A9 ?5 r
; Z* D- V( L5 |" R; |5 g
下面是串口程序
3 V7 } M- M; n4 R" a# a
) R) C" S% N. W. W! }+ b
" ~& X- V- \8 M1 w$ \& q9 E
#include "uart.h"
; A2 y+ y1 W5 R3 K7 k+ {# r* |
' K1 w7 A& Y: F* _. p: e+ c5 [
/*******************************************************************
; d: f4 {! a" M7 s+ t5 u
* 名称: UART0_Open
3 W+ E+ R# Z& T/ z5 U7 |& ?; X" |
* 功能: 打开串口并返回串口设备文件描述
+ W, |. [! t( z h0 O
* 入口参数: fd :文件描述符 port :串口号(ttyS0,ttyS1,ttyS2)
9 Z; d2 c3 h7 \1 d1 |6 g, N
* 出口参数: 正确返回为1,错误返回为0
9 J$ J# h4 E2 m4 {* \0 X/ n
*******************************************************************/
+ V+ _2 Q) d& U2 ~
int UART0_Open(int fd,char* port)
3 \2 s+ t6 U; U" `! I8 o6 O9 Y
{
; x5 N& C5 ?5 w! m' J- g2 W
2 z# n% g2 M" |& S) f" y4 b
//fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY); // O_RDWR 读写
1 Q, }6 d0 N: p8 T- ?8 {8 _
fd = open( port, O_RDWR|O_NOCTTY); //zu se
6 ~: B( [7 F" L
if (fd == -1)
' O% d3 L/ [) ~) _
{
, a. R7 Q3 f( m& V+ H: O5 j+ y
perror("Can't Open Serial Port");
. K8 W* t$ E I& U2 I
return(FALSE);
- v# d1 |+ r% w. M
}
9 U+ g: i" t k' B# K. n( O
//恢复串口为阻塞状态
& h+ H2 L. m Z6 _8 B# s/ g" Z
if(fcntl(fd, F_SETFL, 0) < 0)
' ~ K6 K3 q& M/ ?
{
2 @, W. P- G$ C4 A) T/ m. H3 p
printf("fcntl failed!\n");
; m7 J3 a1 q/ O* S2 ]5 {6 S
return(FALSE);
5 p$ p% f$ k2 h1 G6 _
}
|/ w! t- L; `
else
% u- z& k+ c0 G2 f
{
9 M# {7 n U. |, \" f; f" S& S" G
//printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
8 W( [6 q+ w) [3 g
}
& h$ ^) o H: \ V/ o& f8 ]7 I
//测试是否为终端设备
, P7 M( a$ p. q: D3 r j
if(0 == isatty(STDIN_FILENO))
& L+ l2 T1 [6 B' d6 n; ?' N' r
{
" m2 n8 c- i& z" u/ K
printf("standard input is not a terminal device\n");
9 K0 [+ W0 O! I% i+ e7 {9 j+ P
return(FALSE);
/ Q' y1 K3 X& \. r- ~: V
}
6 q& D7 @0 k1 h U: [
else
& Q! W! l j6 Z* z
{
- G' b, J/ {& a" s
//printf("isatty success!\n");
9 b) t0 D( e' B6 r6 ^6 {. p9 V
}
|& W% {, {1 D% T: J: q5 b
// printf("fd->open=%d\n",fd);
. P" M. |, {6 w- h# ?# O
return fd;
* E: l& d$ X. \6 Y; H- O
}
+ H4 i5 d( I" ^/ F
/*******************************************************************
4 h+ ]' Q' `* T" j
* 名称: UART0_Close
3 V0 _7 _! t; x+ T0 Z. f' c
* 功能: 关闭串口并返回串口设备文件描述
; P2 R4 }$ C" s9 H5 V
* 入口参数: fd :文件描述符 port :串口号(ttyS0,ttyS1,ttyS2)
" c, D3 I! |) m7 k5 z
* 出口参数: void
: A6 B8 X( K1 v9 k, @
*******************************************************************/
' X8 w* F ^: L6 L: l' t) T* S
" E0 q1 \: u, W1 C5 W
void UART0_Close(int fd)
/ l6 _) G3 E, B5 m' P; Q9 z. B4 N
{
1 A; b* m0 t8 t* {( y1 e
close(fd);
! ], {' W8 _ i g; N* U* p$ Z, e
}
6 b1 Y/ Z, I9 f, [. S$ M Q" f* Y
1 F3 s) U7 m/ T( O/ ^+ Q* q
/*******************************************************************
1 r8 ~* K$ z" h+ ?. @7 l' N+ K* K
* 名称: UART0_Set
$ M: i8 c1 x# ]1 i r* R
* 功能: 设置串口数据位,停止位和效验位
' }6 N, R8 T3 P, I/ ?
* 入口参数: fd 串口文件描述符
* [6 t* T' B5 }+ W
* speed 串口速度
6 C! C3 p% L$ t4 z, A
* flow_ctrl 数据流控制
/ L2 W5 S6 {+ I R: k# T
* databits 数据位 取值为 7 或者8
, M4 k2 E7 o: Q4 x! b* y
* stopbits 停止位 取值为 1 或者2
- y E/ h% r7 ?7 y1 \2 O* V* |
* parity 效验类型 取值为N,E,O,,S
0 \; @- P) X; J/ p$ D
*出口参数: 正确返回为1,错误返回为0
7 q! G; K7 h$ [/ `% Q0 P
*******************************************************************/
* L" q9 G) m, y) f) u
int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
) G. k3 l4 D# f& P: ?% E; U
{
2 Z7 n5 u' z. v# q6 W
int i;
2 G, f, e$ \$ o6 S Y
int status;
3 _! X4 o; C& A( W1 M. v
int speed_arr[] = {B3000000,B2500000,B2000000,B1500000,B1152000,B1000000,B921600,B576000,B500000,B460800,B230400,B115200, B19200, B9600, B4800, B2400, B1200, B300};
! J2 q! o6 ^% S+ w# f( S
int name_arr[] = {3000000, 2500000, 2000000, 1500000, 1152000, 1000000, 921600, 576000, 500000, 460800, 230400,115200 , 19200, 9600, 4800, 2400, 1200, 300};
" Y" |* W( R# l9 ]1 [
8 x& ~& M& S* U' G/ m! J
struct termios options;
! P9 N9 z# k/ U- R
' {- V7 x9 t5 T1 {
/*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.
( r- E2 n7 }* r
*/
0 e. r: ^+ m$ _
if ( tcgetattr( fd,&options) != 0)
O" r; O( a6 t
{
/ t4 R- }: F4 T# j( U( d0 b8 s
perror("SetupSerial 1");
0 e; }3 W k7 y) N
return(FALSE);
+ I6 E* T; \# }2 I; X9 m
}
' w, B+ R- U1 ]( H: T
& `" w& }% f9 l0 m( R
//设置串口输入波特率和输出波特率
N6 H: Q6 v2 M/ E$ g
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
7 D9 u% s( R: w/ t* c
{
+ w7 R, }1 ^1 m: c
if (speed == name_arr
)
3 j( t* Y8 Y. E7 C: ~! G) O: E
{
/ ^/ t5 Q2 h! Y( b
cfsetispeed(&options, speed_arr
);
0 |: {9 D$ f" X& k" c# [9 P
cfsetospeed(&options, speed_arr
);
0 L0 z4 r5 ~+ n; Y
break;
0 h# R/ r O' z4 S
}
5 i; c* g4 W( {' e6 T R% h
}
4 i/ E! k4 I5 Q$ V. f% Z
1 P0 f, I+ b: t& [# E" t
//修改控制模式,保证程序不会占用串口
; g6 K6 _, O7 Y# L! l1 C
options.c_cflag |= CLOCAL;
+ a; t. c- C6 \9 w0 y
//修改控制模式,使得能够从串口中读取输入数据
# V/ I9 Q: W3 Z; G& Z9 ~
options.c_cflag |= CREAD;
+ Q* {) H) W, ? J/ x
$ ^0 h1 F1 x7 y5 o" B5 @/ `9 l
//设置数据流控制
- O4 `9 A" R4 Z3 J# F' h( [+ y
switch(flow_ctrl)
. H) ?5 F6 ~: h$ x0 K6 w
{
8 Z/ N/ O4 t+ e0 A8 ]" Q) p
0 O+ L/ J" ]9 q
case 0 ://不使用流控制
0 E1 i% ]' {; Q7 D/ A+ V4 H
options.c_cflag &= ~CRTSCTS;
1 `5 i( b: [" N( B8 x
break;
) [' {2 U" x1 e! m+ d+ k6 K9 t
6 U+ g4 H% l4 B! ^0 c( [$ J
case 1 ://使用硬件流控制
0 Q/ C/ G/ u1 p$ J
options.c_cflag |= CRTSCTS;
* ?9 r- _# B6 f4 [& R |
break;
9 F! C5 b9 U- p' h
case 2 ://使用软件流控制
* q9 i, K2 b8 H$ P3 E
options.c_cflag |= IXON | IXOFF | IXANY;
! \3 X) P! F6 r# X' Q, L
break;
' ~ |8 D0 o5 J/ {9 A" P& ?
}
* G! t" c5 r. g: m& v7 B
//设置数据位
8 \( ~: ?( Z) O1 |* ?
//屏蔽其他标志位
' o4 q, f7 f/ }2 E' m/ U
options.c_cflag &= ~CSIZE;
! K, S# L) s4 W h8 I
switch (databits)
6 N7 V' o1 Q$ i4 c0 C
{
' R g) o: x0 O4 J# d
case 5 :
; U" |% ~% H0 e7 m6 t
options.c_cflag |= CS5;
4 t" S, q+ D' H- s3 e1 I
break;
3 N7 D; E w8 Y0 v+ ~# d
case 6 :
3 ?( i( A' W- f
options.c_cflag |= CS6;
, U1 K, e0 h% g2 B
break;
6 g+ |0 P7 C8 Q6 j' R' |( U
case 7 :
: N- Y) a2 a( }
options.c_cflag |= CS7;
* R% Y# h8 C1 r5 a0 y
break;
( @( [+ j* b5 s8 B
case 8:
1 ]) S5 i! w/ G9 t6 t# m
options.c_cflag |= CS8;
9 d1 r2 M6 |2 G1 a/ I4 a k
break;
! w. }4 L @0 x
default:
3 Y0 T5 y- P4 B' C
fprintf(stderr,"Unsupported data size\n");
1 g- K6 ~$ t3 x1 h& K9 o
return (FALSE);
$ M+ q& D y2 q. C, |# J3 F4 O) V
}
. P. ?( c) P0 T
//设置校验位
( C) r% K. F. H( d$ P/ f/ `
switch (parity)
, O( Y; n4 C4 Y( [* |& q1 }% h1 y
{
8 b# C' u# q* n7 ?( G$ j
case 'n':
/ H# X0 ?* d- j" s
case 'N': //无奇偶校验位。
9 a) W* ~) m' h& ?+ w$ C
options.c_cflag &= ~PARENB;
. ?8 k `% |" F7 n3 z8 k
options.c_iflag &= ~INPCK;
3 \1 Q* O" W/ I+ R+ G* k% B5 K" _
break;
3 X. |/ `" ?4 \6 Z, l4 O; R
case 'o':
. i$ m5 y1 D X" G6 \" M6 j& v
case 'O'://设置为奇校验
; ~8 R/ l: \# B3 e6 V
options.c_cflag |= (PARODD | PARENB);
! w6 k' z% Q5 ^6 X# f, }5 I
options.c_iflag |= INPCK;
9 m9 _% u' P% d/ w5 H. T) Z' x8 \
break;
- k' u" f/ S) J' ?, i8 ]" F
case 'e':
4 s: f \& h P/ O" `
case 'E'://设置为偶校验
: v0 o2 c% Z" `. X
options.c_cflag |= PARENB;
0 m3 D- ^5 h/ t- Z
options.c_cflag &= ~PARODD;
6 Q( b7 X: o; ^8 b! T$ X: g2 b# D/ w, L
options.c_iflag |= INPCK;
& J; X A/ ^3 Y* ?
break;
' W8 K4 o' O$ L5 |% c
case 's':
- W- z7 y5 W" ?& H" @% {9 E
case 'S': //设置为空格
$ D) F, r7 g. ]8 G
options.c_cflag &= ~PARENB;
% f/ g) h" U$ x& m: E
options.c_cflag &= ~CSTOPB;
: l8 u c+ k4 w- @5 N1 b7 E ]; P
break;
# H: C7 U P5 q; `1 f1 G% d
default:
1 \( a4 l9 e n C% G6 `
fprintf(stderr,"Unsupported parity\n");
: q5 h8 |8 C3 r* r* i, u
return (FALSE);
3 a4 @$ P) B; C7 C6 U7 p
}
- @4 p: W$ z% t0 |, U9 X
// 设置停止位
& k- z+ \6 s& f
switch (stopbits)
5 H' Z4 r6 Q( H4 x! A" u
{
8 U4 n6 o9 C& j
case 1:
/ k6 l7 e: k A5 i% a
options.c_cflag &= ~CSTOPB;
' f- i' ~; P+ t; ~9 Q6 @) o/ A
break;
3 T, H# |8 J" b/ E6 k) ]4 M/ p
case 2:
6 J B3 G9 j0 e! ~) a" j0 n
options.c_cflag |= CSTOPB;
6 `) C- i2 H' g d! k/ K2 e9 Q
break;
% U9 r) s5 j" X
default:
# c3 H2 R {: O* D/ V. M
fprintf(stderr,"Unsupported stop bits\n");
5 h& u/ ]/ n; `- z) K. @
return (FALSE);
- }0 Z8 ]" g" T( ~
}
! P2 w7 k: I9 i4 ]7 M* B) y
' i+ ^2 R' k* e0 j1 Y$ i, ~
//修改输出模式,原始数据输出
) O B. n0 R3 n0 ?' }
//options.c_oflag &= ~OPOST;
( L0 S2 L5 B9 s9 a3 y2 d; J
//options.c_iflag &= ~(ICRNL | IXON);
1 i5 K" C# t$ K! Z" g
options.c_oflag =0;
$ W& N3 }, G! h1 B9 s2 N
options.c_iflag =0;
" f! F# r( L- s- w$ ?
' ]/ t1 X. [1 B5 P
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//
: i9 e0 P* r! g
//options.c_lflag &= ~(ISIG | ICANON);
1 R2 j: M5 D3 G. A
* ^7 H1 @, M) G8 i: F4 P3 Y
//设置等待时间和最小接收字符
' _1 L$ L! r8 B9 k) v+ d- R ~
options.c_cc[VTIME] = 0; /* 读取一个字符等待1*(1/10)s */
" o7 d. `- D% j2 c
options.c_cc[VMIN] = 0; /* 读取字符的最少个数为1 */
C2 H+ x( _) }0 K; R% [' a
* I8 s7 u3 k8 @; [/ B) |9 I! S
//如果发生数据溢出,接收数据,但是不再读取 刷新收到的数据但是不读
* C% F5 p* U. y& l5 _" g
tcflush(fd,TCIFLUSH);
7 m5 N* I/ r) M2 O8 }
* M0 q7 |/ m2 }* j. ?/ M8 T; n
//激活配置 (将修改后的termios数据设置到串口中)
j' v$ A6 }) o3 P' l" C' `8 I
if (tcsetattr(fd,TCSANOW,&options) != 0)
9 j0 t' v6 t; b' Y7 r' D$ m
{
8 ~7 J/ P0 {0 S \5 C, u9 l* a/ L
perror("com set error!\n");
, Z3 i# {! h* H0 Y2 `6 t. o6 r3 g/ r- \* D
return (FALSE);
6 p' G* [% N ~* `! d. u
}
8 s9 T8 Z9 ?3 R' ~8 p: X7 e
return (TRUE);
7 D$ X/ T9 o2 H: w+ a7 m
}
& X- V" x" @/ ?+ m0 g4 |& M- k
/*******************************************************************
# [% |8 U6 n1 K# n# R; i/ H
* 名称: UART0_Init()
2 d6 r! `: t' ?/ G/ Q/ b
* 功能: 串口初始化
1 f, N6 h3 [( t* N7 _: ^
* 入口参数: fd : 文件描述符
2 M/ }9 `7 N$ i4 H
* speed : 串口速度
3 a& d6 b" w2 w. {
* flow_ctrl 数据流控制
& m: N" D9 N( N. D
* databits 数据位 取值为 7 或者8
2 S% y. K1 D' [' i: ]
* stopbits 停止位 取值为 1 或者2
, k9 c3 R( A, |' \7 N
* parity 效验类型 取值为N,E,O,,S
( F6 `) U% j7 }$ t. K
*
' p2 J& k5 l# |) i' A
* 出口参数: 正确返回为1,错误返回为0
' `1 y% G0 q: f, t Z
*******************************************************************/
S- J7 X' }8 w) z: u9 ]/ S; A
int UART0_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity)
$ H1 N( i7 A( L& m) w, b, a+ |, W6 y
{
7 `$ J# ^3 v/ t: L7 }8 j* `. E
//int err;
, N/ a' o" Z/ G- P: {7 _
//设置串口数据帧格式
' S, c6 [+ [3 |4 w5 f3 I8 g* P
if (UART0_Set(fd,speed,flow_ctrl,databits,stopbits,parity) == FALSE)
1 Z( A( }, W+ C! e
{
! A9 o5 T1 T* l' c7 ~
return FALSE;
& o/ c) O( I5 v7 B8 F* c
}
5 U6 M4 j9 L8 [9 h! X
else
2 a, e9 _, b' D0 Y* W7 j1 U
{
( X% s( [- f) ]
return TRUE;
$ e! _( q7 H! w3 f2 x* F
}
h9 L8 h- C+ M* k1 V0 K
}
! p$ a$ g2 n. m2 [- l# Z# M
9 {2 `! k1 Y6 J+ f
/*******************************************************************
( o+ n0 y& [, S; p5 s! H+ `- P
* 名称: UART0_Recv
- R2 X# X5 Y1 l' Y+ b
* 功能: 接收串口数据
; T* S. Z9 s! @8 y5 M
* 入口参数: fd :文件描述符
: \, x/ Q, [1 y" Q0 f+ U/ P. B3 f
* rcv_buf :接收串口中数据存入rcv_buf缓冲区中
}. X. Z. v6 n" N6 A
* data_len :一帧数据的长度
& \1 g7 `& Z- j, o) f7 r7 h4 \
* 出口参数: 正确返回为1,错误返回为0
) L9 q9 b% i/ k- x5 G0 B
*******************************************************************/
2 Q; u, ^/ r. w' d$ e6 P
int UART0_Recv(int fd,unsigned char *rcv_buf,int data_len)
+ d/ m5 G, w% Q" m! H; E1 R
{
% ~! T$ C8 Y; G) }; ?& i7 }; j
struct timeval tv_timeout;
. _$ ?% o' h+ \6 a. p" M" j, C
int len=0;
/ Z$ j% W) ], K% W% O+ L" @# G
tv_timeout.tv_sec = 0;
( J% i9 {' [6 ]9 ^& q Q
tv_timeout.tv_usec = 40 * 1000; //微妙 20MS
- [. O+ E5 W+ Q' ?
select(fd+1, NULL, NULL, NULL, &tv_timeout); //only read
; @$ [. P6 W, G: r4 z- ?
len = read(fd, rcv_buf, data_len);
/ u6 Q9 f K: P, F/ g
//printf("len = %d\n", len);
! y0 G& H& `/ x7 P/ D/ I
return len;
H7 N1 |8 u2 E$ r/ f
}
' C* l4 N+ R( k
/********************************************************************
' U$ `$ M; z6 J8 ]* g' O" b( ~) o# f" l
* 名称: UART0_Send
' z/ ^% P4 r( l+ y1 ^$ V/ K
* 功能: 发送数据
) R5 H" }! k8 |0 {( J
* 入口参数: fd :文件描述符
" l$ C+ Y% A0 T& P% P
* send_buf :存放串口发送数据
: {% I2 p# R+ ]* `, I
* data_len :一帧数据的个数
, w3 G" g; } Z- Q
* 出口参数: 正确返回为1,错误返回为0
' J- I6 b# U1 V$ U# E! c
*******************************************************************/
* K& z2 T# k* D" L! `
int UART0_Send(int fd,unsigned char *send_buf,int data_len)
- ~( m) Q& [% P% J* |
{
, c8 Z7 s# ? @1 v, i
int len = 0;
& ?+ w9 v. J3 _) [) P
3 D" B& }0 f I" u0 K& L2 p4 |* n4 T
len = write(fd,send_buf,data_len);
( e, U& Z5 ]( p
if (len == data_len )
: }8 B; G, V: I
{
* e0 e, U: V! C5 c6 _; C7 P
return len;
: K+ o% q- I4 L" @
}
3 t& Z. L& {6 ^4 ]( U+ \; d
else
2 M4 z4 |' [: S8 y1 B
{
( u1 G/ r: v' e$ M8 ~
tcflush(fd,TCOFLUSH);
6 C& ^8 O' R% V, n+ h& w* E% ^
return FALSE;
: m, W5 Z( m( w5 w% m% Y
}
4 F8 x+ A- F& f% n5 t" f
% j+ Y" v) d2 D$ }! f, ?
}
L' X) t' I* I2 x6 N# R6 y# X; r
1 c5 t) P y! W0 h6 R2 m9 u) L
% X9 g- W/ I! g; f4 u
# D4 n% p0 o, x0 F- A$ L
2 L+ k! f q2 w! R
" \$ `% j3 C4 ?; D/ T; f/ @+ D
9 n3 `& Z3 Y8 @3 N P- u
# _% B7 o( S# b4 ~- `0 q
, A- {, Z, `' b X
' L% G+ j4 ]2 Y" ^, Z6 u
作者:
gaoxings
时间:
2019-7-15 18:52
路过帮顶
6 F- _$ ?$ S2 u2 T. G5 B
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2