Здравствуйте. Являюсь новичком в программировании для встраиваемых систем. Долгое время пытаюсь заставить работать 485 протокол на Орион 28.
#include <sys/types.h>
#include <sys/stat.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include "crc16.h"
#define BAUDRATE B9600
#define DEVICE "/dev/ttySP0"
main(){
printf("hello");
int fd;
struct termios opt;
struct timespec req, rem;
fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
if ( fd < 0 ){
perror(DEVICE);
}
char txBuffer[8] = { 0x01, 0x04, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00 };
char rxBuffer[100];
unsigned short crc16 = CRC16(reinterpret_cast<const unsigned char*>(txBuffer), 6);
txBuffer [6] = (crc16&0x00ff);
txBuffer [7] = ((crc16&0xff00)>>8);
opt.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
opt.c_iflag = IGNPAR;
opt.c_lflag = 0;
opt.c_oflag = 0;
opt.c_cc[VMIN] = 0; //Minimum bytes available
opt.c_cc[VTIME] = 0;
tcflush(fd, TCIFLUSH);
tcsetattr (fd, TCSANOW, &opt);
int r = 0;
while(r<=0){
//printf("Sending...\n");
int sended = write(fd, &txBuffer, 8);
printf ("Sended = %d\n", sended);
req.tv_sec = 0;
req.tv_nsec = 100 * 1000000;
nanosleep(&req, &rem);
//opt.c_cflag |= CREAD;
//tcsetattr (fd, TCSANOW, &opt);
r = read(fd, &rxBuffer, 1);
//opt.c_cflag &= ~CREAD;
//tcsetattr (fd, TCSANOW, &opt);
//printf("Reading...\n");
printf("Readed = %d\n", r);
//for (int i = 0; i < r; i++) {
// printf("%c", data);
//}
}
}
Вот этот код я пытаюсь запустить. Исхожу из того, что при одновременно-включенном приемнике и передатчике, я должен считать с входного буфера то что и передал. Этого не происходит или, по крайней мере, я не правильно работаю с устройством. Также пытался посылать данные в реальное устройство, оно их принимает и отвечает, но ответа снова не вижу... Перепробовал кучу комбинаций. Код выше взят из примеров этого форума от Danila. С отправкой все нормально происходит, с приемом - нет. Помогите, в чем я ошибаюсь.
P.S.
Глубоко в дебри Линукс я пока не забирался, исхожу из того, что ничего сверэкстра не должно быть... Опыт программирования 485 интерфейса имел.
PPS
Былобы супер получить информацию о том, как работать с 485 протоколом в асинхронном режиме.
Спасибо.