这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 终章-传感器数据互通OK527N-C

共3条 1/1 1 跳转至

终章-传感器数据互通OK527N-C

工程师
2025-02-20 10:59:32     打赏

趁最近空闲点,有点时间,先把任务完成。实现传感器的数据互通。最终效果见顶部的视频。

最开始定的任务是包含温湿度数据的,但是OK527N开发板上并不带温湿度传感器,所以就用了cpu的温度作为参考,目前无法检测外部环境温度和湿度数据。

验证了ADC功能,led功能,wifi功能、can功能、gpio功能、蜂鸣器功能、usb等设备。这里只挑选了一部分比较直观的功能在上位机中显示。

上位机界面:

Snipaste_2024-07-10_22-13-10.png

程序见下面,主要是创建线程,创建tcp service,监听tcp client的连接,连接上后发送温度信息给客户端,客户端可以下发控制命令控制板子上的器件如led,蜂鸣器等。
有时间再研究下linux的can发送和接收。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  
#include <unistd.h>  
#include <netinet/in.h>  
#include <sys/socket.h>  
#include <fcntl.h>  
#include <unistd.h>  
#include <string.h>  
#include <signal.h>
#include <pthread.h>
#include<sys/ioctl.h>
#include<sys/types.h>   
#include<sys/stat.h>  
#include<termios.h>
#include<errno.h>

#define PORT 8080  
#define BUFFER_SIZE 1024  
#define MAXLINE 256

extern int wifi_Connect(void);

static int stop = 0;
pthread_t read_id, write_id;
int server_fd, new_socket;

void beep_onoff(int sta)
{
    if(sta == 1)
    {
        system("echo 8 > /sys/class/pwm/pwmchip0/export");
        system("echo 10000000 > /sys/class/pwm/pwmchip0/pwm8/period");
        system("echo 5000000 > /sys/class/pwm/pwmchip0/pwm8/duty_cycle");
        system("echo 1 > /sys/class/pwm/pwmchip0/pwm8/enable");
        
    }
    else if(sta == 0)
    {
        system("echo 0 > /sys/class/pwm/pwmchip0/pwm8/enable");
        system("echo 8 > /sys/class/pwm/pwmchip0/unexport");
    }
}

void led_onoff(int sta)
{
    if(sta == 1)
    {
        system("echo none > /sys/class/leds/heartbeat/trigger");
        system("echo 1 > /sys/class/leds/heartbeat/brightness");
        
    }
    else if(sta == 0)
    {
        system("echo none > /sys/class/leds/heartbeat/trigger");
        system("echo 0 > /sys/class/leds/heartbeat/brightness");
    }
    else if(sta == 2)
    {
        system("echo heartbeat > /sys/class/leds/heartbeat/trigger");
    }
}

int read_CpuTemp(void)
{
    int fd;  
    char buffer[1024];  
    int bytesRead;

    fd = open("/sys/class/thermal/thermal_zone0/temp", O_RDONLY);  
    if (fd == -1) {  
        perror("Error opening file");  
        return EXIT_FAILURE;  
    }  

    // 读取文件内容  
    bytesRead = read(fd, buffer, sizeof(buffer) - 1);  
    if (bytesRead == -1) {  
        perror("Error reading file");  
        close(fd);  
        return EXIT_FAILURE;  
    }
    printf("%d bytes read)\n", bytesRead);
    buffer[bytesRead] = '\0';  
    int temp = atoi(buffer);
    return temp;
}
static void quit(int sig)
{
    (void)sig;
    stop = 1;
    close(new_socket);
    close(server_fd);
    _exit(0);
}

/*
当客户端断开连接的时候,
在服务端socket send进程可以收到收到信号SIGPIPE,
收到SIGPIPE信号进入该函数结束创建的线程。
*/
void signal_pipe(int signo)
{
    pthread_kill(read_id, SIGQUIT);//向read线程发送SIGQUIT
    pthread_join(read_id, NULL);      //阻塞线程运行,直到read 线程退出。
    
    close(new_socket);                //关闭连接
    printf("read pthread out \n");
    
    pthread_exit(0);              //结束write 线程
}
 
