Avatar billede martin421 Nybegynder
07. april 2009 - 18:14 Der er 3 kommentarer og
1 løsning

udskrive 'char' fra Linux seriel port(slackware)

Hej eksperter

Jeg er i gang med et projekt med at tilslutte en RFID læser på et Linux bord(slackware) som skal læse fra RFID'en. Softwaren laves i C på Linux platform. forbindelsen forgå via et serial-to-USB kabel. Ved at sende en char kode, for man et 'char' svar tilbage. (kablet er testet fra RFID scanner til java på min pc og giver svar tilbage)

Jeg er ikke særlig stærk i C samt linux og har en del problemer med at få det til at køre!? Jeg prøver i første omgang Kun at modtage et svar fra RFID læserne og udskrive det i mit konsol vindue.

Her er den C kode jeg har implementeret, men får bl.s secmantationsfejl!?

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

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


    FILE *f1; //point to file

    printf("stty -F /dev/ttyS0 9600\n");
    system("stty -F /devttyS0 9600"); //opsæt seriel port baud rate

   
    char c[9] = {2,0,4,16,6,0,0,18,3}; // char array til afsendelse
    char read = 0; //char til læsning fra seriel port

    index = 0;

while (index < 10)
{
    printf("echo # > /dev/ttyUSB0\n");
    f1 = fopen("/dev/ttyUSB0", "r+"); //åben filen USB port til læse og skrive!
        printf("writing to ttyUSB0\n");
        fwrite(c,sizeof(char),9,f1); //skriver til port
    sleep(2);

    printf("reading to ttyUSB0\n");
        while((read = fgetc(f1)) != EOF) //læs fil indtil 'End Of File'
    {
      printf("%2, \n", read); // udskriv input i console?
    }
}

fclose(f1);    // luk fil
usleeo(100000);  // break 100ms
index++;

}

Nogle der har ideér eller kode forslag er det meget velkommen =)
Avatar billede arne_v Ekspert
07. april 2009 - 18:21 #1
usleeo -> usleep
Avatar billede arne_v Ekspert
07. april 2009 - 18:22 #2
check evt. om f1 er NULL
Avatar billede segmose Nybegynder
07. april 2009 - 23:14 #3
ok, for at kunne hjælpe effektivt skal du lave en liste med alle fejl, dvs. kopier fra compiler output og paste det ind her.

system("stty -F /devttyS0 9600"); //opsæt seriel port baud rate
-- her mangler en /

det ser også mistænkeligt ud at du stty'er ttyS0 men åbner ttyUSB0.

Jeg foretrækker select når man skal vente på porte.

Du mangler at checke f1 (som Arnev skriver).

Når du får lavet noget mere af programmet skal du checke alle tildelinger til pointerer for NULL og alle påfyldninger af bufferer at de ikke laver bufferoverflow. generelt brug 'n' versionerne af standard funktionerne f.ex. snprintf istedet for sprintf etc.
Avatar billede martin421 Nybegynder
16. april 2009 - 10:09 #4
Tak for jeres interesse og input. Jeg har arbejdet videre med projektet og har fået hjælp til koden...:
>>main.c og scanner.c<<

----scanner.c-----------
#include <stdio.h>  /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>  /* File control definitions */
#include <errno.h>  /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

int open_port(char* port_number) {
    char port_name[64];
    sprintf(port_name, "/dev/ttyUSB%s", port_number);
 
    int fd = open(port_name, O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1) {
        printf("open error %d %s\n", errno, strerror(errno));
        return 1;
    } else {
        fcntl(fd, F_SETFL, 0);
    }

   
    struct termios options;
    // Get the current options for the port...
    tcgetattr(fd, &options);
    // Set the baud rates to 19200...
    cfsetispeed(&options, B9600);
    cfsetospeed(&options, B9600);
    // Enable the receiver and set local mode...
    options.c_cflag |= (CLOCAL | CREAD);

    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;

    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_oflag &= ~OPOST;

    // Set the new options for the port...
    tcsetattr(fd, TCSANOW, &options);
   

    //system("stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parity -icanon min 1 time 1");
    return fd;
}

