So.....minicom zeigt das vom Atmel gesendete Zeichen. Das ist ja schonmal vielversprechend!
readAtmel() leider immer noch 0.
Habe den fehlenden Code natürlich eingefügt...aber leider immer noch nix.
***edit
hab das TIMEOUT mal erhöht und um eine Null erweitert und siehe da...es kommt was zurück vom Port.
Jetzt aber erstmal ins Bett...
***edit
konnte es dann doch nicht erwarten \/
Danke dir für deine Hilfe!!!
Jetzt kann ich alles über USB steuern, Daten empfangen und das dicke Kabel für LPT1 kann weg.
Hier der funktionierende Code
Code:
#include <errno.h>
#include <fcntl.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <linux/serial.h>
#define READ_TIMEOUT 100000
#define _POSIX
#define USB_DEVICE "/dev/ttyUSB0"
int dev_fd = 0;
/* openAtmel */
int openAtmelPort(char *dev_name)
{
if ((dev_fd = open(dev_name, O_RDWR | O_NOCTTY, 0)) < 0)
{
return (-1);
}
//============ DIESE ZEILEN HIER SETZEN DIE PORT SETTINGS ========================
struct termios ctio;
tcgetattr(dev_fd, &ctio); /* save current port settings */
ctio.c_iflag = IXON | IGNPAR; // TODO: IXON oder IXOFF ?!?? < < < <
ctio.c_oflag = 0;
// | SW flow control | Parity 0 | 8 Databits | 1 StopBit
ctio.c_cflag = CREAD | CLOCAL | 0 | CS8 | 1;
ctio.c_lflag = 0;
ctio.c_cc[VTIME] = 0; /* inter-character timer unused */
ctio.c_cc[VMIN] = 0; /* blocking read until 0 chars received */
cfsetispeed(&ctio, (speed_t) B9600);
cfsetospeed(&ctio, (speed_t) B9600);
tcflush(dev_fd, TCIFLUSH);
tcsetattr(dev_fd, TCSANOW, &ctio);
return (dev_fd);
//==========================================================================
return (dev_fd);
}
/* closeAtmel */
int closeAtmelPort()
{
return close(dev_fd);
}
/* writeAtmel */
int writeAtmelPort(char *c)
{
int n = write(dev_fd, c, 1);
if (n < 0)
{
// error
printf("write() of n bytes failed -> %d", n);
}
return n;
}
/* readAtmel */
int readAtmelPort(unsigned char *buf, int nChars)
{
int amountRead = 0, bytes_read = 0;
struct timeval t;
fd_set set;
int err;
while(nChars > 0)
{
t.tv_sec = 0;
t.tv_usec = READ_TIMEOUT;
FD_ZERO(&set);
FD_SET(dev_fd, &set);
err = select(dev_fd + 1, &set, NULL, NULL, &t);
if(err == 0)
return 0;
amountRead = read(dev_fd, buf, nChars);
if(amountRead < 0 && errno != EWOULDBLOCK)
return -1;
else if(amountRead > 0) {
bytes_read += amountRead;
nChars -= amountRead;
buf += amountRead;
}
}
return bytes_read;
}
int main()
{
unsigned char *buffer;
int result;
char *myChar[1];
myChar[0]="w";
result = openAtmelPort(USB_DEVICE);
printf("openAtmelPort: %d\n", result);
result = readAtmelPort(buffer, 2);
printf("readAtmelPort: %d\n", result);
printf("in: %d\n", buffer[0]);
printf("out: %s\n", myChar[0]);
result = writeAtmelPort(myChar[0]);
printf("writeAtmelPort: %d\n", result);
closeAtmelPort();
return (0);
}
Das TIMEOUT konnte ich wieder runtersetzen, da ich beim Atmel den Loop hab schneller laufen lassen.
Lesezeichen