Lab 8:网络LED矩阵显示器

来源:互联网 发布:淘宝元素周期表验证码 编辑:程序博客网 时间:2024/05/19 09:04


一、连接和器材

器材列表:

RaspberryPi(树莓派)一块、USB-TTL串口线一根(PL2303芯片)、以太网线一根、8G容量SD卡一张、带windows7操作系统的PC一台、MAX7219驱动的8x8 LED矩阵一个。

 

MAX7219的VCC, GND, DIN, CS, CLK分别与树莓派左边一列的第1,第5,第4,第3,第2个引脚相连。(1,3,5,7,9)

使用Fritzing画出的外部连接示意图:


实物连接图:


二、实验步骤

a.编写Linux应用程序,能通过第七次实验的设备驱动程序控制LED矩阵显示字符串,每个字符停留500ms;

 

写好如下的lab8.c程序,它会调用mymatrix的write接口,每隔500ms循环显示1~9的数字以及A~Z的字母:

#include <stdio.h>

#include <sys/types.h> 

#include <unistd.h> 

#include <fcntl.h> 

#include <linux/rtc.h> 

#include <linux/ioctl.h> 

#include <stdio.h> 

#include <stdlib.h>

 

int main(){

         int fd;

         int write_try;

         fd=open("/dev/mymatrix",O_RDWR);

         if(fd == 1){

                   printf("Open failed.\n");

                   exit(-1);

         }

         int index=0;

         char dis_number[36]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

         while(1){

                   write_try=write(fd,&dis_number[index],1);

                   if(write_try == -1){

                            printf("write failed.\n");

                            exit(-1);

                   }

                   index=(index+1)%36;

                   usleep(500000);

         }

         return 0;

 

}

 

 

 

然后先装载上次的driver.ko模块:

 

编译lab8.c运行:

 

随后看到8*8的点阵上不断循环显示0~9,A~Z。

 

 

 

b.编写Linux应用程序,能通过TCP接受一个连接,将发来的文字在LED矩阵上流动显示出来;

 

服务器开始运行后,首先初始化socket,并且将本地地址绑定到所创建的监听套接字上,随后调用listen函数开始监听。一旦有用户连接上来就进入一个while循环,每次就是等待用户发送一个字符串,并且把这个字符串的每一个字符以500ms为间隔调用驱动显示到8*8矩阵上。

编写的server.c文件内容如下:

/* File Name: server.c */ 

#include<stdio.h> 

#include<stdlib.h> 

#include<string.h> 

#include<sys/types.h> 

#include<sys/socket.h> 

#include<sys/ipc.h>

#include<sys/shm.h>

#include<netinet/in.h> 

#include<fcntl.h>

#include<unistd.h>

#include<error.h>

#include<errno.h> 

 

#define DEFAULT_PORT 8000  

#define MAX_LINE 4096   

#define SIZE 640        

 

//display a string whose length is n

void display(char * dis_number, int n){

        int fd;

        int write_try;

         int i;

        fd=open("/dev/mymatrix",O_RDWR);

        if(fd == 1){

                printf("Open failed.\n");

                exit(-1);

        }

         for(i=0;i<n;i++){

                write_try=write(fd,&dis_number[i],1);

                if(write_try == -1){

                        printf("write failed.\n");

                        exit(-1);

                }

                usleep(500000);

        }

}

 

 

int main(int argc, char** argv) 

             int    socket_fd, connect_fd; 

             struct sockaddr_in     servaddr; 

         char    buff[4096]; 

             int     n; 

             //initial socket

             if((socket_fd = socket(AF_INET, SOCK_STREAM, 0))==-1){ 

                       printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); 

                       exit(0); 

             } 

 

            memset(&servaddr, 0, sizeof(servaddr)); 

             servaddr.sin_family = AF_INET; 

             servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//set IP 

             servaddr.sin_port = htons(DEFAULT_PORT);//set port          

 

             //bind the address of localhost to socket

             if(bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ 

                       printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); 

                       exit(0); 

             } 

             //listen for connect

             if(listen(socket_fd, 10) == -1){ 

                       printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); 

                       exit(0); 

             } 

 

             printf("======The server has been started successfully.======\n"); 

 

         //wait for a clienter to connect

        if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){ 

                 printf("accept socket error: %s(errno: %d)",strerror(errno),errno); 

                   exit(0);

             } 

            

         if(send(connect_fd, "Connected successfully!\n", 24,0) == -1) 

                            perror("send error");      

         while(1){

             n = recv(connect_fd, buff, MAX_LINE, 0);

                   if(n<=0) continue;

                   else{

                           buff[n]='\0';

                            printf("Received string: %s\n",buff);

                            display(buff,n); //display this string

                   }

         }       

                    

     close(socket_fd); 

             printf("======The server has been shutdown successfully.======\n");

}

 

 

 

编译运行服务器:


Ubuntu上使用telnet命令连接服务器:


在ubuntu上输入一些字符串,比如ABCD12345:

 

在树莓派服务器端我们看到成功接收到这个字符串:


同时可以看到矩阵上依次显示ABCD12345字符。

比如显示B时:


 

全部显示完毕后,矩阵恢复到初始图案,随后客户端继续发送字符串,客户端就会继续开始显示新的字符串。

 

至此,lab8任务结束。

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击