环境 Ubuntu16.4
QT5.4
讯为开发版
程序部分有TCP通讯代码 没有剔除
原本的方案是利用tCP通讯后台点灯
程序部分
mainwindow.cpp
#include "mainwindow.h"
#include "tcp_B.h"
#include"led.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->button_send,SIGNAL(clicked(bool)),this,SLOT(my_button_send(bool)));
connect(ui->button_switch,SIGNAL(clicked(bool)),this,SLOT(my_button_switch(bool)));
}
MainWindow::~MainWindow()
{
delete ui;
}
int MainWindow::my_button_switch(bool chenked)
{
static int my_num=1;
if(my_num==0)
{
qDebug("socket_init");
ui->button_send->setEnabled(true);
my_num=1;
socket_init();
}
else if (my_num==1)
{
qDebug("close_sockfd");
ui->button_send->setEnabled(false);
my_num=0;
close_sockfd();
}
return 0;
}
int MainWindow::my_button_send(bool chenked)
{ static int a=1;
qDebug("my_button_send");\
slient_my();
if(a==1){ led_liang1(); a=2;}
else if(a==2){ led_liang2(); a=3;}
else if(a==3){ led_liang3(); a=4;}
else if(a==4){ led_mie(); a=1;}
return 0;
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
/*cao*/
private slots:
int my_button_switch(bool chenked);
int my_button_send(bool chenked);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
led.h
#ifndef LED_H
#define LED_H
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
int led_liang1(void);
int led_liang2(void);
int led_liang3(void);
int led_mie(void);
#endif // LED_H
led.cpp
#include"led.h"
int fd,led_num,led_c;
char *leds = "/dev/leds";
int led_liang1(void)
{
if((fd = open("/dev/leds", O_RDWR|O_NOCTTY|O_NDELAY))<0)
printf("open %s failed\n",leds);
else{
ioctl(fd,1,1); //开灯 ioctl(fd,1,0);关灯
printf("ioctl %s success\n",leds);
}
close(fd);
}
int led_liang2(void)
{
//使用ioctl函数将参数传入内核
if((fd = open(leds, O_RDWR|O_NOCTTY|O_NDELAY))<0)
printf("open %s failed\n",leds);
else{
ioctl(fd,1,0);
printf("ioctl %s success\n",leds);
}
return 0;
}
int led_liang3(void)
{
//使用ioctl函数将参数传入内核
if((fd = open(leds, O_RDWR|O_NOCTTY|O_NDELAY))<0)
printf("open %s failed\n",leds);
else{
ioctl(fd,0,1);
printf("ioctl %s success\n",leds);
}
return 0;
}
int led_mie(void)
{
//使用ioctl函数将参数传入内核
if((fd = open(leds, O_RDWR|O_NOCTTY|O_NDELAY))<0)
printf("open %s failed\n",leds);
else{
ioctl(fd,0,0);
printf("ioctl %s success\n",leds);
}
close(fd);
return 0;
}
tcp_B.h
#ifndef TCP_B_H
#define TCP_B_H
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> /*netdb对于struct hostent是必需的 */
#define PORT 4321 /* 服务器端口 */
#define MAXDATASIZE 100
int slient_my(void);
int socket_init(void);
void close_sockfd(void);
#endif // TCP_B_H
tcp_B.cpp
#include"tcp_B.h"
static int sockfd, num; /*文件描述符*/
char buf[MAXDATASIZE]; /*buf将存储接收到的文本*/
struct hostent *he; /* 结构,该结构将获取关于远程主机的信息 */
struct sockaddr_in server;
int socket_init()
{
if((he=gethostbyname("127.0.0.1"))==NULL)
{
printf("gethostbyname() error\n");
// exit(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM, 0))==-1)
{
printf("socket() error\n");
// exit(1);
}
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr = *((struct in_addr *)he->h_addr);
if(connect(sockfd, (struct sockaddr *)&server, sizeof(server))==-1)
{
printf("connect() error\n");
// exit(1);
};
return 0;
}
int slient_my()
{
char str[]="HALLO\n";
if((num=send(sockfd,str,sizeof(str),0))==-1){
printf("send() error\n");
// exit(1);
}
if((num=recv(sockfd,buf,MAXDATASIZE,0))==-1)
{
printf("recv() error\n");
//exit(1);
}
// buf[num-1]='\0';
// printf("server message: %s\n",buf);
// close(sockfd);
return 0;
}
void close_sockfd()
{
close(sockfd);
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
ui文件
按键名字分别是 button_send button_switch
/********************************************/
TCP通讯服务器端
server_my.c
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 4321
#define BACKLOG 1
#define MAXRECVLEN 1024
int main(int argc, char *argv[])
{
char buf[MAXRECVLEN];
int listenfd, connectfd; /* 套接字描述符 */
struct sockaddr_in server; /* 服务器的地址信息*/
struct sockaddr_in client; /* 客户的地址信息*/
socklen_t addrlen;
/* 创建TCP套接字 */
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
/* 处理异常 */
perror("socket() error. Failed to initiate a socket");
exit(1);
}
/*设置套接字选项 */
int opt = SO_REUSEADDR;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
bzero(&server, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1)
{
/* 处理异常 */
perror("Bind() error.");
exit(1);
}
if(listen(listenfd, BACKLOG) == -1)
{
perror("listen() error. \n");
exit(1);
}
addrlen = sizeof(client);
while(1){
if((connectfd=accept(listenfd,(struct sockaddr *)&client, &addrlen))==-1)
{
perror("accept() error. \n");
exit(1);
}
struct timeval tv;
gettimeofday(&tv, NULL);
printf("You got a connection from client's ip %s, port %d at time %ld.%ld\n",inet_ntoa(client.sin_addr),htons(client.sin_port), tv.tv_sec,tv.tv_usec);
int iret=-1;
while(1)
{
iret = recv(connectfd, buf, MAXRECVLEN, 0);
if(iret>0)
{
printf("%s\n", buf);
}else
{
close(connectfd);
break;
}
/* 打印客户端ip和端口 */
send(connectfd, buf, iret, 0); /* 向客户端发送欢迎消息 */
}
}
close(listenfd); /* 关闭listenfd*/
return 0;
}
操作过程
cd /home/topeet/QTE/tesk_led/tesk_led/
/opt/qt-4.7.1/bin/qmake
make
进入QT目录文件,生成Makedile文件
交叉编译
在server_my.c所在文件执行交叉编译
arm-none-linux-gnueabi-gcc -o server_my server_my.c -static
至此 开始吧程序往开发板进行移植
- SSH 吧虚拟机Ubuntu系统上的程序 复制到电脑上
- TFTP与开发板直接通信设定好目录 和IP地址,ping通后
- 超级终端(开发版系统)输入: tftp 172.27.62.230 -g -r tesk_led
超级终端执行
./tesk_led &
同时打开server_my.c的话 可以在终端看到 每次按下按键 服务器端 都可以收到字符串
本人菜鸟,仅作为日常复习用 勿喷