FTDI к основному программированию на C
В настоящее время я программирую 8-канальное USB-реле на Ubuntu 12.04, используя C.
Я уже создал простую программу, которая будет писать в порт, но реле не отвечает.
Это программа, которую я использовал для отправки команды на реле.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <termios.h>
//serial
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int con;
char *portname = "/dev/ttyUSB0";
con = open(portname, O_RDWR | O_NOCTTY | O_SYNC);
if(con < 0) {
printf("[ERROR] %d opening %s: %s", errno, portname, strerror (errno));
return -1;
}
int speed;
int baudrate = 9600;
int parity = 0;
switch(baudrate)
{
case 0:
case 9600:
speed = B9600;
break;
case 1:
case 19200:
speed = B19200;
break;
case 2:
case 38400:
speed = B38400;
break;
case 3:
case 57600:
speed = B57600;
break;
case 4:
case 115200:
speed = B115200;
break;
default:
printf("Baud rate out of range");
return -1;
}
struct termios tty;
memset (&tty, 0, sizeof tty);
if (tcgetattr (con, &tty) != 0)
{
return -1;
}
cfsetospeed (&tty, speed);
cfsetispeed (&tty, speed);
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars
// disable IGNBRK for mismatched speed tests; otherwise receive break
// as \000 chars
tty.c_iflag &= ~IGNBRK; // disable break processing
tty.c_lflag = 0; // no signaling chars, no echo,
// no canonical processing
tty.c_oflag = 0; // no remapping, no delays
tty.c_cc[VMIN] = 100; // read doesn't block
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
tty.c_cflag |= (CLOCAL | CREAD); // ignore modem controls,
// enable reading
tty.c_cflag &= ~(PARENB | PARODD); // shut off parity
tty.c_cflag |= parity;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CRTSCTS;
if (tcsetattr (con, TCSANOW, &tty) != 0)
{
printf("error %d from tcsetattr", errno);
return -1;
}
unsigned char wbuf[1] = {0x01};
int w = write(con, wbuf, 1);
if(w < 0) {
printf("error %d: %s", errno, strerror (errno));
return -1;
} else {
printf("%d\n", w);
}
close(con);
return 0;
}
Команда, которую я использовал в write()
это открыть первое реле света. Код возврата write()
равно 1, но реле не имеет ответа в коде, что означает, что свет не включился.
У меня вопрос, возможно ли взаимодействовать с реле без использования библиотек ftdi?