树莓派:获取传感器数据

树莓派:获取传感器数据

前言

物联网开发中分享一下在树莓派实验中遇到的问题和心得

正文

实验基于树莓派3B开发板,通过USB转串口连接倾斜度传感器。
在这里插入图片描述
首先连接好设备,将树莓派插上网线或配置wifi,使用VNC远程登陆树莓派桌面(也可使用putty,通过树莓派GPIO的串口转USB直接插在PC上,注意要修改/boot/cmdline.txt内容才能正常使用GPIO的串口),建议在/etc/rc.local中设置静态IP防止变化,查看/dev可以看到ttyUSB0表示已经成功连接(ttyAMA0是树莓派GIPO串口进行通信时使用的端口)。
在这里插入图片描述
在这里插入图片描述
接下来就是串口编程了,附上代码主函数部分,仅供参考。

#include  <stdio.h>     
#include  <stdlib.h>     
#include  <unistd.h>     
#include  <sys/types.h>  
#include  <sys/stat.h>   
#include  <fcntl.h>      
#include  <termios.h>    
#include  <errno.h>      
#include  <string.h>
#include  <syslog.h>

#define TRUE 1
#define FALSE 0
/*设置串口通信速率*/
int speed_arr[] = { B115200,B57600,B38400, B19200, B9600, B4800, B2400, B1200, B300,
                    B115200,B57600,B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {115200,57600,38400,  19200,  9600,  4800,  2400,  1200,  300,
                  115200,57600,38400,  19200,  9600, 4800, 2400, 1200,  300, };
void set_speed(int fd, int speed)
{
    int   i;
    int   status;
    struct termios   Opt;
    tcgetattr(fd, &Opt);
    for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)
    {
        if  (speed == name_arr[i])
        {
            tcflush(fd, TCIOFLUSH);
            cfsetispeed(&Opt, speed_arr[i]);
            cfsetospeed(&Opt, speed_arr[i]);
            status = tcsetattr(fd, TCSANOW, &Opt);
            if  (status != 0)
                perror("tcsetattr fd1");
            return;
        }
        tcflush(fd,TCIOFLUSH);
    }
}
/*设置串口数据位、停止位、校验位*/
int set_parity(int fd,int databits,int stopbits,int parity)
{
    struct termios options;
    if  ( tcgetattr( fd,&options)  !=  0)
    {
        perror("SetupSerial 1");
        return(FALSE);
    }
    options.c_cflag &= ~CSIZE;
    switch (databits) 
    {
    case 7:
        options.c_cflag |= CS7;
        break;
    case 8:
        options.c_cflag |= CS8;
        break;
    default:
        fprintf(stderr,"Unsupported data size\n");
        return (FALSE);
    }
    switch (parity)
    {
    case 'n':
    case 'N':
        options.c_cflag &= ~PARENB;   /* Clear parity enable */
        options.c_iflag &= ~INPCK;     /* Enable parity checking */
        break;
    case 'o':
    case 'O':
        options.c_cflag |= (PARODD | PARENB);   
        options.c_iflag |= INPCK;             
        break;
    case 'e':
    case 'E':
        options.c_cflag |= PARENB;     /* Enable parity */
        options.c_cflag &= ~PARODD;     
        options.c_iflag |= INPCK;       /* Disnable parity checking */
        break;
    case 'S':
    case 's':  /*as no parity*/
        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        break;
    default:
        fprintf(stderr,"Unsupported parity\n");
        return (FALSE);
    }
    /* 设置停止位*/   
    switch (stopbits)
    {
    case 1:
        options.c_cflag &= ~CSTOPB;
        break;
    case 2:
        options.c_cflag |= CSTOPB;
        break;
    default:
        fprintf(stderr,"Unsupported stop bits\n");
        return (FALSE);
    }
    /* Set input parity option */
    if (parity != 'n')
        options.c_iflag |= INPCK;
    options.c_cc[VTIME] = 150; // 15 seconds
    options.c_cc[VMIN] = 0;
    
    tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
    if (tcsetattr(fd,TCSANOW,&options) != 0)
    {
        perror("SetupSerial 3");
        return (FALSE);
    }
    return (TRUE);
}
/*打开串口*/
int opendev(char *Dev)
{
    intfd = open( Dev, O_RDWR );         //| O_NOCTTY | O_NDELAY
    if (-1 == fd)
    { perror("Can't Open Serial Port");
        return -1;
    }
    else
        return fd;
    
}
int print(char *buff)
{
	int i;
	for(i=0;i<14;i++)
	{
		printf("%x\n",buff[i]);
	}
	printf("----------------\n");
	return 0;
}

int main()
{
	int fd;
	char buff[255];
	char order[] = {0x68,0x04,0x00,0x04,0x08};
	char *name = "/dev/ttyUSB0";//选择串口
	while(1) 
	{  
		fd = opendev(name); //打开USB0端口 
		if(fd>0) 
			set_speed(fd,9600); //设置波特率 
		else 
		{ 
			printf("can't open serial port!\n"); 
			continue; 
		} 
		break;
	}
	if(set_parity(fd,8,1,'N')==FALSE) 
	{
		printf("set parity error\n"); 
	}
	while(1) 
	{ 
		write(fd,order,5);
		sleep(1); 
		read(fd,buff,14);
		print(buff);
	}
}

python:

import serial
import time
seri = serial.Serial("/dev/ttyUSB0",9600)
if seri.isOpen() == False:
    seri.open()
try:
    while True:
        seri.write('\x68\x04\x00\x04\x08')
        data = seri.read(14)
        for i in data:
           print('%#x'%ord(i))
        alist = list(data)
        str1=str('%x'%ord(alist[5]))
        str11=str('%x'%ord(alist[6]))
        str2=str('%x'%ord(alist[8]))
        str22=str('%x'%ord(alist[9]))
        print "------------"
        print 'X :',str1,'.',str11
        print 'Y :',str2,'.',str22
        print "------------"
        time.sleep(0.1)
except KeyboardInterrupt:
    seri.close()

代码中发送的是传感器厂家提供的数据获取指令,直接发送即可接收到传感器回复的数据,博主通过特定的形式打印出来,方便观察结果。
在这里插入图片描述
通过旋转传感器,可以在终端看到实时的角度信息,收到的数据中均为16进制数,通过特定的格式提取出来,即成功获取到了倾斜角度。

总结

对于树莓派的开发,直接在目标机上写代码既耗费资源,又降低了速度,所以在主机上配置交叉编译环境是非常有必要的,生成可在ARM开发板上运行的程序,这里我通过配置nfs服务器的方式将可执行文件共享给开发板系统上。
在开发机上配置好nfs服务将/opt/rootfs设置成服务器,接着在目标机上挂载服务器文件夹至/mnt/nfs下就可以实现文件共享了。

//设置自动设置IP和挂载nfs根目录
//在开发板的linux系统的/etc/init.d/rcS文件中加入
Ifconfig eth0 down
ifconfig eth0 192.168.X.X
ifconfig eth0 up
mount –t nfs –o nolock 192.168.X.XXX:/opt/rootfs /mnt/nfs

下图中可以看到2个系统实现了文件共享。
在这里插入图片描述
至此本文写完了,有不足的地方欢迎指教。

  • 11
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值