Хочу записать в com-порт и прочитать из него некоторое количество байт.
С записью проблем вроде бы нет, write
ошибок не возвращает. А вот с чтением проблема: на read
виснет. Tо есть в порт ничего не приходит, но как такое может быть если до этого я сделал write
? Или это как то по другому работает?
int main(int argc, char* argv[])
{
int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY /*| O_NDELAY*/);
if (fd == -1)
{
std::cout << " Unable to open /dev/ttyS0" << std::endl;
return 0;
}
// configure
termios attr_old;
termios attr;
memset( &attr_old, 0, sizeof(termios) );
memset( &attr, 0, sizeof(termios) );
if ( tcgetattr(fd, &attr_old) )
{
std::cout << "Error: " << strerror(errno) << " from tcgetattr" << std::endl;
return 0;
}
attr = attr_old;
//Baud rate
cfsetospeed(&attr, B9600);
cfsetispeed(&attr, B9600);
attr.c_cflag &= ~PARENB; // Make 8n1
attr.c_cflag &= ~CSTOPB;
attr.c_cflag &= ~CSIZE;
attr.c_cflag |= CS8;
attr.c_cflag |= CREAD | CLOCAL; // turn on READ & ignore ctrl lines
attr.c_cflag &= ~CRTSCTS; // no flow control
attr.c_cc[VMIN] = 1; // read doesn't block
attr.c_cc[VTIME] = 5; // 0.5 seconds read timeout
// Make raw
cfmakeraw(&attr);
// Flush Port, then applies attributes
tcflush( fd, TCIFLUSH );
if ( tcsetattr ( fd, TCSANOW, &attr ) != 0)
{
std::cout << "Error: " << strerror(errno) << " from tcsetattr" << std::endl;
return 0;
}
//Write
int nw = write(fd, "A\r", 2);
if ( nw < 0)
{
std::cout << "Error: " << strerror(errno) << " from write" << std::endl;
return 0;
}
//Read
char buff[32];
memset( &buff, '\0', sizeof(buff) );
int nr = 0;
int spot = 0;
char ch = '\0';
do
{
nr = read(fd, &ch, 1);
if (nr < 0 )
{
int er = errno;
std::cout << "Error: " << er << " " << strerror(er) << " from read" << std::endl;
return 0;
}
sprintf(&buff[spot], "%c", ch);
spot += nr;
}
while( ch != '\r' && nr > 0 );
close(fd);
return 0;
}
На порту есть устройство, которое ответит?
Гарантированно из порта можно прочитать после записи (то, что послали), если на него поставить перемычку TX-RX (замкнуть 2-3 контакты разъёма DB-9)
Виртуальный выделенный сервер (VDS) становится отличным выбором
Только недавно начал изучать Java и решил сделать простенькую игру по угадыванию буквы, но столкнулся с небольшой проблемой, подскажите, в чём...
У меня есть Spring MVC приложение, когда я заменяю @GetMapping("/addPhoto") на RequestMapping(name = "/addPhoto",method = RequestMethodGET) у мене просто не стратует программа
Можно ли установить для фрейма другой менеджер компановки? Например: