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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с COM портом 
:(
    Опции темы
theworldcreator
Дата 6.11.2007, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот программка, взятая сдесь же, с форума. Запустил для проверки, и не работает! Проверил вольтметром - некоторый ножки имею напряжение порядка 11 волт(причем как это ни странно вольтметор дает отрицательной напряжение как если бы я "-" с "+" перепутал, но "-" - это 5 ножка, вот распиновка http://www.radiomaster.ru/spravka/papa_mama/com.php)
Код

#include <stdio.h>
int main(int argc, char *argv[])
{
    FILE *com = fopen("/dev/ttyS0", "rw"); //открываешь порт
    fprintf(com, "%s", 0x00); //записываем строку в ..
    return 0;
}

PM MAIL WWW ICQ   Вверх
Lohmatii
Дата 6.11.2007, 03:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1. А под Рутом прогу запускаешь?
2. Порпробуй вместо "rw" O_RDWR
3. Лучше не надо fprintf для СОМа, во всех примерах что я видел был write.

С open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY) write у меня нормально пишет.
PM MAIL   Вверх
theworldcreator
Дата 6.11.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

FILE *com = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
write(com, 0x00);

Так? Я что то не где не смог найти описание функции write.
В таком виде компилятор ругается на необъявленные константы.

Код

user@debian:~/Desktop/p$ gcc new.c -o new.o
new.c: In function ‘main’:
new.c:4: error: ‘O_RDWR’ undeclared (first use in this function)
new.c:4: error: (Each undeclared identifier is reported only once
new.c:4: error: for each function it appears in.)
new.c:4: error: ‘O_NOCTTY’ undeclared (first use in this function)
new.c:4: error: ‘O_NDELAY’ undeclared (first use in this function)
new.c:4: warning: initialization makes pointer from integer without a cast

PM MAIL WWW ICQ   Вверх
Dude03
Дата 6.11.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(theworldcreator @  6.11.2007,  14:35 Найти цитируемый пост)

Так? Я что то не где не смог найти описание функции write.

=) man write
PM MAIL   Вверх
theworldcreator
Дата 6.11.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Насколько я понимаю, функция write() языка C и команда набранная в терминале - это разные вещи. На запрос "man write" говорит что это команда для посылки сообщений другим пользователям.
Цитата

write - send a message to another user


Это сообщение отредактировал(а) theworldcreator - 6.11.2007, 19:32
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 6.11.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



theworldcreator,
man 2 write
 smile  


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


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

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



Извиняюсь, был не прав.
Но ошибки с не объявленными константами остались
P.S. Вот полный код:
Код

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    FILE *com = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); //открываешь порт
    write(com, 0x00, 1); //записываем строку в ..
    return 0;
}


Добавлено через 3 минуты и 41 секунду
Вот вывод ошибок:
Код

user@debian:~/Desktop/p$ gcc new.c -o new2.o
new.c: In function ‘main’:
new.c:5: error: ‘O_RDWR’ undeclared (first use in this function)
new.c:5: error: (Each undeclared identifier is reported only once
new.c:5: error: for each function it appears in.)
new.c:5: error: ‘O_NOCTTY’ undeclared (first use in this function)
new.c:5: error: ‘O_NDELAY’ undeclared (first use in this function)
new.c:5: warning: initialization makes pointer from integer without a cast
new.c:6: warning: passing argument 1 of ‘write’ makes integer from pointer without a cast


Это сообщение отредактировал(а) theworldcreator - 6.11.2007, 21:01
PM MAIL WWW ICQ   Вверх
theworldcreator
Дата 8.11.2007, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Почитав руководства, и книжку по C, переписал немного:
Код

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>


int main(int argc, char *argv[])
{
      int buf=0x11;
      int com = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); //открываешь порт
      write(com, &buf, 1); //записываем строку в ..


    return 0;
}


Теперь warning's не выдает, только ошибке о константах: 
Код

