[elektro] Soros-USB atalakito Linuxon

Gergely Vakulya antiemes at gmail.com
Wed Aug 13 02:28:53 CEST 2014


Udvozletem!

Remelhetoleg elektro-kozeli a tema. Mindenesetre kellett hozza szkop...

Soros portra valo irassal szenvedek. A soros portot egy soros-USB
atalakito testesiti meg. A gondom az, hogy mig a write fuggveny vigan
visszaadja, hogy kiirta az osszes byte-ot, valojaban azok nem jelennek
meg a porton. Ez a kod:
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <termios.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <stdlib.h>
#include <string.h>

#define BAUDRATE B300
#define MODEMDEVICE "/dev/ttyUSB0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1

int main()
{
  int    fd_serial;
  struct termios oldtio,newtio;

  fd_serial = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_SYNC);
  if (fd_serial <0)
  {
    perror(MODEMDEVICE);
    exit(-1);
  }

  tcgetattr(fd_serial,&oldtio); /* save current port settings */

  bzero(&newtio, sizeof(newtio));
  //newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
  newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
  newtio.c_iflag = IGNPAR;
  newtio.c_oflag = 0;

  /* set input mode (non-canonical, no echo,...) */
  newtio.c_lflag = 0;

  newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
  newtio.c_cc[VMIN]     = 1;   /* blocking read until 1 chars received */

  tcflush(fd_serial, TCIFLUSH);
  tcsetattr(fd_serial,TCSANOW,&newtio);


  int fd_file;
  int rbyte;
  char rbuf[64];
  int cum=0;

  fd_file=open("transdisklong", O_RDONLY);
  while ((rbyte=read(fd_file, rbuf, 1))>0)
  {
    int x;
    printf("Elotte\n");
    x=write(fd_serial, rbuf, rbyte);
    printf("Utana %d\n", x);
    cum+=rbyte;
    printf("%d\n", cum);
    usleep(100000);
  }

  tcsetattr(fd_serial,TCSANOW,&oldtio);
  close(fd_serial);
  close(fd_file);

  return 0;
}

Az x valtozoba kerul bele elvileg az, hogy hany byte-ot ir ki. Ott
mindig annyi van, amennyit kiiratok. Ha mondjuk kiszedem az usleepet
es nem 1 byte-ot irok ki, hanem 64-et, akkor az elso csomag kimegy,
majd a program oruletes sebesseggel vegez. Ha a csomagok kozott
varakozok, akkor latszolag minden rendben, de igy is maradnak ki
csomagok. De persze a program azt jelzi, hogy kiment az osszes byte.

Ami meg erdekesebb, hogy ha kiveszem a kesleltetest, akkor tobbet mar
egyaltalan nem is megy ki adat a porton. Kezdek megorulni, hogy egy
ilyen ver primitiv dolog nem megy.

73/DX
HA4UC Gergo



More information about the Elektro mailing list