2013-09-30 3 views
0

Я использую Linux Ubuntu и пытаюсь заставить серийную связь работать. Хорошо, что я использую ...Последовательная связь под Linux ttyUSBX

Я использую малину Pi и подключаю ее через USB/последовательный адаптер с внутренним измерительным устройством (многофункциональным датчиком).

Просто чтобы прояснить, что я пытаюсь сделать:

Установление соединения betwenn Raspberry Pi и ИДУ.

Для запуска IMU приведены шаги, которые я должен выполнить.

питания на последовательности:

(a) power-on. 
(b) Wait 800ms. 
(c) Wait until NOT_READY bit goes to 0. NOT_READY is GLOB_CMD[3Eh]'s bit[10]. 
TXdata={0x3E,0x00,0x0d}. /* GLOB_CMD read command */ 
TXdata={0x3E,MSByte,LSByte,0x0d}. /* get response */ 
Confirm NOT_READY bit. 
When NOT_READY becomes 0, it ends. Otherwise , please repeat (c). 
(d) Confirm HARD_ERR bits. HARD_ERR is DIAG_STAT[3Ch]'s bit[6:5]. 
TXdata={0x3C,0x00,0x0d}. /* DIAG_STAT read command */ 
TXdata={0x3C,MSByte,LSByte,0x0d}. /* get response */ 
Confirm HARD_ERR is 00. 
If HARD_ERR is 00, the IMU is OK. Otherwise, the IMU is faulty. 

Регистрация читать и писать:

[Read Example] 
To read a 16bit-data from a register(addr=0x38). 
TXdata={0x38,0x00,0x0d}. /* command */ 
RXdata={0x38,0x04,0x04,0x0d} /* response */ 
0x04 in 2nd byte of RXdata is Configuration mode. 
0x04 in 3rd byte of RXdata is TAP=16. 
Please note that read data unit is 16bit, and Most Significant Byte first. 
------------------------------------------------------------- 
[Write Example] 
To write a 8bit-data into a register(addr=0x39). 
TXdata={0xB9,0x01,0x0d}. /* command */ 
RXdata= w/o response 
By sending this command, the IMU moves to Sampling mode. 
Please note that write data unit is 8bit. 

На моей Linux Ubuntu есть ttyUSB0 устройство предоставляется после подключения ИДУ.

Итак, я попытался установить Baudrate, Databits, Stopbits, Parity, flowcontrol. Сначала через stty-команду, позже с простым C++-кодом.

Я использую это C++ - код:

#include <stdio.h> 
#include <string.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <termios.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <cstdlib> 

void SleepMs(int); 

int main(int argc, char** argv) 
{ 
    int fd; // port file descriptor 
    char port[20] = "/dev/ttyUSB0"; // port to connect to 
    fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY); // connect to port 
    if(fd == -1) 
    { 
     printf("Error while opening the port.\n"); 
     return 1; 
    } 
    printf("Port opened successfully.\n"); 

    fcntl(fd, F_SETOWN, getpid()); 
    struct termios settings; 
    tcgetattr(fd, &settings); 
    settings.c_cflag &= ~(CBAUD | CSIZE | CREAD); 
    settings.c_cflag |= B230400; 
    settings.c_cflag |= CS8; 


    tcflush(fd, TCIFLUSH); 
    tcsetattr(fd, TCSANOW, &settings); // apply the settings 

    int len = 7; 
    unsigned char bytes[len]; 
    bytes[0] = 0x3E; 
    bytes[1] = 0x00; 
    bytes[2] = 0x0D; 
    bytes[3] = 0x3E; 
    bytes[4] = 0x00; 
    bytes[5] = 0x00; 
    bytes[6] = 0x0D; 

    int wr = write(fd, bytes, len); 
    unsigned char answer[32]; 
    SleepMs(350); 
    int rd = -1; 
    int i; 

    while (rd==-1) 
    { 

    if(wr != 7) 
    { 
     printf("Error while sending!\n"); 
    } 


    for(i=0; i<len; i++) 
    { 
     printf("%X sent\n", (unsigned int)bytes[i]); 
      SleepMs(350); 
    } 
    printf("\n"); 
    printf("%d bytes sent.\n", wr); 
    printf("\n"); 
    printf("Trying to read...\n"); 
    printf("\n"); 
    rd = read(fd, answer, 32); 
    SleepMs(350); 

     printf("%d\n", rd); 

    for(i=0; i<rd; i++) 
    { 
     printf("%X ", (unsigned int)answer[i]); 
    } 
    printf("\n\n"); 

    } 

    close(fd); 
    return 0; 
} 

void SleepMs(int ms) { 
usleep(ms*1000); //convert to microseconds 
return; 
} 

Если я запустить программу, она говорит мне: «Порт открыт успешно» и записывает данный байт в программе. Но он не получает данных.

Передача 0x3E 0x00 0x0D для активации команды чтения GLOB_CMD. Я должен подтвердить «Не готов» -Бит 0, но я не получаю ответ с моим последовательным подключением.

Так вот, где мне нужна ваша помощь, может быть, у кого-то есть подсказка для меня. Как я могу нормально общаться с моим IMU или через последовательную связь с Linux?

ответ

0

int wr = write (fd, bytes, len);

Ваш байт массив должен только быть длиной 3 байта, так Len должно быть 3. (The 0x3e является то, что ИДУ должен ответить, так что это не должно быть в вашей программе, кроме случаев, когда проверка ответа.) Когда вы читаете, вы должны только читать ожидаемый размер ответа (len = 4). Вам не нужно спать после письменной форме, и, вероятно, после чтения.

Смежные вопросы