Последовательный порт (срочно нужна помощ!!!!)

Модератор: Модераторы разделов

Аватара пользователя
Gang
Сообщения: 106

Последовательный порт

Сообщение Gang »

Помогите разобраться!
Необходимо посылать и считывать с порта. Дело в том, что МК будет посылать опр. инф. через этот интерфейс и собственно управляться через него.
Так вот нужен "каркас" приложения для этой цели и вообще не понятно как тестить и отлаживать эти приложения.
Почитал How to написал тестовое приложение не работает :

Код: Выделить всё

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>   /* Error number definitions */
#include <termios.h>

int main () {
    int i, fd = open ("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY), fd2;
    char str;
    if (fd == -1){
        perror("open_port: Unable to open /dev/ttyS0 - ");
    }
    else
        аcntl(fd, F_SETFL, 0);
    write (fd, "123", 3);
    fd2 = read (fd,str,sizeof (str));
    printf ("%d",&fd2);
    close (fd);
    return 0;
}

Подскажите, что не так, если можно поподробней!
Спасибо )
Спасибо сказали:
Аватара пользователя
DaemonTux
Сообщения: 1480
Статус: Юный падаван
ОС: Gentoo

Re: Последовательный порт

Сообщение DaemonTux »

А МК правильно настроен? Вы проверяли его работу с портом? И раде любопытства что за МК используете?
Vladivostok Linux User Group
Спасибо сказали:
Аватара пользователя
alastor
Сообщения: 844
Статус: ARCH'еноид
ОС: Arch Linux current

Re: Последовательный порт

Сообщение alastor »

Что именно не работает? Какие ошибки выдает?
Спасибо сказали:
Аватара пользователя
Gang
Сообщения: 106

Re: Последовательный порт

Сообщение Gang »

Да до МК пока дело не дошло мы оттестить хотим )
просто пишем и читаем из порта, точнее пытаемся, сейчас появилась идея через нуль модем два порта соединить и попытаться.
Ошибка выкидывается на этапе открытия. Segmentation Fault пишет
Есть идеи как реализовать тестовое приложение?? очень нужно...
Спасибо сказали:
int_0dh
Сообщения: 20
ОС: Linux

Re: Последовательный порт

Сообщение int_0dh »

1) вы пытаетесь read() _по адресу который лежит в str_ - что дважды неправильно
2) любопытно - зачем вы выводите _адрес_ переменной где лежит число прочитанных байт(но не само это число)
Спасибо сказали:
Аватара пользователя
Gang
Сообщения: 106

Re: Последовательный порт

Сообщение Gang »

int_0dh писал(а):
06.04.2007 11:19
1) вы пытаетесь read() _по адресу который лежит в str_ - что дважды неправильно
2) любопытно - зачем вы выводите _адрес_ переменной где лежит число прочитанных байт(но не само это число)

Не могли бы поподробней объяснить как правильно читать/писать ??
я думал read (откуда , куда , сколько) грубо говоря, или я не прав??
Спасибо сказали:
int_0dh
Сообщения: 20
ОС: Linux

Re: Последовательный порт

Сообщение int_0dh »

Все правильно, только в кчестве "куда" вы должны указать адрес буфера, а не значение неинициализированной переменной :)
в вашем случае read(fd, &str, sizeof(str)) /*должен прочитать один байт или вернуть -1/errno == -EAGAIN если данных нет и установлен неблокирующий режим */
Спасибо сказали:
Аватара пользователя
UTeHok
Сообщения: 354
Статус: Антиглобалист
ОС: Debian GNU/Linux

Re: Последовательный порт

Сообщение UTeHok »

Я не совсем понял, что Вы хотите, но попробуйте это:

Код: Выделить всё

#include<errno.h>
#include<unistd.h>
#include<stdio.h>
#include<fcntl.h>
#include<iostream>
using namespace std;

int main()
{
        int in_fd, out_fd, off_t, fdd;
        char buf[4096];
        char name[100], name2[100];
        cout << "Enter name file, pleace\n";
        cin >> name;
        cout << "Enter name2 file, pleace\n";
        cin >> name2;

        if((in_fd = open(name, O_RDWR)) == -1)
                perror("open");

        int size;
        if((size = read(in_fd, buf, 4096)) == -1)
                perror("read");

        if(close(in_fd) == -1)
                perror("close");

        if((out_fd = open(name2, O_RDWR)) == -1)
                perror("open");

        int wh_fd;
        if((wh_fd = write(out_fd, buf, size)) == -1)
                perror("write");

        if(close(out_fd) == -1)
        perror("close2");

        return 0;
}
«Make love, not war!»
Спасибо сказали:
Skip
Сообщения: 30
ОС: Debian

Re: Последовательный порт

Сообщение Skip »

