Lab8 网络LED矩阵显示器

实验连接示意图、实物图

所用器材列表

硬件

- Linux实验板卡一块
- 5V/1A电源一个
- microUSB线一根
- 面包板一块
- MAX7219驱动的8*8LED矩阵一个
- 面包线若干
- PC一台
- 以太网线一根

软件

- 编译软件
- Fritzing

外部设备连线图

实验步骤

1. 设计方案,画连线示意图

2. 在面包板上连线,画连线示意图

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

1) 使用ssh连接上Raspberry pi 2
2) 使用insmod将实验七的模块插入
3) 编写C代码,通过设备驱动程序控制LED矩阵显示字符串

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

5. 用telnet连接linux板卡,发送字符串来显示

1) 使用telnet命令连接Raspberry pi并发送字符串“0123”
2) 观察是否连接成功,板卡上是否接收到发来的字符串
3) 观察点阵能否正常显示

代码和解释

1. 通过实验七的设备驱动程序控制LED矩阵显示字符串

#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int Matrix;

#define ALLCHAR "0123456789abcdefghijklmnopqrstuvwxyz" // 依次显示的字符

int main(){
    Matrix = open("/dev/matrix", O_WRONLY);
    if (Matrix < 0){  // 打开失败
        fprintf(stderr, "Cound not open matrix device");
        exit(1);
    }
    write(Matrix, ALLCHAR, strlen(ALLCHAR));  // 写入
    return 0;
}

2. 通过TCP接受连接并将发来的字符显示

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>====

int Matrix;
int server;

#define PORT 8080
#define ADDR "0.0.0.0"
#define QUEUE 20

#define BUFF_SIZE 2048

int main(){
    // 打开matrix
    Matrix = open("/dev/matrix", O_WRONLY);
    if (Matrix < 0){
        fprintf(stderr, "Cound not open matrix device\n");
        exit(1);
    }
    // 建立服务器
    int server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = inet_addr(ADDR);
    serverAddr.sin_port = htons(PORT);

    // 绑定ip以及端口
    if (bind(server, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1){
        fprintf(stderr, "Count not bind %s:%d\n", ADDR, PORT);
        exit(1);
    }

    if (listen(server, QUEUE) == -1){
        fprintf(stderr, "Listen error\n");
        exit(1);
    }

    printf("Server running at %s:%d\n", ADDR, PORT);

    while (1){
        struct sockaddr_in clientAddr;
        socklen_t length = sizeof(clientAddr);

        // 对连入的连接进行处理
        int conn = accept(server, (struct sockaddr*)&clientAddr, &length);
        if (conn < 0){
            fprintf(stderr, "Connect error");
            exit(1);
        }

        printf("A new connection from %s:%d\n", inet_ntoa(clientAddr.sin_addr), clientAddr.sin_port);

        // 处理连接发送过来的字符
        while (1){
            char receiveBuf[BUFF_SIZE];
            int count;
            memset(receiveBuf, 0, sizeof(receiveBuf));

            // 接收字符
            count = recv(conn, receiveBuf, sizeof(receiveBuf), 0);

            // 如果接收到的字符为空,则表示离开
            if (count == 0){
                close(conn);
                break;
            }

            // 将接收到的所有字符发送给matrix进行显示
            write(Matrix, receiveBuf, count);
        }
    }
    close(server);
    return 0;
}