void close_port(int fd)
{
    if (fd > 0)
    {
        close(fd);
    }
}

int send(int fd, char *chars, int len) {
    chars[len] = 0x0d; // stick a <CR> after the command
    chars[len+1] = 0x00; // terminate the string properly
    int n = write(fd, chars, len+1);
    if (n < 0) {
            fputs("write failed!\n", stderr);
            return 0;
    }
    return n;
}

int recv(int fd, char *result) {
    fcntl(fd, F_SETFL, FNDELAY); // don't block serial read
    int    n = read(fd, result, 254);
    result[n] = 0x00;
    if (n < 0) {
            if (errno == EAGAIN) {
                    printf("SERIAL EAGAIN ERROR\n");
                    return 0;
            } else {
                    printf("SERIAL read error %d %s\n", errno, strerror(errno));
                    return 0;
            }
    }
    return n;
}

int getbaud(int fd) {
    struct termios termAttr;
    int inputSpeed = -1;
    speed_t baudRate;
    tcgetattr(fd, &termAttr);
    /* Get the input speed.                              */
    baudRate = cfgetispeed(&termAttr);
    switch (baudRate) {
        case B0: inputSpeed = 0;
            break;
        case B50: inputSpeed = 50;
            break;
        case B110: inputSpeed = 110;
            break;
        case B134: inputSpeed = 134;
            break;
        case B150: inputSpeed = 150;
            break;
        case B200: inputSpeed = 200;
            break;
        case B300: inputSpeed = 300;
            break;
        case B600: inputSpeed = 600;
            break;
        case B1200: inputSpeed = 1200;
            break;
        case B1800: inputSpeed = 1800;
            break;
        case B2400: inputSpeed = 2400;
            break;
        case B4800: inputSpeed = 4800;
            break;
        case B9600: inputSpeed = 9600;
            break;
        case B19200: inputSpeed = 19200;
            break;
        case B38400: inputSpeed = 38400;
            break;
    }
    return inputSpeed;
}
----------------------------------------

-----main.c-----------------------------

/*
* File:  main.c
* Author: root
*
* Created on April 7, 2009, 11:12 PM
*/

#include <stdio.h>
#include <stdlib.h>
#include "scanner.h"

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

    int fd = open_port("0");

    char output[254];
    // output til RFID scanner (char kode)
    output[0] = 0x02;
    output[1] = 0x00;
    output[2] = 0x04;
    output[3] = 0x10;
    output[4] = 0x06;
    output[5] = 0x00;
    output[6] = 0x00;
    output[7] = 0x12;
    output[8] = 0x03;
    output[9] = 0x00;
   

    /*
    output[0] = 'A';
    output[1] = 'B';
    output[2] = 'C';
    output[3] = 0x02;
    output[4] = 0x00;
    output[4] = 0x04;
    output[5] = 'D';
    output[6] = 0x00;
    */
   
    int n = send(fd, output, 9);
    if (!n) {
        printf("write failed\n");
        close_port(fd);
        return 1;
    }

    printf("send %d: ", n);
    int i = 0;
    for (; i < n; i++)
    {
        printf("%X ", output[i]);
    }
    printf("\n");
    printf("send: %s \n", output);

    usleep(500000);
    char input[254];

    n = recv(fd, input);
    if (!n) {
        printf("read failed\n");
        close_port(fd);
        return 1;
    }

    printf("recv %d: ", n);
    i = 0;
    for (; i < n; i++)
    {
        printf("%X ", input[i]);
    }
    printf("\n");
    printf("recv: %s \n", input);
    close_port(fd);

    return (EXIT_SUCCESS);
}
----------------------------------------------
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester