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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблем апосле переноса кода из VC++ 
:(
    Опции темы
31337Ghost
Дата 12.2.2011, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Введение.
Есть у меня устройство - ультразвуковой дальномер, он работает по шине rs485. Есть у меня преобразователь интерфейса - rs485<->USB. Есть к этому дальномеру пример софта, написанный на VC++, вот: http://www.robot-electronics.co.uk/files/srf48.zip. Под WinXP все работает как надо, показывает дистанцию безо всяких проблем.

Переписал с горем пополам это на C++ в линуксе. Получился исходник следующего содержания:
Код

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
enum commands 
{    
    REAL_IN=0x50,REAL_CM,REAL_US, 
    REAL_IN_TX,REAL_CM_TX,REAL_US_TX, 
    FAKE_IN,FAKE_CM,FAKE_US, 
    FAKE_IN_TX,FAKE_CM_TX,FAKE_US_TX, 
    BURST,GET_VER,GET_RANGE,
    GET_MIN,RETUNE,SET_MAXGAIN,
    GET_MAXGAIN,TEST_DAC,SET_LEDS,
    SET_SEARCH,LESS_THAN,SET_GROUP,
    GET_TEMP,GET_TRANGE,
};

int main(void)
{
    int oldflags,fdDK ;
    struct termios termios_struct;
    char sbuf[100];
char osbuf[100];
    int range, trange;
    //dword Addr;

    //Конфигурирование порта
    fdDK = open("/dev/ttyUSB0",O_RDWR|O_NOCTTY);
    oldflags = fcntl (fdDK, F_GETFL, 0);
    oldflags&=~O_NONBLOCK;
    fcntl (fdDK, F_SETFL, oldflags);
    tcgetattr(fdDK,&termios_struct);

    cfsetispeed(&termios_struct,B38400);
    cfsetospeed(&termios_struct,B38400);
    termios_struct.c_cflag&=~PARENB;
    termios_struct.c_cflag&=~CRTSCTS;
    termios_struct.c_oflag&=~IXON;
    termios_struct.c_oflag&=~IXOFF;

    termios_struct.c_cflag|=CSTOPB;
    termios_struct.c_cflag&=~CSIZE;
    termios_struct.c_cflag|=CS8;
    termios_struct.c_lflag&=~ICANON;
    tcsetattr(fdDK,TCSANOW,&termios_struct);
    
while (true) {
    tcsendbreak(fdDK,0);                    // Break
    sbuf[0] = REAL_CM;                    // CMD
    sbuf[1] = 0x00;                        // AddrH    
    sbuf[2] = 0;                        // AddrM
    sbuf[3] = 0;                        // AddrL
    sbuf[4] = 0;                        // Data
    sbuf[5] = ~(sbuf[0]+sbuf[1]+sbuf[2]+sbuf[3]+sbuf[4]);    // Chksum
    write(fdDK,&sbuf,6);
    //sleep(2);
    usleep(50000);

    tcsendbreak(fdDK,0);                    // Break
    sbuf[0] = GET_TRANGE;                    // CMD
    sbuf[1] = 0x00;                        // AddrH    
    sbuf[2] = 0x2B;                        // AddrM
    sbuf[3] = 0xED;                        // AddrL
    sbuf[4] = 0x00;                        // Data
    sbuf[5] = ~(sbuf[0]+sbuf[1]+sbuf[2]+sbuf[3]+sbuf[4]);    // Chksum
    write(fdDK,&sbuf,6);
    read(fdDK,osbuf,2);
    range = (osbuf[0]<<8)+osbuf[1];
    printf("%i cm\n",range);
}
    close(fdDK);
    return 1;
}


До этого с нюансами языка программирования "СИ" ни разу не разбирался, и вот проблема. Представленный выше код даже рабоатет, но есть маленькая загвоздка - в выводе результатов. Вобщем что я вижу на выходе:
Код

105 cm
112 cm
114 cm
117 cm
119 cm
120 cm
121 cm
123 cm
124 cm
126 cm
127 cm
-128 cm
-128 cm
-127 cm
-125 cm
-123 cm
-122 cm
-120 cm
-118 cm
-117 cm
-115 cm
-92 cm


Т.е. я впринципе не вижу значения дистанции больше 127см. Увеличивая физически дистанцию  между дальномером и объектом измерения я получаю на экран убывающие значения со знаком "-". На приведенном выводе с экрана дистанция физически увеличивалась до самого конца экранного вывода, т.е. в начале реальное расстояние было действительно 105 см, а в конце я отодвинул дальномер от объекта на расстояние около  165 см (что и ожидал увидеть на экране) smile Помогите, пожалуйста, может всему причинуй особенность С++ в купе с линуксом? 
PM MAIL   Вверх
Фантом
Дата 12.2.2011, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



Во-первых, это код на C (а не на C++). 

Во-вторых, то, что Вы сейчас видите на экране - это нормальное поведение этой программы. В стандарте языка C значения типа char меняются в диапазоне от -127 до 127. Дело не в "особенности C++ вкупе с линуксом", а в "особенностях" (это если деликатно выражаться) компиляторов от Microsoft, в которых стандарты нарушаются чуть менее чем везде.

Сделать надо следующее: везде, где встречается объявление чего-то типа char, заменить тип на unsigned char.
PM   Вверх
31337Ghost
Дата 13.2.2011, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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


 




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


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

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