Я пытаюсь отправить данные с моей доски 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-процентной точности.
Вам не нужна библиотека для связи через последовательный порт в Linux. Вы идете не так. Вот хороший ресурс: https://www.cmrr.umn.edu/~strupp/serial.html –
@ AndrejsCainikovs. Я недавно нашел это, но не выполнил его, но обязательно попробую, спасибо за ссылку. –
Кроме того, эта последовательность 'LS.WriteChar (() - LS.Close() - LS.Open()' действительно странная. – linuxfan