【问题标题】:Serial communication between c++ and arduinoc++和arduino之间的串行通信
【发布时间】:2016-06-02 00:47:28
【问题描述】:

我需要使用 C++ 与 arduino 通信,我已经为 c++ 尝试过这段代码:

#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;

int j=5;
main()
{
 fstream arduino;
 arduino.open("/dev/ttyACM0",ios::in | ios::out);
 //Opening device file

 if(!arduino)
   cout<<"error";
 arduino<<2;
 arduino.clear();
 arduino>> j;
 cout <<j;
 arduino.close();
 return 0;
}

Arduino 代码:

      int p;
      void setup() 
      {
          pinMode(13,OUTPUT);
          Serial.begin(9600);
       }

       void loop() 
       {
           if(Serial.available())
           {
               p=Serial.read();
               if(p!=-1)
               {
                   Serial.write(1);
                   digitalWrite(13,HIGH);
                   delay(5000);
                }   
            }
            else
            {
                digitalWrite(13,LOW);
                delay(1000);
            } 
        }

因此,根据此代码,当 c++ 代码在 arduino sould 上运行引脚 13 的 LED 时会发光 5 秒,并且 cout 应该打印 1。但是 LED 不发光,而 cout 正在打印 5(请参阅最初的 j= 5).我正在使用这个程序来测试 c++ 和 arduino 之间的串行通信。但我不知道发生了什么。我们还需要任何特殊的库来进行串行通信吗? 我的代码好吗? 请帮帮我。

【问题讨论】:

  • @MANDY:确保在运行 C++ 程序之前配置正确的波特率、奇偶校验、流控制等。例如,stty 实用程序可以帮助解决此问题。

标签: c++ serial-communication


【解决方案1】:

如果j 保持其旧值,则读取它的尝试可能会失败。尝试检查流状态,并检查可能的错误情况。例如:

if(arduino >> j)
    cout << "Value received: " << j << '\n';
else if(arduino.eof())
    cerr << "Premature EOF.\n";
else if(arduino.bad())
    cerr << "Attempt to read from device failed.\n";
else
    cerr << "Logical I/O error.\n";

【讨论】:

  • 对不起,我是 C++ 的初学者。我得到了错误——“过早的 EOF”。如何纠正这个?
  • 我不知道到底发生了什么,但我怀疑 Arduino 设备可能正在发送单个字节(或比您 PC 的整数短),并且 PC 至少需要 sizeof(int) 字节(通常为 4 个字节)以满足读取 int 类型的变量。另一个可能的原因是没有任何东西到达 PC。尝试将输入变量类型更改为char,并查看是否读取成功。
  • 我尝试将 int 更改为 char 但显示相同的错误。
  • @Paulo1205:实际上arduino&gt;&gt; j; 是文本解析,而不是sizeof(int) 字节的二进制读取。
  • OTOH -- 由于我不熟悉另一端发送的内容,因此假设它可能是二进制数据 -- 将数据更改为 char 可能足以排除输入中意外的非数字字符。
猜你喜欢
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多