我正试图从我的BeagleBone黑板发送数据到Arduino Uno。我选择的波特率是300。我正在使用位于此处的serialib库:http://serialib.free.fr/html/classserialib.html#ac8988727fef8e5d86c9eced17876f609您可以一直滚动到底部以查看两个文件(serialib.h和serialib.cpp),但是我也在此处发布了主要片段。我读到一些评论说这个库不可靠,但是我首先想检查我的代码,然后再怀疑其他的东西。
这是我在BeagleBone上用C++编写的程序:

#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
  }
 }
}

我首先在BigeLeBand上打开我的UART端口,并通过重复500次的字符发送字符串“650x450y”字符,看看我的通信系统是否健壮。如你所见,在“for”循环中,我在发送每个字符后关闭和打开这个端口,因为没有这个,它会发送很多错误的数据,如果这个“for”循环非常大,那么写入过程甚至会停止(不确定为什么它会这样),因此每次关闭和打开这个端口后,我都设法减少错误明显,但仍有一些错误:
我发送了这个字符串500次,但在Uno上收到的一个样本是“660X450Y”,错误的值。
大约500次中的2-3次,我接收到“650X450Y650X450Y650X450Y”即重复,这绝对不是字符串长度,那么它为什么可以发送此数据?.
我在Uno上收到的其他字符串都是完美的。
在Uno上,您可以看到我正在逐字符读取并将其附加到名为data的字符串中,并在检测到表示字符串结尾的字节“Y”时立即打印出此数据。我以前在我的C++代码中使用了RealStutyIn()函数,但是它给出了一些错误,我提供的代码是最近几天来最接近的,使这个系统100%在大量调试之后变得可靠和健壮,但是我真的不确定为什么系统仍然不是100%。
我看到了库中两个文件的源代码,并观察到了在serialib.cpp(上面已经提供了链接)的第210行定义的WriteChar(char Byte)函数,我看到这是传递字符的函数:
if (write(fd,&Byte,1)!=1)     // Write the char
     return -1;      // Error while writting
return 1; // Write operation successfull

我看不出这个函数有什么问题,那为什么我不能100%准确地接收数据,我的两个源代码或其中一个都有什么问题?,是否应选择其他序列库?,如果我选择了其他库,但仍无法获得结果,则我认为可能需要以无线方式(例如使用蓝牙模块)传输此信息。如果有人对此问题有任何建议/改进,请务必让我知道:),在此之前,我将尝试其他方法以达到100%的准确性。

最佳答案

最简单的方法是在linux终端上检查是否可以快速完成,并且没有库用于此。
将UART1的波特率设置为300(stty-F/dev/ttyO1 raw&stty-F/dev/ttyO1 300)
您只需将数据写入(或读取)UART1的设备文件(在您的例子中是/dev/ttyO1),就可以将数据发送到UART1
写入:echo“650X450Y”>/dev/ttyO1
阅读:cat/dev/ttyO1
如果要在C代码中执行此操作,可以使用open/read/write/close syscall函数。

关于c++ - Linux中的C++串行通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42155749/

10-11 22:55