Raspberry pi不会使用minicom或python将串行数据发送到arduino

时间:2013-07-23 19:15:15

标签: python serial-port arduino raspberry-pi

我正在尝试使用tx / rx引脚使用raspberry pi与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()

但没有显示任何内容。我已经浏览了整个互联网,但我找不到任何解决方案。请提前帮助,谢谢。

2 个答案:

答案 0 :(得分: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。然后我重新启动它。

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

答案 1 :(得分:0)

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

Ctrl+A然后按O(字母哦)并选择Serial port setup,然后将Hardware flow control切换为No

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