Добрый день. Первая программа на С++, ругайте только не сильно. Задача вроде простая, есть датчик температуры с выходом RS485 порта я его через конвертер подключил к RS232. При загрузки датчика в консоль дает ответ «Ready». По документации датчик отвечает на запросы, не сыпет данные в консоль постоянно. Запрос состоит из шестнадцатеричного кода [старт бит] ..... [стоп бит] (набор битов есть). Я написал программу
int fd;
int k;
std::vector<uint8_t> wr;
uint8_t buf[512] = { 0 };
struct termios oldtio, newtio;
int open_port();
int main(int argc,char **argv){
fd = open_port();
wr.clear();
wr.insert(wr.begin(), 0x56);
wr.push_back(0x65);
wr.push_back(0x01);
wr.push_back(0x02);
wr.push_back(0x98);
wr.push_back(0x56);
/*WRITE*/
int m;
for (m=0; m<=wr.size()-1; m++){
write(fd, &wr[m], wr.size());
printf(" for= %x \n", wr[m]);
}
/*READ*/
while(k!=-1) {
k=read(fd,buf,512);
printf(" k= %d \n",k);
printf(" buf= %x \n",buf[0]);
sleep(1);
}
close(fd);
return(0);
}
int open_port(){
struct sigaction saio;
fd = open(/dev/ttyS0, O_RDWR | O_NOCTTY |O_NONBLOCK);
fcntl(fd, F_SETOWN, getpid());
fcntl(fd, F_SETFL, O_ASYNC|O_NONBLOCK|fcntl(fd, F_GETFL));
tcgetattr(fd,&oldtio); /* save current port settings */
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
newtio.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
| INLCR | IGNCR | ICRNL | IXON);
newtio.c_oflag &= ~OPOST;
newtio.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
newtio.c_cflag &= ~(CSIZE | PARENB);
newtio.c_cflag |= CS8;
if((tcsetattr(fd,TCSANOW,&newtio)) != 0){
printf("Error setattr\n");
exit(1);
}
return (fd);
}
Возможно я не правильно даже посылаю пакет, а может считываю не правильно. Если есть у кого опыт поделитесь!
Функцию open_port() нашел в интернете.
include не стал перечислять, компиляция проходит.