當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > arduino花式點(diǎn)燈續(xù)
之前我們使用Arduino 實(shí)現(xiàn)了點(diǎn)燈,閃爍燈,串口點(diǎn)燈以及與上位機(jī)結(jié)合的點(diǎn)燈。這一次我們將實(shí)現(xiàn)一個(gè)UDP服務(wù)器接受命令實(shí)現(xiàn)點(diǎn)燈,以及使用Intel Edison開發(fā)板實(shí)現(xiàn)點(diǎn)燈。
一、UDP實(shí)現(xiàn)點(diǎn)燈
UDP服務(wù)器是一種網(wǎng)絡(luò)通信采取的正常方式。使用udp協(xié)議實(shí)現(xiàn)快速的網(wǎng)絡(luò)通信。在服務(wù)器端只需要 三個(gè)函數(shù)便可部署。
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
這個(gè)函數(shù)第一個(gè)參數(shù)是代表ipv4的作用域的宏,第二個(gè)參數(shù)是數(shù)據(jù)報(bào)的類型,udp使用的用戶數(shù)據(jù)報(bào)格式。函數(shù)返回值是指文件描述符,使用它作進(jìn)一步操作。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind函數(shù)是將套接字與本地地址信息進(jìn)行綁定。
struct sockaddr_in seraddr;
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(50000);
seraddr.sin_addr.s_addr=inet_addr("0.0.0.0");
Seraddr這個(gè)結(jié)構(gòu)體需要填入ipv4的作用域,以及本機(jī)地址和本地端口。
再使用recfrom函數(shù)便可接受信息
recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
結(jié)合之前的串口函數(shù),可以實(shí)現(xiàn)接受數(shù)據(jù)報(bào)打開串口給下位機(jī)Arduino發(fā)送信息:
代碼:
#include #include
/* See NOTES */#include
#include
#include
#include //#include
#include
#include
#include
#include
#include
#include
int serialfd;int uart_device_open(){
struct termios options;
if((serialfd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY))<0)
{
perror("open failed");
return -1;
}
tcgetattr(serialfd, &options);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CSIZE;
options.c_cflag &= ~CRTSCTS;
options.c_cflag |= CS8;
options.c_cflag &= ~CSTOPB;
options.c_iflag |= IGNPAR;
options.c_iflag &= ~(BRKINT | INPCK | ISTRIP | ICRNL | IXON);
options.c_cc[VMIN] = 12;
options.c_oflag = 0;
options.c_lflag = 0;
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
tcsetattr(serialfd,TCSANOW,&options);
printf("zigbee serial ok!\n");
return 0;
}
int main(int argc, const char *argv[]){
int fd;
fd=socket(AF_INET,SOCK_DGRAM,0);
if(fd<0)
{
printf("fd error\n");
return -1;
}
//socket
struct sockaddr_in seraddr;
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(50000);
seraddr.sin_addr.s_addr=inet_addr("0.0.0.0");
// host to network small htons
//bind 2 sockaddr <-- sockaddr_in
int ret_bind;
ret_bind=bind(fd,(struct sockaddr*)&seraddr,sizeof(seraddr));
if(ret_bind<0)
{
printf("fail to bind\n");
return -1;
}
//recvfrom
char buf[128];
uart_device_open();
while(1)
{
bzero(buf,sizeof(buf));
recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
printf("Buf:%s\n",buf);
if(buf[0]=='1'||buf[0]=='b'||buf[0]=='0')
{
write(serialfd, buf, 1);
printf("success to send %c\n",buf[0]);
}
}
close(fd);
return 0;
}
二、Intel Edison實(shí)現(xiàn)點(diǎn)燈
Edison是Intel推出的一款智能開發(fā)平臺(tái),兼容Arduino,同時(shí)也是一款高性能的x86低功耗開發(fā)板。
首先我們先配置一下Intel Edison:
一旦成功連接,Edison正常啟動(dòng),在windows中會(huì)出現(xiàn)一個(gè)盤符。
陸續(xù)安裝完Arduino的幾個(gè)開發(fā)包。
使用之前的Arduino代碼燒錄到開發(fā)板中,方法參照Arduino的使用;
如此便實(shí)現(xiàn)了Intel Edison的Arduino點(diǎn)燈程序。
华清图书馆
0元电子书,限时免费申领10本华清图书PDF版
扫码关注华清远见公众号