加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

上位机控制通过TCP发送命令给开发板,控制LED亮灭

(2014-09-08 14:12:26)
标签:

365

分类: Linux

在主机与Linux TCP/IP双向通信的实践完成之后,我又做了一下通过TCP发送命令给开发板,控制开发板的亮灭。

开发板中有LED控制点额APP

我稍微改动了一下,与原来TCP通信的程序合成了一个,目前这个程序放在 /home/zmn/tcpctlled文件夹中,我的做法是将.c文件拷贝到原来leds例程文件夹中,直接利用它已有的Makefile

改动有几点:

---电脑端 程序中绑定的IP 改为开发板IP,而不是LinuxIP

---我只控制了一个灯

---添加了3个与命令比对的字符串数组

问题和调试:

最大的问题就是TCP通信正常,但是命令发送只有一次起作用,就是说我发送on 命令,相应的灯可以亮,但是再发送off灯不会熄灭,但是开发板确实收到了命令,因为我写的程序是主机发送什么,开发板端显示且再给主机发送回去,经过调试,发现是文件打开函数的位置放的不对,应该放在while循环中,之后问题就解决了。

 

开发板端程序如下,因为电脑端程序没有改动,同TCP/IP通信实践中,我的日志里也有记录。

#include       
#include       
#include       
#include           
#include          
#include


#include
#include
#include
#include
        
 
#define HELLO_WORLD_SERVER_PORT    4000  
#define LENGTH_OF_LISTEN_QUEUE 20  
#define BUFFER_SIZE 1024 


#define LED2 "/sys/class/leds/am3517::d8/brightness"
#define LED3 "/sys/class/leds/am3517::d11/brightness"
#define LED4 "/sys/class/leds/am3517::d12/brightness"

 
int main(int argc, char **argv) 

 
 int f_led2;
 unsigned char dat2;
 

 
    struct sockaddr_in server_addr; 
    int server_socket; 
    int opt = 1;
    
    bzero(&server_addr,sizeof(server_addr));  
     
    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = htons(INADDR_ANY); 
    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT); 
 
     
    server_socket = socket(PF_INET,SOCK_STREAM,0); 
    if( server_socket < 0) 
   
        printf("Create Socket Failed!"); 
        exit(1); 
   
  
     
    setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); 
    if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))) 
   
        printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);  
        exit(1); 
   
 
     
    if(listen(server_socket, LENGTH_OF_LISTEN_QUEUE)) 
   
        printf("Server Listen Failed!");  
        exit(1); 
   
     
     
    while (1)  
   
        struct sockaddr_in client_addr; 
        int client_socket;       
        socklen_t length; 
        char buffer[BUFFER_SIZE]; 
  
  char bufferon[BUFFER_SIZE]="on";     //开灯
  char bufferoff[BUFFER_SIZE]="off";   //关灯
  char buffererr[BUFFER_SIZE]="err";   //其他指令认为是错误的

         
        while(1) 
       
    
   length = sizeof(client_addr); 
   client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length); 
   if( client_socket < 0) 
   
    printf("Server Accept Failed!\n"); 
    break; 
   
  
            bzero(buffer, BUFFER_SIZE); 
            length = recv(client_socket, buffer, BUFFER_SIZE, 0);    //接收
            if (length < 0) 
           
                printf("Server Recieve Data Failed!\n"); 
                break; 
           
           
   
 if((f_led2 = open(LED2, O_RDWR)) < 0){
  printf("error in open %s",LED2);
  goto out;
 }
   
    
 
   if(strcmp(buffer,bufferon)==0)                          //判断指令
         {
      send(client_socket, bufferon, BUFFER_SIZE, 0);       //发送
      dat2 = '1';
      write(f_led2, &dat2, sizeof(dat2));
   }
   else if(strcmp(buffer,bufferoff)==0)
   {
      send(client_socket, bufferoff, BUFFER_SIZE, 0);       //发送
      dat2 = '0';
      write(f_led2, &dat2, sizeof(dat2));
   }
   else
      {
      send(client_socket, buffererr, BUFFER_SIZE, 0);       //发送
      dat2 = '0';
      write(f_led2, &dat2, sizeof(dat2));
      }
   
            if('q' == buffer[0]) 
           
                printf("Quit from client!\n"); 
                break; 
           
             
            printf("%s\n", buffer);
   
   
   out:
   if(f_led2)
    close(f_led2);
   
          
         
        close(client_socket); 
   
     
    close(server_socket); 
    return 0; 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有