2017-02-10 2 views
0

Я пытаюсь отправить данные с моей доски BeagleBone на Arduino Uno. Скорость передачи, которую я выбрал, составляет 300. Я использую библиотеку serialib, которая находится здесь: http://serialib.free.fr/html/classserialib.html#ac8988727fef8e5d86c9eced17876f609 вы можете прокрутить весь путь до нижней части, чтобы просмотреть два файла (serialib.h и serialib.cpp), однако я опубликовал основные фрагменты здесь тоже. Я прочитал несколько обзоров, в которых говорилось, что эта библиотека не является надежной, но я сначала хочу проверить свой код, прежде чем действительно подозревать что-нибудь еще.C++ последовательная связь в Linux

Это программа, которую я написал в C++ на моем BeagleBone:

#include <iostream> 
#include "serialib.h" 

#ifdef __linux__ 
#define  DEVICE_PORT "/dev/ttyO1" 
#endif 

using namespace std; 
int main() 
{ 
    serialib LS; //the main class to access 
    int Ret; 

    Ret= LS.Open(DEVICE_PORT,300); 
    if (Ret!=1) 
    { 
     cout<<"cant open port\n"; 
     return 0; 
    } 
    else{cout<<"port now open \n";} 

    string xval="650X450Y"; 
    for(int i=0;i<500;i++)//send xval 500 times 
    { 
     for(int j=0;j<xval.length();j++)//send each character separately 
     { 
      Ret=LS.WriteChar(xval[j]); 
      LS.Close(); 
      LS.Open(DEVICE_PORT,300); 
     } 
     if (Ret!=1){cout<<"cannot write\n";} 
     else{cout<<"done writing\n";} 
    } 
    LS.Close(); 
    cout<<"Transmission complete\n"; 
} 

Мой код на Arduino Uno выглядит следующим образом:

#include <SoftwareSerial.h> 
SoftwareSerial uart(10,11); 
void setup() { 
// put your setup code here, to run once: 
Serial.begin(9600); //baud rate for Serial communication 
uart.begin(300); 
} 
char x; 
String data=""; 

void loop() 
{ 
if(uart.available()>0)//check if data is coming in 
{ 
    while(uart.available()) 
    { 
    x=uart.read();//read the incoming byte 
    data+=x;//append the string with incoming bytes 
    } 

    if(x=='Y')//received all the bits 
    { 
    Serial.println(data); //display received information 
    } 
} 
} 

C++ - я первое открытие моих УАПП порт на BeagleBone и отправку символа «650X450Y» по символу, который повторяется 500 раз, чтобы проверить, надежна ли моя система связи или нет. Поскольку вы можете видеть, что в цикле «for» я закрываю и открываю этот порт после отправки каждого символа, потому что без этого он отправляет довольно много неверных данных, и если этот цикл «для» очень большой, процесс записи даже останавливается (не знаю, почему он ведет себя так, как это), таким образом, после закрытия и открытия этого порта каждый раз, мне удалось значительно уменьшить ошибки, но есть еще несколько ошибок:

  • Я послал эту строку в 500 раз, но один образец Я получил на Uno «660X450Y», неправильное значение.
  • Примерно в 2-3 раза из 500, я получаю «650X450Y650X450Y650X450Y», то есть повторения, это определенно не длина строки, а затем, как она может отправить эти данные ?.

Остальные строки, которые я получил на Uno, являются совершенными.

На Uno, как вы можете видеть, что я читаю символ по символу и добавляю его в свою строку с именем data и распечатываю эти данные, как только будет обнаружен байт «Y», который обозначает конец строки. Я ранее использовал функцию WriteString() в моем коде на C++, но это привело к ряду ошибок. Код, который я предоставил, является самым близким, за последние несколько дней я зашел за последние несколько дней, чтобы сделать эту систему на 100% надежной и надежной после многих отладки, однако я действительно не уверен, почему система все еще не на 100%.

Я видел исходный код обоих файлов в библиотеке и наблюдал функцию WriteChar (char Byte), которая определена в строке 210 в serialib.cpp (ссылка уже приведена выше), и я вижу, что это функция, передающая символы:

if (write(fd,&Byte,1)!=1)  // Write the char 
    return -1;  // Error while writting 
return 1; // Write operation successfull 

Я не вижу ничего плохого в этой функции, то почему я не могу получить данные с 100% точностью, что-нибудь неправильно в обоих моих исходных кодов или любой из них ?, я должен выбрать другую последовательную библиотеку ?, в случае, если я выберу другие библиотеки, и я до сих пор не получаю своих результатов, тогда я думаю, что мне, возможно, придется передавать эту информацию беспроводным способом, например, используя модули bluetooth. Если у кого-то есть предложения или улучшения по этой проблеме, тогда дайте мне знать :), до тех пор я попробую другие методы, чтобы достичь 100-процентной точности.

+0

Вам не нужна библиотека для связи через последовательный порт в Linux. Вы идете не так. Вот хороший ресурс: https://www.cmrr.umn.edu/~strupp/serial.html –

+0

@ AndrejsCainikovs. Я недавно нашел это, но не выполнил его, но обязательно попробую, спасибо за ссылку. –

+1

Кроме того, эта последовательность 'LS.WriteChar (() - LS.Close() - LS.Open()' действительно странная. – linuxfan

ответ

0

Проще всего проверить, можно ли быстро сделать это на терминале linux, и для этого не используется библиотека.

  1. Установите скорость передачи данных до 300 для UART1 (Запущенной -F/DEV/ttyO1 сырой & Запущенной -F/DEV/ttyO1 300)

  2. Вы можете отправить данные в UART1 просто написав (или чтение) к файлу устройства для UART1, который находится в вашем случае/разработчика/ttyO1

Writing: эхо "650X450Y">/разработчика/ttyO1

Reading: кошка/DEV/ttyO1

Если вы хотите сделать это в коде C, вы можете использовать функции syscall для открытия/чтения/записи/закрытия.

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