4

我正在尝试让树莓派使用 tx/rx 引脚与 arduino 进行通信。我已经将 arduino 编程为发送回它收到的字母的 ASCII 码。

代码:

byte number = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available())  
  {
    number = Serial.read();
    Serial.print("character recieved: ");
    Serial.println(number, DEC);
  }
}

但是当我打开 minicom 并输入它时,什么也没有发生。如果我打开 arduino 的串行监视器并发送一个字符 minicom 会显示“收到的字符:”和字符 ASCII 码。我尝试使用 py serial 创建一个 python 程序,

代码:

import serial
ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=1)
ser.open()

ser.write("testing")
try:
        while 1:
                response = ser.readline()
                print response
except KeyboardInterrupt:
        ser.close()

但什么也没有显示。我在整个互联网上都查看了,但我没有找到解决方案。请帮助,提前谢谢。

4

2 回答 2

1

聚会很晚,但我今天遇到了同样的问题。您需要做的是配置 minicom 不使用硬件流控。这就是阻止你给 minicom 的输入进入 Arduino 的原因。

Ctrl+A然后按O(字母 Oh)并选择Serial port setup,然后切换Hardware flow controlNo

完成此操作后,您可能希望将新设置保存为默认设置:再次按Ctrl+Athen O(字母 Oh),但现在选择Save setup as dfl

于 2018-01-01T12:22:21.700 回答
0

首先, ser.readline 在返回任何内容之前查找 \r\n,因此发送单个字节将简单地进入缓冲区。

因此,您希望始终将 ser.println 用于该行的最后一部分。这在 Pi 和 Arduino 上都是一样的。

此外,在 Minicom 中,您希望在每一行之后按 Enter,以便 ser.readline() 将返回该行。

..

您不需要做任何奇怪的事情来使串行端口工作。但是,我使用实际的 USB 连接器,而不是直接连接到 TX/RX 线。事实上,我使用的电缆与您在 PC 上编程时使用的电缆相同。

我将 Rpi 用作 Arduino 程序员并处理它从模拟读数发回的结果。

从 IDE 上传到 Arduino 时需要停止读取串行的 Rpi python 程序,但这是唯一真正的考虑因素。没有两个程序可以同时抢占 USB 端口。

在 Rpi 方面,我最初使用

ls /dev/ttyUSB*

找到它正在使用的端口。我什至拔掉了电缆,然后再次执行该命令,它就消失了。插回它,它又回来了。它非常可靠(与插入 USB 存储器相反)。

在 Arduino 方面,它始终是您程序中已有的相同串行内容。

您使用 minicom 进行测试是正确的。

为了找到在 shebang 中使用的字符串,我使用了这个:

which python

所以这是我在 Rpi3 上使用的:

#!/usr/bin/python
import serial
from datetime import datetime
tab = "\t"
ser = serial.Serial("/dev/ttyUSB0",9600)

while True :
    linein = ser.readline()
    if len(linein)<10 : continue
    print "/dev/ttyUSB0 input -->  " + repr(linein)
    date   = str(datetime.now().date())
    date   = date[:10]            
    time   = str(datetime.now().time())
    time   = time[:8]
    outline = date + tab + time + tab + linein
    if not outline.endswith("Inverter\r\n") :
        f = open("htv.dat","a")
        f.write(outline)
        f.close()
        print "htv.dat ----> " + repr(outline)
        print "htv.dat ----> " + outline
    else: print

为了使其可执行,我这样做:

cp ss.py ssx
chmod +x ssx
sudo cp ssx /usr/sbin

这是我在 Nano 上使用的代码:

// HTV - Humidity, Temperature, Voltage          2/4/17
//
//  Voltage measurement variables for the voltage divider    A2
float R1 = 1000000.0; 
float R2 =  147000.0; 
float constADC=4.59;   

//  Humidity/temp readings     D2
#include <Adafruit_Sensor.h>
#include "DHT.h"
#define DHTPIN 2    
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600); 
  dht.begin();
  }

void loop() { 
  int value=analogRead(A2);
  float vout = value * (constADC/1024.0);  
  float vin = vout / (R2/(R1+R2));  

  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float df = t*(9.0/5.0)+32;
  if (isnan(h) || isnan(t)) { h=0; df=0; }

  Serial.print(h);
  Serial.print("\t");
  Serial.print(df);
  Serial.print("\t");
  Serial.println(vin);

  delay(60000);
}

没什么太花哨的。我只是在 Rpi 上打开一个终端窗口并输入 ssx 并开始收集。如果我必须从 IDE 将某些内容上传到 Nano,我会在上传期间使用 ^C 停止 SSX。然后我重新启动它。

打开文件进行写入然后关闭它可以防止任何数据损坏。

于 2017-02-04T20:28:40.627 回答