在主机与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)