Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: сом порт читает только эхо выданного в порт  (Прочитано 724 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн santore

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
задача выдать в сом порт 8 байт и считать из порта, приходящие через 100 мс, 12 байтов
сом порт принимает только эхо выданного
/*mn.c*/

#include <stdio.h>   
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h>   
#include <errno.h>   
#include <termios.h>
#include <sys/ioctl.h>

int main(int ARGC, char *ARGV[])
{
 int mainfd=0;
struct termios options;

mainfd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);

 if (mainfd == -1)
   {
   fprintf(stderr, "Невозможно открыть /dev/ttyUSB0 - %s\n",strerror(errno));
   return -1;
   }

 fcntl(mainfd, F_SETFL, FNDELAY);
 tcgetattr(mainfd, &options);
 cfsetispeed(&options, B9600);
 cfsetospeed(&options, B9600);
 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 | ISIG);

 tcsetattr(mainfd, TCSANOW, &options);

int i;
unsigned char bufWR[8] = {0x80,0x58,0xF1,0x00,0x01,0x18,0x01,0xE2};
unsigned char bufRD[16] = {0};

ioctl(mainfd, TIOCCBRK, 0); //установить линию в единицу
usleep(300000); //на 300 мс
ioctl(mainfd, TIOCSBRK, 0); //сброс линии в ноль
usleep(25000); //на 25 мс
  ioctl(mainfd, TIOCCBRK, 0); //установить линию в единицу
usleep(25000); //на 25 мс

for(i=0; i<8; i++)
{
write(mainfd, &bufWR[i], 1); //запись в порт 8 байт
usleep(10000); //задержка на 10 мс

usleep(80000);
 
read(mainfd, bufRD, 12); //чтение из порта 12 байт

int m;
printf("Записано в порт:");
for (m=0; m < 8; m++)
{
printf(" %x ", bufWR[m]);
}
printf("\n");

int k;
printf("Получено из порта:");
for (k=0; k < 15; k++)
{
printf(" %x ", bufRD[k]);
}
printf("\n");

close(mainfd);

}
d630@d630:~$ ./mn
Записано в порт: 80  58  f1  0  1  18  1  e2
Получено из порта: 0  80  58  f1  0  1  18  1  e2  0  0  0  0  0  0
d630@d630:~$
скриншот с осциллографа
(Нажмите, чтобы показать/скрыть)

решено:
задержка перед приемом должна быть не менее реальной задержки (в данном случае равной 100 мс), в программе было выставлено 80 мс, изменил на 100 мс и все заработало
« Последнее редактирование: 29 Июня 2015, 22:48:40 от santore »

 

Страница сгенерирована за 0.016 секунд. Запросов: 20.