user@debian:~/Desktop/пульт_c_prog$ gcc new.c -o new.o
new.c: In function ‘main’:
new.c:11: error: ‘O_RDWR’ undeclared (first use in this function)
new.c:11: error: (Each undeclared identifier is reported only once
new.c:11: error: for each function it appears in.)
new.c:11: error: ‘O_NOCTTY’ undeclared (first use in this function)
new.c:11: error: ‘O_NDELAY’ undeclared (first use in this function)


Добавлено @ 23:39
Если взять константы в кавычки
Код

int com = open("/dev/ttyS0", "O_RDWR | O_NOCTTY | O_NDELAY"); //открываешь порт

компилирует без ошибок, но не работает

Это сообщение отредактировал(а) theworldcreator - 8.11.2007, 23:43
PM MAIL WWW ICQ   Вверх
Lohmatii
Дата 9.11.2007, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>

в каком-то из этих хедеров все будет smile
PM MAIL   Вверх
theworldcreator
Дата 10.11.2007, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Теперь компилируется без ошибок, но все равно не работает! smile 
PM MAIL WWW ICQ   Вверх
theworldcreator
Дата 10.11.2007, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ура, заработало!
Ключевой была идея(друг посоветовал) засунуть запись единичек в бесконечный цикл, а то вольтметр не успевал снять показания.
Хотя результаты оказались несколько странные - уровень изменяется только на ножке номер 3(TxD: входной)
При записи 0x00 на  ножке появляется примерно 9 вольт, а 0x11 давало примерно 5 вольт.
Вот код;
Код

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>


int main(int argc, char *argv[])
{
      int buf=0x00;
      int com = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); //открываешь порт
      while(1){
            write(com, &buf, 1); //записываем строку в ..
      }
//    read(com, &val, 1);
    return 0;
}


Сейчас начну экспериментировать с чтением. Я так понимаю, чтобы записать на ножку 0(в физическом плане), надо замкнуть ее на ножку ground?
PM MAIL WWW ICQ   Вверх
niccom
Дата 12.11.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(theworldcreator @ 10.11.2007,  19:51)
Сейчас начну экспериментировать с чтением. Я так понимаю, чтобы записать на ножку 0(в физическом плане), надо замкнуть ее на ножку ground?




Не нужно ничего замыкать на землю.

Организуй лучше петлю связи.
RX  замкни с TX - затем пиши данные
в порт и читай их сразу же.
PM MAIL   Вверх
theworldcreator
Дата 13.11.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Замкнул по вашему совету 2 и 3 ножку.
Теперь read возвращает все время(независимо от записываемого значения)
�� ����� ���)����E�t1��֍�
(кодировка UTF-8)
Код программы:
Код

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>


int main(int argc, char *argv[])
{
      int val;
//      int i;
      int buf=0x00;
      int com = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); //открываешь порт
//      while(1){
//      for(i=0;i!=100000;i++){
      write(com, &buf, 1); //записываем строку в ..
//      }

      read(com, &val, 1);
      printf(val);
      printf("\n");

    close(com); //закрываем порт
    return 0;
}

Ошибки возвращаемые компилятором:
Код

user@debian:~/Desktop/пульт_c_prog$ gcc new.c -o new.o
new.c: In function ‘main’:
new.c:24: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast

Если передать функции printf() параметр &val, компилятор возвращает:
Код

user@debian:~/Desktop/пульт_c_prog$ gcc new.c -o new.o
new.c: In function ‘main’:
new.c:24: warning: passing argument 1 of ‘printf’ from incompatible pointer type

А сама программа:
i�
PM MAIL WWW ICQ   Вверх
JackYF
Дата 13.11.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(theworldcreator @  13.11.2007,  18:23 Найти цитируемый пост)
printf(val);

printf("%d", val);


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
theworldcreator
Дата 13.11.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Теперь все время возвращает "134514025", не зависимо от записанного в порт значения
Пробовал использовать другие типы переменной val, и записывать/считывать большее количество байт. Тип double и чтение 8 байт выдает все время "1"; тип unsigned long int и чтение 4 байт дает то же "134514025"
Имел ввиду:
Код

unsigned long int val;
write(com, &buf, 4); 
read(com, &val, 4);

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

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

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


 




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


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

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