我正在尝试从我的BeagleBone黑板发送数据到Arduino Uno。我选择的波特率是300。我使用的是位于这里的序列化库:http://serialib.free.fr/html/classserialib.html#ac8988727fef8e5d86c9eced17876f609 --您可以一直滚动到底部--查看这两个文件(erialib.h和serialib.cpp),但是我也在这里发布了主片段。我读过一些评论,说这个库不可靠,但是我首先想检查我的代码,然后才真正怀疑其他东西。
这是我用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上打开我的UART端口,并按字符发送字符串"650X450Y“,该字符串被重复了500次,以查看我的通信系统是否健壮。您可以看到,在“for”循环中,我在发送每个字符之后关闭和打开这个端口,因为没有它,它会发送大量错误的数据,如果这个“for”循环非常大,那么写入过程甚至停止(不确定为什么会这样),因此每次关闭和打开这个端口之后,我成功地减少了错误,但是仍然有一些错误:
我在Uno上收到的其他字符串都很完美。
在Uno上,您可以看到,我正在逐字符读取,并将其附加到名为data的字符串中,并在检测到字节'Y‘时打印出该数据,该字节表示字符串的结尾。我以前在我的WriteString()代码中使用过C++ ()函数--但是这会导致一些错误,我提供的代码是我在过去几天里为使这个系统100%的可靠和健壮而在经过大量调试后所做的最接近的代码,但是我真的不知道为什么系统仍然不是100%。
我在库中看到了这两个文件的源代码,并观察到了WriteChar(Characters)函数,它定义在serialib.cpp的第210行(上面已经提供了链接),我看到这是传递字符的函数:
if (write(fd,&Byte,1)!=1) // Write the char
return -1; // Error while writting
return 1; // Write operation successfull我不认为这个函数有什么问题,那么为什么我不能100%准确地接收数据,我的源代码或任何一个都有什么问题吗?我应该选择一个不同的串行库吗?如果我选择其他库,而我仍然没有得到我的结果,那么我想我可能必须以无线方式传输这些信息,例如使用蓝牙模块。如果有人对这个问题有任何建议/改进,请告诉我:),在此之前,我将尝试其他方法来达到100%的准确性。
发布于 2017-02-17 15:40:32
最简单的方法就是检查是否可以在linux终端中快速完成,并且没有使用库。
写作: echo "650X450Y“> /dev/ttyO1
阅读: cat /dev/ttyO1
如果您想在C代码中这样做,您可以使用open/read/write/close syscall函数。
https://stackoverflow.com/questions/42155749
复制相似问题