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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Serial port, GPS, Приходят испорченные данные 
:(
    Опции темы
YouROK
Дата 9.12.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть устройство с gps, данные приходят на ком порт,
под windows-ом данные приходят в виде строк по протоколу nmea, все нормально читается и парсится,
открываю так
Код

HANDLE OpenGPS(int comport,int BaudRate)
{
    DCB dcb;
    COMMTIMEOUTS timeouts = {0};
    TCHAR CP[255] = {0};

    swprintf(CP,L"COM%d",comport);

    HANDLE hPort = CreateFile(    CP,
                                  GENERIC_READ | GENERIC_WRITE,
                                  0,
                                  NULL,
                                  OPEN_EXISTING,
                                  0,//FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
                                  NULL);

    if(hPort==INVALID_HANDLE_VALUE)
        return hPort;
    timeouts.ReadTotalTimeoutConstant    = 200;
    timeouts.ReadTotalTimeoutMultiplier  = 0;
    timeouts.WriteTotalTimeoutMultiplier = 0;
    timeouts.WriteTotalTimeoutConstant   = 1;
    if(SetCommTimeouts(hPort, &timeouts) == FALSE)
    {
        CloseHandle(hPort);
        return hPort;
    }

    if(!GetCommState(hPort,&dcb))
    {
        CloseHandle(hPort);
        return hPort;
    }
    dcb.DCBlength=sizeof(dcb);
    dcb.BaudRate = BaudRate;
    dcb.XonLim = 4096;
    dcb.XoffLim = 1024;
    dcb.ByteSize = 8;
    dcb.Parity = 0;
    dcb.StopBits = 0;
    dcb.XonChar = 17;
    dcb.XoffChar = 19;
    dcb.ErrorChar = 0;
    dcb.EofChar = 0;
    dcb.EvtChar = 0;
    dcb.wReserved1 = 0;
    SetCommState(hPort,&dcb);
    return hPort;
}
 

под linux-ом (rhel 5.5) половина данных пропадают, заменяются символами
открываю так
Код

HANDLE NOpenGPS(int comport,int BaudRate)
{
    HANDLE handle;
    struct termios newtio;
    CHAR CP[255] = {0};
    int cbaud = B38400;

    sprintf(CP,"/dev/ttyS%d",comport);

    handle = open(CP, O_RDWR | O_NOCTTY | O_NONBLOCK);

    if (handle < 0)
    {
        return INVALID_HANDLE_VALUE;
    }

    switch (BaudRate)
    {
        case 1200: /* Baudrate 1200          */
            cbaud = B1200;
            break;
        case 2400: /* Baudrate 2400          */
            cbaud = B2400;
            break;
        case 4800: /* Baudrate 4800          */
            cbaud = B4800;
            break;
        case 9600: /* Baudrate 9600          */
            cbaud = B9600;
            break;
        case 19200: /* Baudrate 19200         */
            cbaud = B19200;
            break;
        case 38400: /* Baudrate 38400         */
            cbaud = B38400;
            break;
        case 57600: /* Baudrate 57600         */
            cbaud = B57600;
            break;
        default:
            close(handle);
            return INVALID_HANDLE_VALUE;
    }

    tcgetattr(handle,&oldtio);

    memset (&newtio, 0, sizeof (newtio));

    newtio.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
    newtio.c_iflag &= ~(ICRNL | INPCK | ISTRIP | IXON | BRKINT);
    newtio.c_oflag &= ~OPOST;
    newtio.c_cflag |= CS8;
    newtio.c_cc[VMIN]  = 1;
    newtio.c_cc[VTIME] = 0;
    cfsetispeed(&newtio, cbaud);
    cfsetospeed(&newtio, cbaud);

    if (tcflush(handle, TCIFLUSH) < 0)
    {
        close(handle);
        return INVALID_HANDLE_VALUE;
    }

    if (tcsetattr(handle, TCSANOW, &newtio) < 0)
    {
        close(handle);
        return INVALID_HANDLE_VALUE;
    }

    return handle;
}


вот такие данные приходят на линуксе
Код

00,N,0.00,K,N*3
$GPGGA,075453.884,5956.3253,N,0,M,,*45
$GPGSA,
0,N,0.00,K,N*32V,5956.3253,N,00,070180,,,N*7E
$GPGGA,075454.84,5956.3253,N,03,,*42
$GPGSA,A,$GPGSV,1,1,00*79V,5956.3253,N,03070180,,,N*79
$N,0.00,K,N*32
$GPGGA,075455.884,5956.3253,N,0M,,M,,*43
$GPGS1E
$GPGSV,1,1,084,V,5956.3253,N,,N*78
$GPVTG,0.K,N*32
$GPGGA,075456.884,5956.3253,N,0E,0,00,,,M,,M,,*,,,,,,,,*1E
$GP,,075456.884,V,59E,0.00,0.00,0701,,M,0.00,N,0.00,
$GPGGA,075457.884,5956.3253,N,0,,M,,*41
$GPGSAE
$GPGSV,1,1,004,V,5956.3253,N,00,070180,,,N*7A00,N,0.00,K,N*32
$GPGGA,075458.8N,03013.7927,E,0SA,A,1,,,,,,,,,,00*79
$GPRMC,07N,03013.7927,E,07
$GPVTG,0.00,32
$GPGGA,075459.85956.3253,N,0301,A,1,,,,,,,,,,,,*79
$GPRMC,075403013.7927,E,0.0
$GPVTG,0.00,T,
$GPGGA,075500.884,5956.3253,N,0927,E,0,00,,,M,,,,,,,,,,,,*1E
$C,075500.884,V,5,E,0.00,0.00,07000,T,,M,0.00,N,0
$GPGGA,075501.884,5956.3253,N,0,E,0,00,,,M,,M,,*,,,,,,,,*1E
$GPC,075501.884,V,500.00,N,0.00,K,N


пробовал менять четность, parity, маскирование, стоповые биты.
Как биты нужно выставить в настройках что бы было как в винде?

Это сообщение отредактировал(а) YouROK - 9.12.2011, 16:19
PM MAIL   Вверх
kuzulis
Дата 9.12.2011, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Попробуй просто cfmakeraw вместо этого:
Код

    newtio.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
    newtio.c_iflag &= ~(ICRNL | INPCK | ISTRIP | IXON | BRKINT);
    newtio.c_oflag &= ~OPOST;

барахла.

И что за ужас:
Цитата

...
HANDLE handle;
...
INVALID_HANDLE_VALUE;
...

в моем Linux-е ?  smile 

Это сообщение отредактировал(а) kuzulis - 9.12.2011, 17:17
PM MAIL   Вверх
bsa
Дата 9.12.2011, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Начни с этого:
Код
    newtio.c_cflag |= CS8 | CREAD | CLOCAL;
    newtio.c_iflag |= IXON | IXOFF;
    newtio.c_cc[VSTART] = 17;
    newtio.c_cc[VSTOP] = 19;

PM   Вверх
YouROK
Дата 9.12.2011, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(kuzulis @  9.12.2011,  17:05 Найти цитируемый пост)
в моем Linux-е ?    


Код

#define HANDLE int
#define INVALID_HANDLE_VALUE -1


для кроскомпиляции
проект еще идет под wince

Добавлено через 13 минут и 6 секунд
bsa
сделал так
Код

    memset (&newtio, 0, sizeof (newtio));
    cfsetispeed(&newtio, B38400);
    cfsetospeed(&newtio, B38400);


    newtio.c_cflag |= CS8 | CREAD | CLOCAL;
    newtio.c_iflag |= IXON | IXOFF;
    newtio.c_cc[VSTART] = 17;
    newtio.c_cc[VSTOP] = 19;


выдает на экран
Код

$GPGGA,090049.8Nj���G�,03013.7927,E,0,j���G�,,,,,,*1E
$GPG8j���G�87,V,5956.3253,,j���G�070180,,,N*79
,j���G�N,0.00,K,N*32
,j���G�$GPGGA,090050.88j���G�7,5956.3253,N,0,,���G�M,,M,,*4A
$GPG,*���G�1E
$GPGSV,1,1,9*���G�56.3253,N,0301301���G�80,,,N*71
$GPV0.���G�00,K,N*32
$GPV0.���G�$GPGGA,090051.825���G�3,N,03013.7927,G5���G�PGSA,A,1,,,,,,,1,���G�1,00*79
$GPRMC2,���G�53,N,03013.7927,,���G�N*70
$GPVTG,0.,,���G�N*32
$GPVTG,0.,,���G�$GPGGA,090052.85,���G�6.3253,N,03013.8,���G�
$GPGSA,A,1,,,S,���G�V,1,1,00*79
$G5,���G�6.3253,N,03013.3,���G�
���G�G,0.00,T2


добавил после этих строк 
cfmakeraw(&newtio);
выдает примерно тоже самое,
такое чувство что перезаписывается буфер, не успевая прочитаться программой.
п.с. данные gps приемник посылает раз в секунду одну строку, в ком порт, может какие таймауты надо выставить
PM MAIL   Вверх
bsa
Дата 9.12.2011, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



cfmakeraw(&newtio); надо делать вместо memset. И перед настройкой флагов!
PM   Вверх
svlary
Дата 10.12.2011, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(YouROK @  9.12.2011,  16:17 Найти цитируемый пост)
вот такие данные приходят на линуксе

  При разглядывании этих саммых данных, прихожу к выводу :
  • Большая часть символов передана нормально. Значит, аппаратура и аппаратные настройки тут непричем...
  • НЕКОТОРЫЕ символы заменены звездочками. Похоже, что это делает какая-то функция, которую Вы вызываете.

 В связи с этим у меня возникло несколько вопросов :
  • Зачем ВЫ открываете файл устройства в НЕблокирующем режиме ? Это довольно опасно и требует определенных усилий для поддержки такого режима со стороны программиста, раз Вы не доверяете сделать это ОС.
  • Зачем Вы используете супер-пупер библиотеку для работы с терминалом, если в данном случае (элементарное чтение  из СОМ-порта) за глаза хватет обычного вызова read ?! Я подозреваю, что именно это ПО и выполняет замену некоторых символов входного потока звездочками.

Ну и мои сответы, соответственно :
  • Убрать неблокирующий режим
  • Воспользоваться обычным вызовом read.

Во всяком случае, в том ПО, которое я разаработал для городского автохозяйства сделано именно так.  И все работает на сотнях мащин уже без малого год... smile Если хотя бы три спутника есть над горизонтом, то все координаты определятся и передаюся в ДЦ....

PM MAIL   Вверх
bsa
Дата 11.12.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(svlary @  10.12.2011,  08:35 Найти цитируемый пост)
Зачем Вы используете супер-пупер библиотеку для работы с терминалом, если в данном случае (элементарное чтение  из СОМ-порта) за глаза хватет обычного вызова read ?! Я подозреваю, что именно это ПО и выполняет замену некоторых символов входного потока звездочками.

Это где?!?
PM   Вверх
svlary
Дата 12.12.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(bsa @  11.12.2011,  21:52 Найти цитируемый пост)
Это где?!? 

Я имею в виду вот это :

Код

    cfsetispeed(&newtio, cbaud);
    cfsetospeed(&newtio, cbaud);


В man-е написано :

Код

DESCRIPTION
       The termios functions describe a general terminal interface that is provided to control asynchronous  communications
       ports.


Я как раз и гворил о "библиотеке для работы с терминалом"

Добавлено через 5 минут и 29 секунд
Но дело не в установке скорости, однозначно ! Если бы скорость СОМ-порта была настроена неправильно,  то Вы бы увидели полную кашу.  Это я Вам гарантирую ! smile А тут мы наблюдаем довольно внятные NMEA, в которых испорчена ЧАСТЬ (!!!) символов... Ясно, что это шалит ПО.  Может у Вас какой-то специальный навигатор, который кирилицу добавляет ? 
PM MAIL   Вверх
bsa
Дата 12.12.2011, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(svlary @  12.12.2011,  12:40 Найти цитируемый пост)
Я как раз и гворил о "библиотеке для работы с терминалом"

а без нее только через ioctl можно поменять настройки порта. А кроме скорости есть еще и четность и количество стопов. Кстати, надо бы посмотреть, что за байты скрыты за вопросиками. Если это \377 и \0, то явно проблема с четностью.
Кстати, у кого-то были проблемы с ком-портом на встроенном линуксе. Там все работало при низкой загрузке системы. А при высокой переставало.
PM   Вверх
svlary
Дата 12.12.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Более внимательно посмотрел на принимаемый текст... Возьмем самые ходовые сообщения - GPRMC. Вот что мы видим :

Цитата

$GPRMC,075403013.7927,E,0.0
$GPRMC,07N,03013.7927,E,07


Смотрим, что написано в доке :

Цитата

RMC
Recommended Minimum Navigation Information
GPRMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,xxxx,x.x,a*hh


Получается, что дело не в неправильной кодировке, а в том, что пропадают целые КУСКИ сообщений ! В обоих примерах отсутствует время и флаг актуальности.  В первом сообщениее совсем нет широты, но присутствует долгота.  Во втором есть обрывок широты.  В обоих отсутствует скорость и все, что за ней, включая контрольную сумму.

Вы уверены, что Ваша железяка действительно работает ? СОМ-порт и операционка здесь явно - непричем...

Добавлено через 3 минуты и 32 секунды
Цитата(YouROK @  9.12.2011,  16:17 Найти цитируемый пост)
под linux-ом (rhel 5.5) половина данных пропадают, заменяются символами

  • Уточните, что значит "под linux-ом" ! Может быть Вы имеете в виду ВИРТУАЛЬНУЮ машину linux на виндовозе ?
  • Что-то я не заметил ЗАМЕНЫ. Вижу только ПОТЕРЮ символов.

PM MAIL   Вверх
1oid
Дата 3.2.2012, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



   int    fd;
    struct termios options;

    fd = open( U2_NAME, O_RDWR | O_NOCTTY );  // |O_NONBLOCK - removed from open() SNK
    if (fd == -1)
        wxPrintf( "Open_port: Unable to open %s\n", U2_NAME );
    else
    {
        tcgetattr( fd, &options );
        cfsetispeed( &options, B9600 );
        cfsetospeed( &options, B9600 );
        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        options.c_cflag &= ~CSIZE;
        options.c_cflag |= CS8;
        options.c_cc[VMIN] = 1;    // minimum bytes
        options.c_cc[VTIME] = 10;    // interval in 1/10 sec
        options.c_lflag = ICANON;    // enable canonical input
        options.c_oflag = 0;        // raw output
        tcflush( fd, TCIFLUSH );
        tcsetattr( fd, TCSANOW, &options );
    }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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