Подобный вопрос к RedPitaya: нет данных в UART - невозможно прочитать буфер (нет ответа).
У меня есть устройство, с которым я разговариваю через UART. Код ниже отлично работает на MacOS (Sierra, MBP). Сейчас я пытаюсь перенести его на RedPitaya под управлением Ubuntu 16.04.03. Передача работает нормально, но RP не может прочитать ответ. Оба компилируются с использованием g cc gnu99. Кто-нибудь может указать мне правильное направление?
На Ма c:
COMMS_DEBUG(TX) Command: :K1
COMMS_DEBUG(TX): 4 bytes written
COMMS_DEBUG(RX): 1 Bytes recieved, =
На RP:
COMMS_DEBUG(TX) Command: :K1
COMMS_DEBUG(TX): 4 bytes written
COMMS_DEBUG(RX): -1 Bytes recieved,
Соответствующий код:
struct response
{
int flag; // Response flag, negative = error
char data[10]; // data
};
struct response *RX(int port)
{
char read_buffer[9];
int bytes_read = 0;
static struct response this_response = {-1};
strcpy(this_response.data, "\0"); // flush previous read
bytes_read = read(port, &read_buffer, 8); /* Read the data */
tcflush(port, TCIFLUSH); /* Flush RX buffer */
if (read_buffer[0] == '=' || read_buffer[0] == '!') //valid response from mount
this_response.flag = 1;
strcpy(this_response.data, read_buffer);
if (verbose)
printf("COMMS_DEBUG(RX): %i Bytes recieved, %s\n", bytes_read, read_buffer);
return &this_response;
}
struct response *send_Command(char command[])
{
int retries = 0;
struct response *resp;
SEND:
TX(port, command);
usleep(30000); // this gives the device time to repsond
resp = RX(port);
return resp;
}
Настройки порта:
int fd = open(PORT, O_RDWR | O_NOCTTY | O_NDELAY);
struct termios SerialPortSettings;
tcgetattr(fd, &SerialPortSettings);
cfsetispeed(&SerialPortSettings, B9600);
cfsetospeed(&SerialPortSettings, B9600);
SerialPortSettings.c_cflag &= ~PARENB;
SerialPortSettings.c_cflag &= ~CSTOPB;
SerialPortSettings.c_cflag &= ~CSIZE;
SerialPortSettings.c_cflag |= CS8;
SerialPortSettings.c_cflag &= ~CRTSCTS;
SerialPortSettings.c_cflag |= CREAD | CLOCAL;
SerialPortSettings.c_iflag &= ~(IXON | IXOFF | IXANY);
SerialPortSettings.c_iflag &= (ICANON | ECHO | ECHOE | ISIG);
SerialPortSettings.c_oflag &= ~OPOST;
SerialPortSettings.c_cc[VMIN] = 8;
SerialPortSettings.c_cc[VTIME] = 0;
tcsetattr(fd, TCSANOW, &SerialPortSettings