Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Отладочные платы » SK-iMX53
Проблемы с программирование COM порта на Си
Alistrat
Добавлено 06.09.2013 10:27
0
Сообщение: 1
Alistrat
0

Пункты: 1122
Регистрация: 07.11.2012

Добрый день.
Плата V2, с монитором SK-ATM0700D4-Plug. Работаю с платой с помощью USB-клавиатуры. Программу заливаю по ftp.
К COM-порту подключен кабель, на свободном конце перемычка прием-передача.
На Си написана следующая программа, для передачи двух пакетов данных:
Код

#include <stdio.h> /*ввод-вывод*/
#include <string.h> /*строковые функции*/
#include <unistd.h> /*стандартные функции UNIX*/
#include <fcntl.h> /*управление файлами*/
#include <termios.h> /*управление POSIX терминалом*/
#include <stdint.h> /*для типа переменных unit8_t*/
/*функция открытия порта*/
int open_port(void)
{
int fd;
fd=open("/dev/ttymxc0",O_RDWR|O_NOCTTY);
if (fd==-1)
printf("\nopen port error\n");
else
{
/*настройка порта*/
struct termios options;
tcgetattr(fd,&options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag |= PARENB;
options.c_cflag |= PARODD;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &= ~(INPCK | ISTRIP);
options.c_iflag &= ~(IXON | IXOFF | IXANY);
options.c_oflag &= ~OPOST;
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 1;
tcsetattr(fd,TCSAFLUSH,&options);
}
return (fd);
}

main (void)
{
FILE *fpout;
int i;
int fd;
int n;
uint8_t outb[16];
uint8_t inb[16]={0xf0,0xe1,0xd2,0xc3,0xb4,0xa5,0x96,0x87,0x78,0x69,0x5a,0x4b,0x3c,0x2d,0x1e,0x0f};
uint8_t outb1[16];
uint8_t inb1[16]={0x0f,0x1e,0x2d,0x3c,0x4b,0x5a,0x69,0x78,0x87,0x96,0xa5,0xb4,0xc3,0xd2,0xe1,0xf0};

fpout=fopen("fileout","w"); /*создание выходного файла*/

sleep(10);

printf("\n"); /*вывод на экран выходного массива, сейчас там мусор*/
for (i=0;i<16;i++)
printf(" %x ",outb[i]);
printf("\n\n");

fd=open_port(); /*открытие порта*/
if (fd!=-1)
{
sleep(1);
n=write(fd,inb,16); /*запись в порт*/
if (n<1)
printf("\nwritting in port error\n");
else
{
sleep(1);
n=read(fd,outb,16); /*чтение из порта*/
if (n<1)
printf("\nreading from port error\n");
else
{
for (i=0;i<16;i++)
n=fprintf(fpout," %x ",outb[i]); /*запись в выходной файл*/
if (n<1)
printf("\nwriting in output file error\n");
else
{
printf("\n"); /*вывод на экран выходного массива, сейчас там значения полученные из порта*/
for (i=0;i<16;i++)
printf(" %x ",outb[i]);
printf("\n\n");
}
}
}
}
close(fd);

printf("\n"); /*вывод на экран выходного массива1, сейчас там мусор*/
for (i=0;i<16;i++)
printf(" %x ",outb1[i]);
printf("\n\n");

fd=open_port(); /*открытие порта*/
if (fd!=-1)
{
sleep(1);
n=write(fd,inb1,16); /*запись в порт*/
if (n<1)
printf("\nwritting in port error\n");
else
{
sleep(1);
n=read(fd,outb1,16); /*чтение из порта*/
if (n<1)
printf("\nreading from port error\n");
else
{
for (i=0;i<16;i++)
n=fprintf(fpout," %x ",outb1[i]); /*запись в выходной файл*/
if (n<1)
printf("\nwriting in output file error\n");
else
{
printf("\n"); /*вывод на экран выходного массива, сейчас там значения полученные из порта*/
for (i=0;i<16;i++)
printf(" %x ",outb1[i]);
printf("\n\n");
}
}
}
}
close(fd);
fclose(fpout);
return (0);
}

В ответ на выполнение программы получаю:
Код


f4 4f 74 b7 60 89 4 8 f4 9f 4 8 1 0 0 0

f0 e1 d2 c3 b4 a5 96 87 78 69 5a 4b 3c 2d 1e f

81 89 4 8 ff ff ff ff 96 31 5d b7 f4 4f 74 b7

reading from port error


Причем, первая передача-прием данных происходит корректно, только при отключенной USB-клавиатуре (если оставить включенной в выходные массивы записывается тот же мусор, с измененными первыми двумя байтами, но они оба читаются из порта).
Помогите, пожалуйста, разобраться со следющими пунктами:
1) В чем причина некорректной передачи данных при подключенной клавиатуре?
2) Почему COM-порт читает только первый пакет данных при отключенной USB-клавиатуре?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 06.09.2013 10:51 Редактировалось 06.09.2013 11:01 Сообщение: 2
sasamy
4.71

Пункты: 83540
Регистрация: 14.08.2009
Цитата

fd=open("/dev/ttymxc0",O_RDWR|O_NOCTTY);


Вам надо отключить консоль с этого порта. В командной строке ядра убрать
console=ttymxc0,115200

и закоментить getty c ttymxc0 в /etc/inittab

# Put a getty on the serial port
# ttymxc0::respawn:/sbin/getty -L ttymxc0 115200 vt100 # GENERIC_SERIAL

иначе в этот порт будет постоянно валиться "мусор"
Спуститься к концу Подняться к началу
Персональная информация
Alistrat
Добавлено 11.09.2013 13:14 Сообщение: 3
Alistrat
0

Пункты: 1122
Регистрация: 07.11.2012
Прошу прощения за, наверное, глупый вопрос, но как изменить командную строку ядра?
Спуститься к концу Подняться к началу
Персональная информация
titan83
Добавлено 11.09.2013 14:24 Сообщение: 4
titan83
3

Пункты: 3141
Регистрация: 16.12.2012
Цитата
Прошу прощения за, наверное, глупый вопрос, но как изменить командную строку ядра?

самое простое - при конфигурировании ядра (make menuconfig или make linux-menuconfig в buildroot'е) в разделе Boot options/Kernel command line type выбираете как ядро будет получать командную строку, вам разумно сделать там Always use default..., потом на строку выше отредактировать командную строку, как вам посоветовал sasamy
Спуститься к концу Подняться к началу
Персональная информация
Alistrat
Добавлено 11.09.2013 16:37 Сообщение: 5
Alistrat
0

Пункты: 1122
Регистрация: 07.11.2012
Спасибо за помощь всем:)
Спуститься к концу Подняться к началу
Персональная информация
Alistrat
Добавлено 23.09.2013 11:41 Сообщение: 6
Alistrat
0

Пункты: 1122
Регистрация: 07.11.2012
Удалил в командной строке console=ttymxc0,11520, перепрошился - загрузка платы происходит до строки NET: registered protokol family 17, на этой строке все останавливается, ethernet подключаю - фтп не доступен. В чем беда?
Спуститься к концу Подняться к началу
Персональная информация
lexx666
Добавлено 23.09.2013 12:50 Сообщение: 7
lexx666
3.83

Пункты: 11780
Регистрация: 28.07.2011
Пол: Мужчина
Из: Барнаул
Я б на вашем месте всё таки использовал другой UART, подключив к нему только приёмо-передатчик RS232.
Спуститься к концу Подняться к началу
Персональная информация
Alistrat
Добавлено 25.09.2013 10:18 Сообщение: 8
Alistrat
0

Пункты: 1122
Регистрация: 07.11.2012
lexx666, можете вкратце объяснить, как это сделать, на данной плате (я тут читал про какие то особенности связанные с уровнями напряжений), или подкинуть пару ссылок, где можно было бы просвятиться по данному вопросу?
Спуститься к концу Подняться к началу
Персональная информация
lexx666
Добавлено 25.09.2013 11:34 Сообщение: 9
lexx666
3.83

Пункты: 11780
Регистрация: 28.07.2011
Пол: Мужчина
Из: Барнаул
гугл
rs232 ttl
rs232 usb
max232
и т.д.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Отладочные платы » SK-iMX53