[ARM入门] linux串口相关的程序自动启动,后台运行失败

[复制链接]
 楼主| 王项电子 发表于 2017-3-13 09:04 | 显示全部楼层 |阅读模式
我用了TI AM335 sdk 7.0 ,串口程序(GPRS_P1)在终端下打开,添加“&”后台运行(./GPRS_P1 /dev/ttyUSB3 192.168.2.101 6001 6001 &),符合预期,但是,放在系统开机的时候自动运行,串口无法读取数据
在rc3.d中添加了启动脚本,(系统默认启动级别是3)GPRS_P1是程序的可执行代码 , /dev/ttyUSB3 192.168.2.101 6001 6001是程序运行参数(argv),我这是缺少哪部分的知识,请大家指点@盈鹏飞科技 @chunyang @hotpower
  1. /usr/GPRS/bin/Debug/./GPRS_P1 /dev/ttyUSB3 192.168.2.101 6001 6001 &
下面是我的串口程序
  1. #include "uart.h"

  2. /*******************************************************************
  3. * 名称:                  UART0_Open
  4. * 功能:                打开串口并返回串口设备文件描述
  5. * 入口参数:        fd    :文件描述符     port :串口号(ttyS0,ttyS1,ttyS2)
  6. * 出口参数:        正确返回为1,错误返回为0
  7. *******************************************************************/
  8. int UART0_Open(int fd,char* port)
  9. {

  10.     //fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);         // O_RDWR 读写
  11.     fd = open( port, O_RDWR|O_NOCTTY);         //zu se
  12.     if (fd == -1)
  13.     {
  14.         perror("Can't Open Serial Port");
  15.         return(FALSE);
  16.     }
  17.     //恢复串口为阻塞状态
  18.     if(fcntl(fd, F_SETFL, 0) < 0)
  19.     {
  20.         printf("fcntl failed!\n");
  21.         return(FALSE);
  22.     }
  23.     else
  24.     {
  25.         //printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
  26.     }
  27.     //测试是否为终端设备
  28.     if(0 == isatty(STDIN_FILENO))
  29.     {
  30.         printf("standard input is not a terminal device\n");
  31.         return(FALSE);
  32.     }
  33.     else
  34.     {
  35.         //printf("isatty success!\n");
  36.     }
  37. //        printf("fd->open=%d\n",fd);
  38.     return fd;
  39. }
  40. /*******************************************************************
  41. * 名称:                UART0_Close
  42. * 功能:                关闭串口并返回串口设备文件描述
  43. * 入口参数:        fd    :文件描述符     port :串口号(ttyS0,ttyS1,ttyS2)
  44. * 出口参数:        void
  45. *******************************************************************/

  46. void UART0_Close(int fd)
  47. {
  48.     close(fd);
  49. }

  50. /*******************************************************************
  51. * 名称:                UART0_Set
  52. * 功能:                设置串口数据位,停止位和效验位
  53. * 入口参数:        fd        串口文件描述符
  54. *                              speed     串口速度
  55. *                              flow_ctrl   数据流控制
  56. *                           databits   数据位   取值为 7 或者8
  57. *                           stopbits   停止位   取值为 1 或者2
  58. *                           parity     效验类型 取值为N,E,O,,S
  59. *出口参数:          正确返回为1,错误返回为0
  60. *******************************************************************/
  61. int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
  62. {
  63.     int   i;
  64.     int   status;
  65.     int   speed_arr[] = {B3000000,B2500000,B2000000,B1500000,B1152000,B1000000,B921600,B576000,B500000,B460800,B230400,B115200, B19200, B9600, B4800, B2400, B1200, B300};
  66.     int   name_arr[] =   {3000000, 2500000, 2000000, 1500000, 1152000, 1000000, 921600, 576000, 500000, 460800, 230400,115200 ,  19200,  9600,  4800,  2400,  1200,  300};

  67.     struct termios options;

  68.     /*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.
  69.     */
  70.     if  ( tcgetattr( fd,&options)  !=  0)
  71.     {
  72.         perror("SetupSerial 1");
  73.         return(FALSE);
  74.     }

  75.     //设置串口输入波特率和输出波特率
  76.     for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)
  77.     {
  78.         if  (speed == name_arr[i])
  79.         {
  80.             cfsetispeed(&options, speed_arr[i]);
  81.             cfsetospeed(&options, speed_arr[i]);
  82.             break;
  83.         }
  84.     }

  85.     //修改控制模式,保证程序不会占用串口
  86.     options.c_cflag |= CLOCAL;
  87.     //修改控制模式,使得能够从串口中读取输入数据
  88.     options.c_cflag |= CREAD;

  89.     //设置数据流控制
  90.     switch(flow_ctrl)
  91.     {

  92.     case 0 ://不使用流控制
  93.         options.c_cflag &= ~CRTSCTS;
  94.         break;

  95.     case 1 ://使用硬件流控制
  96.         options.c_cflag |= CRTSCTS;
  97.         break;
  98.     case 2 ://使用软件流控制
  99.         options.c_cflag |= IXON | IXOFF | IXANY;
  100.         break;
  101.     }
  102.     //设置数据位
  103.     //屏蔽其他标志位
  104.     options.c_cflag &= ~CSIZE;
  105.     switch (databits)
  106.     {
  107.     case 5    :
  108.         options.c_cflag |= CS5;
  109.         break;
  110.     case 6    :
  111.         options.c_cflag |= CS6;
  112.         break;
  113.     case 7    :
  114.         options.c_cflag |= CS7;
  115.         break;
  116.     case 8:
  117.         options.c_cflag |= CS8;
  118.         break;
  119.     default:
  120.         fprintf(stderr,"Unsupported data size\n");
  121.         return (FALSE);
  122.     }
  123.     //设置校验位
  124.     switch (parity)
  125.     {
  126.     case 'n':
  127.     case 'N': //无奇偶校验位。
  128.         options.c_cflag &= ~PARENB;
  129.         options.c_iflag &= ~INPCK;
  130.         break;
  131.     case 'o':
  132.     case 'O'://设置为奇校验
  133.         options.c_cflag |= (PARODD | PARENB);
  134.         options.c_iflag |= INPCK;
  135.         break;
  136.     case 'e':
  137.     case 'E'://设置为偶校验
  138.         options.c_cflag |= PARENB;
  139.         options.c_cflag &= ~PARODD;
  140.         options.c_iflag |= INPCK;
  141.         break;
  142.     case 's':
  143.     case 'S': //设置为空格
  144.         options.c_cflag &= ~PARENB;
  145.         options.c_cflag &= ~CSTOPB;
  146.         break;
  147.     default:
  148.         fprintf(stderr,"Unsupported parity\n");
  149.         return (FALSE);
  150.     }
  151.     // 设置停止位
  152.     switch (stopbits)
  153.     {
  154.     case 1:
  155.         options.c_cflag &= ~CSTOPB;
  156.         break;
  157.     case 2:
  158.         options.c_cflag |= CSTOPB;
  159.         break;
  160.     default:
  161.         fprintf(stderr,"Unsupported stop bits\n");
  162.         return (FALSE);
  163.     }

  164.     //修改输出模式,原始数据输出
  165.     //options.c_oflag &= ~OPOST;
  166.     //options.c_iflag &= ~(ICRNL | IXON);
  167.     options.c_oflag =0;
  168.     options.c_iflag =0;

  169.     options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//
  170. //options.c_lflag &= ~(ISIG | ICANON);

  171.     //设置等待时间和最小接收字符
  172.     options.c_cc[VTIME] = 0; /* 读取一个字符等待1*(1/10)s */
  173.     options.c_cc[VMIN] = 0; /* 读取字符的最少个数为1 */

  174.     //如果发生数据溢出,接收数据,但是不再读取 刷新收到的数据但是不读
  175.     tcflush(fd,TCIFLUSH);

  176.     //激活配置 (将修改后的termios数据设置到串口中)
  177.     if (tcsetattr(fd,TCSANOW,&options) != 0)
  178.     {
  179.         perror("com set error!\n");
  180.         return (FALSE);
  181.     }
  182.     return (TRUE);
  183. }
  184. /*******************************************************************
  185. * 名称:                UART0_Init()
  186. * 功能:                串口初始化
  187. * 入口参数:        fd       :  文件描述符
  188. *               speed  :  串口速度
  189. *                              flow_ctrl  数据流控制
  190. *               databits   数据位   取值为 7 或者8
  191. *                           stopbits   停止位   取值为 1 或者2
  192. *                           parity     效验类型 取值为N,E,O,,S
  193. *
  194. * 出口参数:        正确返回为1,错误返回为0
  195. *******************************************************************/
  196. int UART0_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity)
  197. {
  198.     //int err;
  199.     //设置串口数据帧格式
  200.     if (UART0_Set(fd,speed,flow_ctrl,databits,stopbits,parity) == FALSE)
  201.     {
  202.         return FALSE;
  203.     }
  204.     else
  205.     {
  206.         return  TRUE;
  207.     }
  208. }

  209. /*******************************************************************
  210. * 名称:                  UART0_Recv
  211. * 功能:                接收串口数据
  212. * 入口参数:        fd                  :文件描述符
  213. *                              rcv_buf     :接收串口中数据存入rcv_buf缓冲区中
  214. *                              data_len    :一帧数据的长度
  215. * 出口参数:        正确返回为1,错误返回为0
  216. *******************************************************************/
  217. int UART0_Recv(int fd,unsigned char *rcv_buf,int data_len)
  218. {
  219.     struct timeval tv_timeout;
  220.     int len=0;
  221.     tv_timeout.tv_sec  = 0;
  222.     tv_timeout.tv_usec = 40 * 1000; //微妙 20MS
  223.     select(fd+1, NULL, NULL, NULL, &tv_timeout); //only read
  224.     len = read(fd, rcv_buf, data_len);
  225.     //printf("len = %d\n", len);
  226.     return len;
  227. }
  228. /********************************************************************
  229. * 名称:                  UART0_Send
  230. * 功能:                发送数据
  231. * 入口参数:        fd                  :文件描述符
  232. *                              send_buf    :存放串口发送数据
  233. *                              data_len    :一帧数据的个数
  234. * 出口参数:        正确返回为1,错误返回为0
  235. *******************************************************************/
  236. int UART0_Send(int fd,unsigned char *send_buf,int data_len)
  237. {
  238.     int len = 0;

  239.     len = write(fd,send_buf,data_len);
  240.     if (len == data_len )
  241.     {
  242.         return len;
  243.     }
  244.     else
  245.     {
  246.         tcflush(fd,TCOFLUSH);
  247.         return FALSE;
  248.     }

  249. }

评论

楼主这个问题最后怎么解决的?  发表于 2019-7-3 14:39
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我是菜鸟,我高兴,我自豪,。因为不久我就会成为老鸟,。

18

主题

112

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部