LINUX.ORG.RU

как правильно работать с Com портом ?


0

0

пишу на C . Проблема такая: C com порта идут данные с атс необходимо читать эти данные в базу даннх mysql. В начале начал пробывать с мышкой на ttys0 значить когда начинаю шевелить мышей читаеться какой то символ и всё завершаеться . Непонятно как можно это реализовать так чтобы данные читались непрерывно и записывались в базу, то есть не понятно как работать с com портом где это можно глянуть на примере ?

anonymous

Ключевое слово termios.h
/* Standard input/output definitions */
#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 */
#include <sys/time.h>
#define BAUDRATE B19200

main(argc,argv)
int argc;
char *argv[];
{
int fd,z; /* File descriptor for the port */
char indata[250];
struct termios oldtio,newtio;
fd_set rfds,wfds;
struct timeval tv;
FILE * fdstream;
printf(argv[argc-1]);
fd = open("/dev/ttyS1",O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{ /* * Could not open the port. */
printf("open_port: Unable to open /dev/ttyf1 ");
}
else
{
char *recv;
int leng;
tcgetattr(fd,&oldtio); /* save current serial port settings */
bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
/*
BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
CS8 : 8n1 (8bit,no parity,1 stopbit)
CLOCAL : local connection, no modem contol
CREAD : enable receiving characters
*/
newtio.c_cflag = BAUDRATE | CLOCAL | CS8 | PARENB | PARODD | CREAD | ICRNL;
/*
IGNPAR : ignore bytes with parity errors
ICRNL : map CR to NL (otherwise a CR input on the other computer
will not terminate input)
otherwise make device raw (no other input processing)
*/
newtio.c_iflag = 0;
/*
Raw output.
*/
newtio.c_oflag = 0;
/*
ICANON : enable canonical input
disable all echo functionality, and don't send signals to calling program
*/
newtio.c_lflag = ICANON;
/*
initialize all control characters
default values can be found in /usr/include/termios.h, and are given
in the comments, but we don't need them here
*/
newtio.c_cc[VINTR] = 0; /* Ctrl-c */
newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */
newtio.c_cc[VERASE] = 0; /* del */
newtio.c_cc[VKILL] = 0; /* @ */
newtio.c_cc[VEOF] = 4; /* Ctrl-d */
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
newtio.c_cc[VSWTC] = 0; /* '\0' */
newtio.c_cc[VSTART] = 0; /* Ctrl-q */
newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
newtio.c_cc[VEOL] = 13; /* '\0' */
newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
newtio.c_cc[VEOL2] = 10; /* '\0' */
/*
now clean the modem line and activate the settings for the port
*/
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
fcntl(fd, F_SETFL, 0);
while (1) {
FD_ZERO(&rfds);
FD_SET(fd,&rfds);
if (select (fd+1,&rfds,NULL,NULL,NULL)) {
if (FD_ISSET(fd,&rfds)) {
z=read(fd,indata,250);
indata[z]=0;
printf(indata);
}
} else {
printf("TIME OUTED\n");
}
}
}
return (fd);

}

anonymous
()

Я все примеры брал из исходников minicom

Есть еще howto

anonymous
()

А зачем тебе вообще с ним работать? Ну и читай из STDIN.
# your_program </dev/ttyS1
или вообще в иниттаб воткни.
А с СОМ-портом пусть ядро работает. 

ansky ★★★★★
()

А где в этом случае параиетры порта выставить? И чтоб например он рид-онли был?

anonymous
()
Ответ на: комментарий от anonymous

Параметры порта выставляются программой stty,
А чтобы только читать, 
chmod 444 /dev/ttyS1
или 
program </dev/ttyS1 >/dev/null 2>&1
или в stty, кажись тоже настраивается.

ansky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.