LINUX.ORG.RU

RS232


0

0

Hi all!

Возникла такая проблема: есть девай, который подключается к ком-порту и шлёт на него всякую муру. Параметры протокола: 8 бит без бита парности и с 1 стоп битом, 19200бод.

Одно сообщение состоит: DLE STX <сообщение> <2 байта контрольной суммы> DLE ETX

Вот собственно програмка из SERIAL-PROGRAMMING HOWTO:

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #include <stdio.h>

#define BAUDRATE B19200 #define MODEMDEVICE "/dev/cuaa0" #define _POSIX_SOURCE 1 #define FALSE 0 #define TRUE 1

volatile int STOP=FALSE;

int main() { struct termios oldtio, newtio; char buf[255]; int fd, res, k;

fd = open( MODEMDEVICE, O_RDWR | O_NOCTTY ); if (fd <0) {perror(MODEMDEVICE); exit(-1); }

tcgetattr(fd, &oldtio); bzero(&newtio, sizeof(newtio)); newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR | ICRNL; newtio.c_oflag = 0; newtio.c_lflag = ICANON;

newtio.c_cc[VINTR] = 0; /* Ctrl-c */ newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */ newtio.c_cc[VERASE] = 0; /* del */ newtio.c_cc[VKILL] = 0; /* @ */ newtio.c_cc[VEOF] = 4; /* Ctrl-d */ newtio.c_cc[VTIME] = 0; /* inter-character timer unused */ newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */ // newtio.c_cc[VSWTC] = 0; /* '\0' */ newtio.c_cc[VSTART] = 0; /* Ctrl-q */ newtio.c_cc[VSTOP] = 0; /* Ctrl-s */ newtio.c_cc[VSUSP] = 0; /* Ctrl-z */ newtio.c_cc[VEOL] = 0; /* '\0' */ newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */ newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */ newtio.c_cc[VWERASE] = 0; /* Ctrl-w */ newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */ newtio.c_cc[VEOL2] = 0; /* '\0' */

tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio);

while (STOP==FALSE) { res = read(fd, buf, 255); buf[res]=0; for(k=0; k<res; k++) printf("%d ", buf[k]); printf("\n"); }

tcsetattr(fd, TCSANOW, &oldtio); }

Вот то что я получаю в результате выполнения:

-128 96 32 26 -64 -64 32 -96 -15 -128 -128 -96 -24 -15 103 10 -128 96 -56 -64 -15 -64 -64 32 -96 -15 -128 -128 -96 -24 -15 103 10 -128 96 -56 -64 -15 -64 -64 32 -96 -15 -128 -128 -96 -24 -15 103 10 -128 96 -56 -64 -15 -64 -64 -24 32 -96 -15 -128 -128 -96 -24 -15 103 10 -128 96 -56 -104 -15 -64 -64 32 -96 -15 -128 -128 -96 -24 -15 103 10 -128 96 -56 -64 -15 -64 -64 32 -96 -15 -128 -128 -96 -24 -15 103 10 -128 96 -56 -64 -15 -64 -64 32 -96 -15 -128 -128 -96 -24 -15 103 10

Десятичный код DLE = 16 В выводе я его найти не могу :) Чего я не так делаю ? Или это траблы с девайсом ?

С уважением, Владимир


Я бы переделал некоторые куски кода примерно так:

#define MODEMDEVICE "/dev/ttyS0"

Вместо установки огромного количества флагов в структуре newtio можно просто сделать следующее:

cfmakerow( &newtio ); newtio.c_cflag = BAUDRATE | CS8 | CREAD; newtio.c_cflag &= ~CSTOPB; /* 1 стоп бит */ newtio.c_cflag &= ~CPARENB; /* без проверки четности */

Далее либо: newtio.c_cflag &= ~CRTSCTS; /* не использовать аппаратную синхронизацию */

Либо: newtio.c_cflag &= ~CRTSCTS; /* использовать аппаратную синхронизацию */

AVI
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.