Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Последовательный порт, принимаются отправленные данные 
:(
    Опции темы
XaverOz
Дата 20.9.2012, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.3.2011

Репутация: нет
Всего: нет



Работаю с последовательным портом через termios при отправке, данных через некоторое время получаю данные которые отправил и только потом ответ от устройства, подскажите флаг в структуре который это убирает.
Код

#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/ioctl.h>

int fd;
struct termios tio, old_tio;

time_t SubTime_mSec(timeval val1, timeval val2)
{
    timeval tv;
    if (val1.tv_sec > val2.tv_sec) return (0);
    if (val1.tv_sec == val2.tv_sec)
        if (val1.tv_usec > val2.tv_usec) return (0);
    tv.tv_sec = val2.tv_sec - val1.tv_sec;
    if (val1.tv_usec < val2.tv_usec) {
        tv.tv_usec = val2.tv_usec - val1.tv_usec;
    } else {
        tv.tv_sec --;
        tv.tv_usec = 1000000 + val2.tv_usec - val1.tv_usec;
    }

    return(tv.tv_sec*1000 + tv.tv_usec/1000);
}


void RTUOutMessage(int cnt1, int cnt2)
{
    unsigned char msg[13] = {0x01, 0x10, 0x00, 0x2F, 0x00, 0x02, 0x04, 0x4B, 0x64, 0x3D, 0xD9, 0x36, 0xC6};
    int Len = 13;
    int status, i, j;
    ioctl(fd, TIOCMGET, &status);

    status = status | TIOCM_RTS | TIOCM_DTR;
    ioctl(fd, TIOCMSET, &status);
    write(fd, msg, Len);
    for (j = 0; j < cnt1; j ++)
        for (i = 0; i < cnt2; i ++);
    ioctl(fd, TIOCMGET, &status);
    status &= ~TIOCM_RTS;
    status &= ~TIOCM_DTR;
    ioctl(fd, TIOCMSET, &status);

    timeval start_t, curr_t;
    char Buff[80];
    int l;

    gettimeofday(&start_t, NULL);
    curr_t = start_t;
    while (SubTime_mSec(start_t, curr_t) < 1000) {
        l = read(fd, Buff, 80);
        if (l > 0) {
            printf("BUFFER=");
             for(i = 0; i < l; i++) {
                 printf(" %x", Buff[i]);
             }
             //printf("\n");
        }
        gettimeofday(&curr_t, NULL);
    }
}

void  InitPort(void)
{
    int StopBits = 2;
    if ((fd = open("/dev/ttyAM2", O_RDWR | O_NDELAY)) < 0) {
        printf("Couldn't open /dev/ttyAM2\n");
    }
    tcflush(fd, TCIOFLUSH);
    int n = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, n & ~O_NDELAY);
    tcgetattr(fd, &old_tio);
    tcgetattr(fd, &tio);
    cfsetospeed(&tio, (speed_t)B9600);
    cfsetispeed(&tio, (speed_t)B9600);
    tio.c_cflag = (tio.c_cflag & ~CSIZE) | CS8;
    tio.c_cflag |= CLOCAL | CREAD ;
    tio.c_cflag &= ~OFILL; 
    //parity
    tio.c_cflag &= ~(PARENB | PARODD);
    tio.c_cflag &= ~CRTSCTS;
    if (StopBits == 2) tio.c_cflag |= CSTOPB;
    else tio.c_cflag &= ~CSTOPB;
    tio.c_iflag=IGNBRK;
    tio.c_iflag &= ~(IXON|IXOFF|IXANY);
    tio.c_lflag=0;
    tio.c_oflag=0;
    tio.c_cc[VTIME]=0;
    tio.c_cc[VMIN]=0;
    if (tcsetattr(fd, TCSANOW, &tio)!=0) printf("tcsetattr() 1 failed\n");

    int mcs=0;
    ioctl(fd, TIOCMGET, &mcs);
    mcs |= TIOCM_RTS;
    ioctl(fd, TIOCMSET, &mcs);

    if (tcgetattr(fd, &tio)!=0) printf("tcgetattr() 4 failed\n");
    tio.c_cflag &= ~CRTSCTS;
    if (tcsetattr(fd, TCSANOW, &tio)!=0) printf("tcsetattr() 2 failed\n");
}

int main(int argc, char **argv)
{
    InitPort();
    int cnt1, cnt2;
    cnt1 = 3;
    cnt2 = 20000;
    cnt1 = atoi(argv[1]);
    cnt2 = atoi(argv[2]);
    for(;;) {
    RTUOutMessage(cnt1, cnt2);
    usleep(1000000);
    }
    tcsetattr(fd, TCSANOW, &old_tio);
    close(fd);
    printf("End\n");

    return 0;
}


Это сообщение отредактировал(а) XaverOz - 20.9.2012, 13:10
PM MAIL   Вверх
borisbn
Дата 20.9.2012, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: нет
Всего: 135



Может не в флагах дело а в устройстве ? Может оно настроено в режиме ECHO ? Например, практически у всех модемов этот режим есть и включен по-умолчанию.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
XaverOz
Дата 20.9.2012, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.3.2011

Репутация: нет
Всего: нет



Цитата(borisbn @ 20.9.2012,  13:44)
Может не в флагах дело а в устройстве ? Может оно настроено в режиме ECHO ? Например, практически у всех модемов этот режим есть и включен по-умолчанию.

нет, получаю эти данные даже когда к порту ничего не подключенно. 

Это сообщение отредактировал(а) XaverOz - 20.9.2012, 13:56
PM MAIL   Вверх
tzirechnoy
Дата 20.9.2012, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Я бы поставил скорее на то, что у Вас там TX на RX замкнут. Не rs485 случайно?

Хотя, для надёжности, можно сказать cfmakeraw().
PM MAIL   Вверх
XaverOz
Дата 21.9.2012, 05:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.3.2011

Репутация: нет
Всего: нет



Не замкнут, интерфейс 485
cfmakeraw не помог
PM MAIL   Вверх
tzirechnoy
Дата 21.9.2012, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
Не замкнут, интерфейс 485


Замкнут-замкнут. У 485 токовая петля, там по определению он замкнут. Потому интэрфейс принцыпиально полудуплексный -- и конвертэры USART<->RS485 обычно требуют управление направлением передачи.
 В типичном комповом случае DE9 COM<->RS485 это управление висит на сигнале RTS, для передачи символа следует включать RTS, после, для приёма -- выключать.
PM MAIL   Вверх
tzirechnoy
Дата 21.9.2012, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Кстати, опаньки. Полез в википедию освежыть знания -- и внезапно обнаружыл, что у RS485 не токовая петля 20mA=1/<1mA=0, а вполне себе дифференцыальная сигнализацыя потэнцыалами (+200mV=1, -200mV=0). 
Что, в данном случае, абсолютно безразлично, поскольку типичный RS485 использует два провода и является полудуплексным, и TX у него на RX таки замкнут.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0998 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.