树莓派上视差 rfid 阅读器的 c 代码

标签 c select serial-port rfid raspberry-pi2

我已经寻找了相当长一段时间来寻找解决我的问题的方法。 我想读取 Raspberry 上的 RFID 标签,但我想用 C 代码来完成,因为我的项目的其余部分是用 C 编写的。

我对在 stackoverflow.com 上找到的以下 C 代码有几个问题:

  1. 下面的代码需要包含哪些 .h?
  2. 我正在使用的界面设置在哪里? (/dev/ttyAMA0)

请帮助我使此代码片段正常工作,因为它已经困扰了我几天。

char read_rfid(char* rfid_num) {
    fd_set input_fdset;
    ssize_t length;
    int done;

    for(done=0; done < 14; ) {
        FD_ZERO(&input_fdset);
        FD_SET(fd,&input_fdset);

        if(select(fd+1 ,&input_fdset, NULL,NULL,NULL) == -1) {
            if (errno == EAGAIN) continue;
            perror("Terminal select() failed");
            return -1;
        }

        if(FD_ISSET(fd,&input_fdset)) {
            if((length = read(fd,rfid_num+done,14-done)) == -1) {
                if (errno == EAGAIN) continue;
                perror("Terminal: read() failed");
                return -1;
            }
            write(STDOUT_FILENO,rfid_num+done,length);
            done += length;
        }
    }
    return 0;
}


int setupRS232()
{
    struct termios term_attr;

    if((fd = open(RFID,O_RDWR)) == -1)
    {
        perror("Can't open Device");
        return(1);
    }
    if(tcgetattr(fd,&term_attr) != 0)
    {
        perror("terminal: tcgetattr() failed");
        return(1);
    }
    term_attr.c_cflag = BAUD|CS8|CRTSCTS|CLOCAL|CREAD;
    term_attr.c_iflag = 0;
    term_attr.c_oflag = 0;
    term_attr.c_lflag = 0;
    if(tcsetattr(fd,TCSAFLUSH,&term_attr) != 0)
    {   
        perror("terminal: tcsetattr() failed");
        return(1);
    }
}


int main(int argc, char** argv)
{

    char rfid_num[14];
    int i;


    if(setupRS232() == 1)
        return(1);

    puts("Waiting for transponder...");
    read_rfid(rfid_num);
    for(i=0;i<20;i++)
    {
        printf("%x\n",rfid_num[i]);
    }     
}

最佳答案

#include <unistd.h> // for read & write functions
#include <sys/select.h> // fd_set functions
#include <stdio.h> // for perror & printf family
#include <sys/types.h> // for open related function
#include <sys/stat.h> // for open related function
#include <fcntl.h> // for open related function
#include <termios.h> // for terminal functions
#include <errno.h> // for error code

#define RFID "path_to_rfid" // FIXME <- you should set this properly
char read_rfid(char* rfid_num, int fd)
{
    fd_set input_fdset;
    ssize_t length;
    int done;

    for(done=0; done < 14; ) {
        FD_ZERO(&input_fdset);
        FD_SET(fd,&input_fdset);

        if(select(fd+1 ,&input_fdset, NULL,NULL,NULL) == -1) {
            perror("Terminal select() failed");
            return -1;
        }

        if(FD_ISSET(fd,&input_fdset)) {
            if((length = read(fd,rfid_num+done,14-done)) == -1) {
                perror("Terminal: read() failed");
                return -1;
            }
            write(STDOUT_FILENO,rfid_num+done,length);
            done += length;
        }
    }
    return 0;
}


int setupRS232()
{
    struct termios term_attr;
    int fd = 0;

    if((fd = open(RFID,O_RDWR)) == -1) {
        perror("Can't open Device");
        return(-1);
    }
    if(tcgetattr(fd,&term_attr) != 0)
    {
        perror("terminal: tcgetattr() failed");
        close(fd);
        return(-1);
    }

    term_attr.c_cflag = CBAUD|CS8|CRTSCTS|CLOCAL|CREAD;
    term_attr.c_iflag = 0;
    term_attr.c_oflag = 0;
    term_attr.c_lflag = 0;
    if(tcsetattr(fd,TCSAFLUSH,&term_attr) != 0) {
        perror("terminal: tcsetattr() failed");
        close(fd);
        return(-1);
    }
    return (fd);
}

int main(int argc, char** argv)
{

    char rfid_num[14];
    int i;
    int fd;

    if((fd = setupRS232()) == -1) {
        return(-1);
    }

    puts("Waiting for transponder...");
    read_rfid(rfid_num, fd);
    for(i=0;i<20;i++) {
        printf("%x\n",rfid_num[i]);
    }

    return 0;
}

现在您的代码已准备好进行编译,至少在我的机器上我可以毫无错误地进行编译。

关于树莓派上视差 rfid 阅读器的 c 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32026391/

相关文章:

c - 'if' 之前的预期表达式

php - 动态填充PHP中的下拉列表

serial-port - 为什么 serial.available 在此代码段中不起作用?

c - 在 OpenGL ES 2.0 中,当将 FBO 与纹理深度缓冲区一起使用时,深度纹理缓冲区不起作用

c - C中的结构定义问题

javascript - 选择功能上的 knockout 访问更改事件

mysql - 合并 3 个表的电子邮件字段 n 检查注册用户表中是否存在相同的邮件

python - 如何获取micro写入的文件:bit to the PC?

linux - 在 Linux 中将一个串口连接到另一个串口

c - 安西 C : Attempting to count total chars in a file