Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12094
  • 博文数量: 12
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 23:35
文章分类
文章存档

2017年(11)

2011年(1)

我的朋友

分类: LINUX

2011-07-08 19:20:53

    最近你才开始接触Linux下的编程,实验室接手了一个小的串口协议的编写,主要是一个握手协议和相关功能的设置:很简单,还没有继续完善。就是一个简单程序而已,以后可能还要修改,不过先在这里记录下来吧!
   经过这次编程,串口编程基本上是掌握了,接下来继续向Linux下的编程开进!

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <errno.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <unistd.h>
  8. #include <termios.h>
  9. #include <stdlib.h>

  10. int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
  11. {
  12.     struct termios newtio,oldtio;
  13.     if ( tcgetattr( fd,&oldtio) != 0)
  14.     {
  15.         perror("SetupSerial 1");
  16.         return -1;
  17.     }
  18.     bzero( &newtio, sizeof( newtio ) );
  19.     newtio.c_cflag |= CLOCAL | CREAD;
  20.     newtio.c_cflag &= ~CSIZE;

  21.     switch( nBits )
  22.     {
  23.     case 7:
  24.         newtio.c_cflag |= CS7;
  25.         break;
  26.     case 8:
  27.         newtio.c_cflag |= CS8;
  28.         break;
  29.     }

  30.     switch( nEvent )
  31.     {
  32.     case 'O':
  33.         newtio.c_cflag |= PARENB;
  34.         newtio.c_cflag |= PARODD;
  35.         newtio.c_iflag |= (INPCK | ISTRIP);
  36.         break;
  37.     case 'E':
  38.         newtio.c_iflag |= (INPCK | ISTRIP);
  39.         newtio.c_cflag |= PARENB;
  40.         newtio.c_cflag &= ~PARODD;
  41.         break;
  42.     case 'N':
  43.         newtio.c_cflag &= ~PARENB;
  44.         break;
  45.     }

  46.     switch( nSpeed )
  47.     {
  48.     case 2400:
  49.         cfsetispeed(&newtio, B2400);
  50.         cfsetospeed(&newtio, B2400);
  51.         break;
  52.     case 4800:
  53.         cfsetispeed(&newtio, B4800);
  54.         cfsetospeed(&newtio, B4800);
  55.         break;
  56.     case 9600:
  57.         cfsetispeed(&newtio, B9600);
  58.         cfsetospeed(&newtio, B9600);
  59.         break;
  60.     case 115200:
  61.         cfsetispeed(&newtio, B115200);
  62.         cfsetospeed(&newtio, B115200);
  63.         break;
  64.     default:
  65.         cfsetispeed(&newtio, B9600);
  66.         cfsetospeed(&newtio, B9600);
  67.         break;
  68.     }
  69.     if( nStop == 1 )
  70.         newtio.c_cflag &= ~CSTOPB;
  71.     else if ( nStop == 2 )
  72.         newtio.c_cflag |= CSTOPB;
  73.     newtio.c_cc[VTIME] = 0;
  74.     newtio.c_cc[VMIN] = 1;
  75.     tcflush(fd,TCIFLUSH);
  76.     if((tcsetattr(fd,TCSANOW,&newtio))!=0)
  77.     {
  78.         perror("com set error");
  79.         return -1;
  80.     }
  81.     printf("set done!\n");
  82.     return 0;
  83. }

  84. int open_port(int fd,int comport)
  85. {
  86.     char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};
  87.     long vdisable;
  88.     if (comport==1)
  89.     {
  90.         fd = open( "/dev/ttyS0", O_RDWR);
  91.         if (-1 == fd)
  92.         {
  93.             perror("Can't Open Serial Port");
  94.             return(-1);
  95.         }
  96.         else
  97.         printf("open ttyS0 .....\n");
  98.     }
  99.     else if(comport==2)
  100.     {
  101.         fd = open( "/dev/ttyS1", O_RDWR);
  102.         if (-1 == fd)
  103.         {
  104.         perror("Can't Open Serial Port");
  105.         return(-1);
  106.         }
  107.         else
  108.         printf("open ttyS1 .....\n");
  109.     }
  110.     else if (comport==3)
  111.     {
  112.     fd = open( "/dev/ttyS2", O_RDWR);
  113.     if (-1 == fd){
  114.         perror("Can't Open Serial Port");
  115.         return(-1);
  116.     }
  117.     else
  118.         printf("open ttyS2 .....\n");
  119.     }
  120.      if(fcntl(fd, F_SETFL, 0)<0)
  121.      printf("fcntl failed!\n");
  122.     else
  123.         printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
  124.     if(isatty(STDIN_FILENO)==0)
  125.         printf("standard input is not a terminal device\n");
  126.     else
  127.         printf("isatty success!\n");
  128.     printf("fd open=%d\n",fd);
  129.     return fd;
  130. }
  131. float data_sovle(char buff[])
  132. {
  133.     float a,b,c;
  134.     if (buff[0]/32%2==0)
  135.     {
  136.         a=((float)(buff[0]/32%2*256+buff[1]))/10.0;
  137.     }
  138.     else
  139.     {
  140.         a=-((float)(buff[0]/32%2*256+buff[1]))/10.0;
  141.     }
  142.     printf("Current W %2.2f/s\n",a);
  143.     if (buff[0]/128%2==0)
  144.     {
  145.         b=(float)buff[2]/100;
  146.     }
  147.     else
  148.     {
  149.         b=-(float)(buff[2])/100;
  150.     }
  151.     printf("Current Vx %2.2fm/s\n",b);
  152.     if (buff[0]/64%2==0)
  153.     {
  154.         c=(float)buff[3]/100;
  155.     }
  156.     else
  157.     {
  158.         c=-(float)(buff[3])/100;
  159.     }
  160.     printf("Current Vy %2.2fm/s\n",c);
  161.     return 0;
  162. }
  163. int main(void)
  164. {
  165.     int fd;
  166.     int nread_hand,nwrite_hand,nread,nwrite,i;
  167.     char buff_hand[1];
  168.     char buff_handsend[1]={21};
  169.     char buff_recv_data4[4];
  170.     char buff_recv_data5[5];
  171.     char buff_send_data1[5]={24,0,182,100,31};
  172.     char buff_send_data2[5]={1,144,0,0,31};
  173.     char buff_send_data3[5]={137,44,194,80,41};
  174.     char buff_signal[1];
  175.     char buff_switch[1];
  176.     char buff_temp[1];
  177.     if((fd=open_port(fd,1))<0)
  178.     {
  179.         perror("open_port error");
  180.         return;
  181.     }
  182.     if((i=set_opt(fd,115200,8,'O',1))<0)
  183.     {
  184.         perror("set_opt error");
  185.         return;
  186.     }
  187.     printf("fd=%d\n",fd);
  188.     sleep(3);

  189.     nread_hand=read(fd,buff_hand,1);
  190. /*    printf("buff_hand is %d %d\n",nread_hand,buff_hand[0]);
  191.     nwrite=write(fd,buff_handsend,1);
  192.     printf("222-%d",buff_handsend[0]);*/
  193.     if(buff_hand[0]==21)
  194.     {
  195.         printf("buf_hand1 %d\n",buff_hand[0]);
  196.         nwrite_hand=write(fd,buff_handsend,1);
  197.         printf("buf_hand2 %d\n",buff_handsend[0]);
  198.     }
  199.     else
  200.     {
  201.         printf("receive hand error\n");
  202.         return 0;
  203.     }

  204.     nread=read(fd,buff_recv_data4,4);
  205.     data_sovle(buff_recv_data4);
  206.     printf("Input the control mode");
  207.     scanf("%d",buff_signal);
  208.     buff_switch[0]=buff_signal[0];
  209.     while(1)
  210.     {

  211.         switch(buff_switch[0])
  212.         {
  213.             case 31:
  214.             {    
  215.                 printf("Please input control mode ");
  216.                 scanf("%d",buff_temp);
  217.                 printf("%d",buff_temp[0]);
  218.                 switch(buff_temp[0])
  219.                 {
  220.                     case 1:
  221.                         nwrite=write(fd,buff_send_data1,5);
  222.                         nread=read(fd,buff_recv_data5,5);
  223.                         data_sovle(buff_recv_data5);
  224.                         buff_switch[0]=buff_send_data1[4];
  225.                         break;
  226.                     case 2:
  227.                         nwrite=write(fd,buff_send_data2,5);
  228.                         nread=read(fd,buff_recv_data5,5);
  229.                         data_sovle(buff_recv_data5);
  230.                         buff_switch[0]=buff_send_data2[4];
  231.                         break;
  232.                     case 3:
  233.                         nwrite=write(fd,buff_send_data3,5);
  234.                         nread=read(fd,buff_recv_data5,5);
  235.                         data_sovle(buff_recv_data5);
  236.                         buff_switch[0]=buff_send_data3[4];
  237.                         break;
  238.                 }
  239.                 
  240.             }
  241.             break;
  242.             case 41:
  243.                 nread=read(fd,buff_recv_data4,4);
  244.                 data_sovle(buff_recv_data4);
  245.                 printf("Please input replay signal ");
  246.                 scanf("%d",buff_signal);
  247.                 buff_switch[0]=buff_signal[0];
  248.                 break;
  249.             case 51:
  250.                 nread=read(fd,buff_recv_data4,4);
  251.                 data_sovle(buff_recv_data4);
  252.                 printf("Please input replay signal ");
  253.                 scanf("%d",buff_signal);
  254.                 buff_switch[0]=buff_signal[0];
  255.                 break;
  256.             default:
  257.                 nread=read(fd,buff_recv_data4,4);
  258.                 data_sovle(buff_recv_data4);
  259.                 printf("Please input replay signal ");
  260.                 scanf("%d",buff_signal);
  261.                 buff_switch[0]=buff_signal[0];
  262.                 break;
  263.         }
  264.     }

  265.     close(fd);
  266.     return 0;

  267. }
   还会继续修改,这个程序也是参考别人的修改的,加上了一些附加功能,还有中间编程还有部队的地方,一些细节还要继续修改!
   第一次记录自己的Linux学习经历,有什么不好的地方还请大家指正,帮助我进步!编程还真是一个技术活啊,吹牛真是不行的,实践了才知道啊!当然感觉不错,也许这就是开源分享。
阅读(503) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~