首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux下的C++串行通信

问Linux下的C++串行通信
EN

Stack Overflow用户
提问于 2017-02-10 09:25:01
回答 1查看 6.7K关注 0票数 0

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

这是我用C++在BeagleBone上编写的程序:

代码语言:javascript
复制
#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上的代码如下:

代码语言:javascript
复制
#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”循环非常大,那么写入过程甚至停止(不确定为什么会这样),因此每次关闭和打开这个端口之后,我成功地减少了错误,但是仍然有一些错误:

  • 我发送了这个字符串500次,但是我在Uno上收到的一个示例是"660X450Y",值错误。
  • 500次中约2-3次,我收到的是“650X450Y650Y650X450Y”,即重复,这绝对不是字符串长度,那么它怎么能发送这些数据呢?

我在Uno上收到的其他字符串都很完美。

在Uno上,您可以看到,我正在逐字符读取,并将其附加到名为data的字符串中,并在检测到字节'Y‘时打印出该数据,该字节表示字符串的结尾。我以前在我的WriteString()代码中使用过C++ ()函数--但是这会导致一些错误,我提供的代码是我在过去几天里为使这个系统100%的可靠和健壮而在经过大量调试后所做的最接近的代码,但是我真的不知道为什么系统仍然不是100%。

我在库中看到了这两个文件的源代码,并观察到了WriteChar(Characters)函数,它定义在serialib.cpp的第210行(上面已经提供了链接),我看到这是传递字符的函数:

代码语言:javascript
复制
if (write(fd,&Byte,1)!=1)     // Write the char
     return -1;      // Error while writting
return 1; // Write operation successfull

我不认为这个函数有什么问题,那么为什么我不能100%准确地接收数据,我的源代码或任何一个都有什么问题吗?我应该选择一个不同的串行库吗?如果我选择其他库,而我仍然没有得到我的结果,那么我想我可能必须以无线方式传输这些信息,例如使用蓝牙模块。如果有人对这个问题有任何建议/改进,请告诉我:),在此之前,我将尝试其他方法来达到100%的准确性。

EN

回答 1

Stack Overflow用户

发布于 2017-02-17 15:40:32

最简单的方法就是检查是否可以在linux终端中快速完成,并且没有使用库。

  1. 将UART1的波德率设置为300 (stty -F /dev/ttyO1 1 raw & stty -F /dev/ttyO1 1 300)
  2. 只需将数据写入(或读取)到UART1的设备文件(在您的例子中为/dev/ttyO1 ),就可以将数据发送到UART1。

写作: echo "650X450Y“> /dev/ttyO1

阅读: cat /dev/ttyO1

如果您想在C代码中这样做,您可以使用open/read/write/close syscall函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42155749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档