Raspberry Pi RS232读取RFID转发器

Raspberry Pi RS232 read RFID Transponder

我想用 RFID 应答器开门。为此,我使用了一个 Raspberry Pi 和一个带有 UART 的 125Khz RFID Reader。所以现在我写了一个小 C 程序,设置 RS232 ('ttyAMA0')。这一切正常,我可以读取转发器,但它读取了一些 sh**

这是我的代码:

char read_rfid(char* rfid_num)
{
    fd_set input_fdset;
    ssize_t length; 
    while(1)
    {
        FD_ZERO(&input_fdset);      
        FD_SET(fd,&input_fdset);

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

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

}
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)
{
    MYSQL *mysql = NULL;    
    char rfid_num[14];
    int i;

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

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

PS:抱歉我的英语不好

缓冲的最小方法。您应该在返回 valid 之前检查缓冲区的内容(是否有最后一个 \n ?)

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;
}

注意:我不明白为什么这个函数returns char.