C код для чтения UART можно прочитать на MacOS, а не на Ubuntu RedPitaya - PullRequest
0 голосов
/ 11 марта 2020

Подобный вопрос к 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
...