2016-12-01 7 views
0

Я стараюсь общаться с малины pi на серийном устройстве без успеха.Малина pi, общайтесь с последовательным устройством

Я подключаю, записываю данные, но не читаю данные назад.

Последовательное устройство прекрасно работает в окнах со следующими настройками на COM-порту: Baud Rate: 9600, Parity: None, Бит: 8, Стоповый бит: 1.

Для связи я использую адаптер USB для последовательного FTDI.

Мой рабочий с код:

int set_interface_attribs(int serialPort) 
{ 
    struct termios tty; 
    if (tcgetattr(serialPort, &tty) < 0) { 
    printf("Error from tcgetattr: %s\n", strerror(errno)); 
    return -1; 
    } 
    printf("Old Serial port flags, i:%d, o:%d, c:%d\n", (int)tty.c_iflag, (int)tty.c_oflag, (int)tty.c_cflag); 
    int speed = B9600; 
    cfsetospeed(&tty, (speed_t)speed); 
    cfsetispeed(&tty, (speed_t)speed); 
    tty.c_cflag = CS8 | CLOCAL | CREAD; 
    tty.c_iflag = IGNPAR; 
    tty.c_oflag = 0; 
    tty.c_lflag = 0; 
    tcflush(serialPort, TCIFLUSH); 
    if (tcsetattr(serialPort, TCSANOW, &tty) != 0) { 
    printf("Error from tcsetattr: %s\n", strerror(errno)); 
    return -1; 
    } 
    printf("New Serial port flags, i:%d, o:%d, c:%d\n", (int)tty.c_iflag, (int)tty.c_oflag, (int)tty.c_cflag); 
    return 0; 
} 

int main(int argc, char *argv[]) { 
    printf("Start program\n"); 
    int serialPort=0; 
    //if ((serialPort=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK))<0) { 
    if ((serialPort=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY))<0) { 
    printf("Error opening port: %s\n", strerror(errno)); 
    return 1; 
    } 
    set_interface_attribs(serialPort); 
    long n; 
    char strSend[20]; 
    sprintf(strSend,"98000001%c%c", 0x0D,0x0A); 
    if ((n = write(serialPort, strSend, strlen(strSend))) < 0){ 
    perror("Error write to serialPort"); 
    return 0; 
    } 
    printf("Write (%d) chars (%s) to serialPort\n", (int)n, strSend); 
    sleep(1); 
    printf("Start reading from serialPort\n"); 
    char wData[20]; 
    memset(wData, '\0', sizeof(wData)); 
    if ((n = read(serialPort, wData, 20)) <= 0){ 
    printf("Error %d read from serialPort\n", (int)n); 
    } else{ 
    wData[n] = 0; 
    printf("Read:%d, %s\n", (int)n, wData); 
    } 
    printf("Close serialPort\n"); 
    close(serialPort); 
    return 0; 
} 

и из положить является:

Start program 
Old Serial port flags, i:4, o:0, c:2224 
New Serial port flags, i:4, o:0, c:2224 
Write (10) chars (98000001 
) to serialPort 
Start reading from serialPort 
Error 0 read from serialPort 
Close serialPort 

любой иден или предложение;

+0

Если бы я должен был догадаться, если нет ничего, что можно было бы прочитать, у вас не будет ничего в прочитанной ценности. Это 0, поэтому он переходит в ваше сообщение об ошибке. Я не очень хорошо знаком с серийными библиотеками, но у меня была очень похожая проблема по TCP. Я читал данные из сокета, у которого ничего еще не было, и мне пришлось ждать данных. – Bmo

+0

@ Подобный тест на Windows 7 ПК с точно такими же кабелями и последовательным устройством, верните эту строку 9900033200000839. (Читайте: 16, 9900033200000839) – Giannis

ответ

1

Чтение должно быть в то же время, что и запись.

Вы должны сделать бесконечный цикл. Этот курок всегда должен читать порт. Рекомендуется использовать буфер в поток (вы можете использовать lpthread.h).

Жизненный цикл:

  • Настройка последовательного порта
  • Открыть последовательный порт
  • Создать нить читать
  • Write (проверить это)
  • Закрыть последовательный порт.

С другой стороны, лучший вариант (если вы хотите протестировать свой код) - сделать перемычку на разводках RX и TX.

Итак, все, что вы пишете, сможете прочитать.