кроме ошибки в fd2 = read (fd,str,sizeof (str));
1. Если порт не открыт (fd == -1), то выводим сообщение об ошибке и... проваливаемся дальше по коду, пытаемся выполнить write и т.д. :)
2. fd2 = read (fd,str,sizeof (str)); printf ("%d",&fd2); - если не секрет, то для вывода какой информации предназначался printf; в данном случае он выводит адрес переменной fd2.
Спасибо сказали:
Аватара пользователя
Gang
Сообщения: 106

Re: Последовательный порт

Сообщение Gang »

Skip писал(а):
08.04.2007 11:01
кроме ошибки в fd2 = read (fd,str,sizeof (str));
1. Если порт не открыт (fd == -1), то выводим сообщение об ошибке и... проваливаемся дальше по коду, пытаемся выполнить write и т.д. :)
2. fd2 = read (fd,str,sizeof (str)); printf ("%d",&fd2); - если не секрет, то для вывода какой информации предназначался printf; в данном случае он выводит адрес переменной fd2.

вообще printf хотелось увидеть, что было послано в порт тоесть именно значение. Но программа почему то вываливалась и хотелось увидеть, чему же равно fd
Вообще может я криво вопрос задал...
В общем задача:
есть машина с двумя портами (СОМ, /dev/ttyS0 /dev/ttyS1), есть нуль модемный кабель, Нужно написать приложение которое бы посылало данные в порт и соответвтвенно читала с него. Мне вот не совсем понятно как это сделать, поэтому и просил пример.
Вопрос еще как все это оттестить. С одним портом или через кабель можно слать и с дугого порта читать??
Если можно приведите примерчик какой-нить, а то HOW - TO POSIX уж очень жестко написано ))
Заранее балгодарен!
Спасибо сказали:
Аватара пользователя
Gang
Сообщения: 106

Re: Последовательный порт

Сообщение Gang »

Код: Выделить всё

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <termios.h>

int open_port(char *str){
    int fd0;
    fd0 = open (str, O_RDWR | O_NOCTTY | O_NDELAY);
    if(fd0==-1) perror("open_port: Unable to open port /dev/ttyS0 - ");
    else fcntl(fd0,F_SETFL, 0);
    return fd0;
}


int main () {
    int fd0,fd1,n,i,k;
    struct termios options;
    char com1;
    char com2;
    char str1[4096];

    //Open port /dev/ttyS0 //
    fd0=open_port("/dev/ttyS0");
    tcgetattr(fd0, &options);

    //Input 1 sek time out//
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_oflag &= ~OPOST;
    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 10;

    //Changing options----------------
    tcsetattr(fd0, TCSANOW, &options);
    //--------------------------------

    //Open port /dev/ttyS1 //
    fd1=open_port("/dev/ttyS1");
    tcgetattr(fd1, &options);

    //Input 1 sek time out//
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    options.c_oflag &= ~OPOST;
    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 10;

    //Changing options
    tcsetattr(fd1, TCSANOW, &options);
    //--------------------------------

    for(i=0;i<11;i++){//    for(i=0;i<2;i++)
    if(n = write(fd0,"1234567890",4096)==-1)
        perror("write fd0 \" 1234567890\" \n");
    if(k = read(fd1, str1,4096)== -1)
        perror("reading Failed\n");
    printf("%s\n", str1);
    }

    close(fd0);
    close(fd1);
    return 0;

}

в общем вот что получилось. Вроде все пишет и читает. Я вот только не понял какой там размер буфера максимальный, а то читает он немного странно строчка уплывает все время..
И вот сразу еще вопрос:
Нужно будет потом эту програмульку запускать процессом, чтоб он слушала TCP порт получала комманды и посылала соответственно. Как бы ето сделать, есть идеи?
Мне кажется, что проще сделать типа сервиса, он слушает порт, берет комманду и передает ее этой програмке... или можно еще как то??
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Последовательный порт

Сообщение BlackStar »

Можно в отдельном потоке запустить сервер.
LightLang Team
Спасибо сказали:
Аватара пользователя
Gang
Сообщения: 106

Re: Последовательный порт

Сообщение Gang »

BlackStar писал(а):
08.04.2007 19:33
Можно в отдельном потоке запустить сервер.

Тоесть я так понял, я запускаю сервер и он может потом вызывать мою програмку и т.д. ??
и как запускать отдельным потоком?? я просто под линуксом не знаю как это делать?? Можно примерчик?
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Последовательный порт

Сообщение elide »

пиши под inetd. это избавит тебя от большого количества проблем.....
слава роботам!
Спасибо сказали:
Аватара пользователя
Gang
Сообщения: 106

Re: Последовательный порт

Сообщение Gang »

elide писал(а):
09.04.2007 00:46
пиши под inetd. это избавит тебя от большого количества проблем.....

Можно поподробней??
Спасибо сказали: