我正在尝试使用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()
但没有显示任何内容。我已经浏览了整个互联网,但我找不到任何解决方案。请提前帮助,谢谢。
答案 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