/*
read 线程接收到SIGQUIT信号,
执行线程退出操作
*/
void pthread_out(int signo)
{
    pthread_exit(0);
}
 
/*
read 线程执行函数
*/
void* read_func(void* arg)
{
    char readbuff[MAXLINE];
    int n = 0;
    int fd;
 
    fd = *(int*)arg;    /*main 主进程传递过来的连接文件描述符*/
    memset(&readbuff,0,sizeof(readbuff));
 
    signal(SIGQUIT,pthread_out); /* 注册SIGQUIT 信号*/
    while(1)
    {
        n = recv(fd, readbuff, MAXLINE, 0);  /*recv 在这里是阻塞运行*/
        if(n > 0)
        {
            if(readbuff[0] == 0xA0 && readbuff[1] == 0x5A)
            {
                if(readbuff[2] == 0x33)
                {
                    beep_onoff(readbuff[3]);
                    printf("beep sta:%d\n", readbuff[3]);
                }
                else if(readbuff[2] == 0x34)
                {
                    led_onoff(readbuff[3]);
                    printf("led sta:%d\n", readbuff[3]);
                }
            }
        }
    };
}
/*
write 线程执行函数
*/
void* write_func(void* arg)
{
    char writebuff[MAXLINE];
    int fd;
    int cpu_Temp;
    fd = *(int*)arg;
    memset(&writebuff,0,sizeof(writebuff));
    
    signal(SIGPIPE,signal_pipe); /* 注册 SIGPIPE信号 */
    while(1)
    {
        sleep(1);
        cpu_Temp = read_CpuTemp();
        printf("temp: %d\n", cpu_Temp);
        send(fd, &cpu_Temp, sizeof(int),0);/*向客户端发送数据*/
    }
}





int main(int argc, char *argv[])
{
    int ret = 0;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char *hello = "Hello from server";
    int cpu_Temp = 0;
    

    ret = wifi_Connect();
    if(ret != 0)
    {
        printf("Failed to connect to WiFi\n");
        return -1;
    }


    // 创建套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
    {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // Forcefully attaching socket to the port 8080
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)))
    {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    if(bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0)
    {
        printf("bind failed");
        exit(EXIT_FAILURE);
    }

    if(listen(server_fd, 3) < 0)
    {
        printf("listen error");
        exit(EXIT_FAILURE);
    }
    printf("creat tcp server succeeded\n");
        
    signal(SIGINT, quit);

    while(1)
    {
        if((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0)
        {
            printf("accept errror");
            exit(EXIT_FAILURE);
        }
        printf("%d connect succeeded\n", new_socket);

        if(pthread_create(&read_id,NULL,read_func,&new_socket))/*创建 read 线程*/
        {
            printf("pthread_create read_func err\n");
        }
 
        if(pthread_create(&write_id,NULL,write_func,&new_socket))/*创建 write 线程*/
        {
            printf("pthread_create write_func err\n");
        }
        
        pthread_join(write_id,NULL); /*阻塞,直到write进程退出后才进行新的客户端连接*/
        printf("write pthread out \n");


        send(new_socket, hello, sizeof(hello), 0);
        printf("Hello message sent to client\n");
        // read(new_socket, buffer, BUFFER_SIZE);
        // printf("Client: %s\n", buffer);
        

        send(new_socket, &cpu_Temp, sizeof(int), 0);
        sleep(1);
    }
    


    return 0;
}




关键词: 传感器     数据     OK527N-C     线程    

专家
2025-02-20 20:40:01     打赏
2楼

感谢分享


院士
2025-02-22 15:07:55     打赏
3楼

谢谢分享,学习一下。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]