arduino花式(shi)點燈(deng)續(xu)
時(shi)間:2018-09-26 來源:未知(zhi)
之前我們(men)使(shi)用Arduino 實(shi)(shi)現(xian)了點燈(deng),閃爍(shuo)燈(deng),串口點燈(deng)以及與上位機(ji)結合的點燈(deng)。這一次我們(men)將實(shi)(shi)現(xian)一個UDP服務器接受命令實(shi)(shi)現(xian)點燈(deng),以及使(shi)用Intel Edison開發板實(shi)(shi)現(xian)點燈(deng)。
一、UDP實(shi)現點燈
UDP服(fu)務(wu)器是(shi)一(yi)種網絡(luo)通信采取的正(zheng)常方式。使用udp協議(yi)實(shi)現快速的網絡(luo)通信。在服(fu)務(wu)器端只需要 三個函數便(bian)可部署。
udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
這個(ge)(ge)函數(shu)(shu)第一個(ge)(ge)參數(shu)(shu)是代表ipv4的作用(yong)(yong)(yong)域(yu)的宏,第二個(ge)(ge)參數(shu)(shu)是數(shu)(shu)據報的類型,udp使用(yong)(yong)(yong)的用(yong)(yong)(yong)戶數(shu)(shu)據報格式。函數(shu)(shu)返(fan)回值(zhi)是指文件描述符(fu),使用(yong)(yong)(yong)它(ta)作進一步操作。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind函(han)數(shu)是將套接字與本地(di)地(di)址信息進行綁(bang)定。
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這個結構體需(xu)要填入(ru)ipv4的作用域(yu),以及本機地址(zhi)和本地端口。
再使用recfrom函數(shu)便可接受信息(xi)
recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
結合之(zhi)前的串口函數,可以實現(xian)接(jie)受數據報(bao)打(da)開串口給下位機Arduino發送信息:
代碼:
#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實(shi)現點燈

Edison是(shi)Intel推出的一款(kuan)智(zhi)能開發平臺,兼(jian)容Arduino,同(tong)時也是(shi)一款(kuan)高(gao)性能的x86低功耗開發板(ban)。
首先(xian)我們(men)先(xian)配置一下Intel Edison:
一旦成功(gong)連(lian)接,Edison正常(chang)啟(qi)動,在windows中會出現一個盤符。

陸續安裝完Arduino的幾個(ge)開發(fa)包。

使用之前的Arduino代碼燒錄到開發板中,方法參照Arduino的使用;

如此便(bian)實(shi)現(xian)了Intel Edison的Arduino點燈程(cheng)序(xu)。

