我正在开展一个项目,我必须一次收到大约25个字符数据才能在Raspberry Pi中处理它。下面是生成我想从Arduino接收的一些数据的示例代码:
char i =0;
char a =0;
char b=0;
void setup(){
Serial.begin(9600);
for(i=0;i<25;i++){
Serial.print('l');}
Serial.print('\n');
delay(2000);
}
void loop(){
for(i=0;i<25;i++){
for(a=0;a<i;a++){
if((a==9)||(a==19)||(a==24))
Serial.print('l');
else
Serial.print('d');
}
for(b=0;b<25-i;b++){
Serial.print('l');
}
delay(2000);
}
}
它会发送一条这样的行'llllddddllldddd ...'这行长度为25个字符。现在,我希望通过Raspberry Pi获得此功能。这是我正在尝试的代码:
ser = serial.Serial('/dev/AMA0',9600,timeout=1)
ser.open()
try:
serial_data = ser.readline()
print serial_data
except serial.serialutil.SerialException:
pass
此代码非常正确地接收数据5秒钟,然后突然停止接收。
此外,当我尝试以下操作时,我没有输出或输入/输出错误。
serial_data = ser.readline()
print serial_data
EDIT1: 好的,我现在评论了这个例外。它给出了以下错误:
raise SerialException('device reporst rediness to read but returned no data (device disconnected?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)
通过PySerial从arduino接收25个字符数据到raspberry的正确方法是什么?任何帮助都将受到高度赞赏。
答案 0 :(得分:12)
我遇到了同样的问题并且好好打破了我的脑袋,试试这个
运行
ps -ef | grep tty
如果输出看起来像
root 2522 1 0 06:08 ? 00:00:00 /sbin/getty -L ttyAMA0 115200 vt100
然后你需要禁止getty尝试将数据发送到该端口
为了使用Raspberry Pi的串口,我们需要通过在文件/ etc / inittab中找到这一行来禁用getty(显示登录界面的程序)
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
通过在它前面添加#来评论它
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100)
要防止Raspberry Pi在启动时向串行端口发送数据,请转到文件/boot/cmdline.txt并找到该行并将其删除
console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
重新启动Raspberry Pi
信用到期的信用:http://blog.oscarliang.net/raspberry-pi-and-arduino-connected-serial-gpio/帮助我弄清楚如何使用getty
答案 1 :(得分:2)
在树莓派中阅读gps数据时,我不得不为此付出努力。大约10秒后输出将停止并报告
device reports readiness to read but returned no data (device disconnected?)
几乎所有论坛中提供的解决方案都是针对带有wheezy的raspberry pi 2。我终于通过执行以下操作,使用jessie在我的覆盆子pi3中获得连续的gps流:
enable_uart=1
并在/boot/config.txt中添加dtoverlay=pi3-disable-bt
。然后重启我必须将/boot/cmdline.txt更改为
dwc_otg.lpm_enable=0 console=tty1 console=serial0,9600 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
然后重启
停止getty:
sudo systemctl stop serial-getty@ttyAMA0.service
禁用:sudo systemctl stop serial-getty@ttyAMA0.service
您需要小心使用/boot/cmdline.txt。文件中的任何错误都可能使您的raspberry pi无法启动。最好在编辑之前保留文件的备份。同时正确设置波特率。在我的情况下,它是9600.希望这有帮助!
答案 2 :(得分:1)
我曾经经常这么做,然后一位朋友告诉我从python中提示arduino获取数据。
考虑让arduino仅在你的python程序提示时发送数据:
<强> prompt.py 强>
#!/usr/bin/python
import serial, time
ser = serial.Serial('/dev/ttyACM0', 115200, timeout = 0.1)
#if you only want to send data to arduino (i.e. a signal to move a servo)
def send( theinput ):
ser.write( theinput )
while True:
try:
time.sleep(0.01)
break
except:
pass
time.sleep(0.1)
#if you would like to tell the arduino that you would like to receive data from the arduino
def send_and_receive( theinput ):
ser.write( theinput )
while True:
try:
time.sleep(0.01)
state = ser.readline()
print state
return state
except:
pass
time.sleep(0.1)
f = open('dataFile.txt','a')
while 1 :
arduino_sensor = send_and_receive('1')
f.write(arduino_sensor)
f.close()
f = open('dataFile.txt','a')
<强> prompt.ino 强>
void setup () { pinMode(13, OUTPUT); Serial.begin(115200); }
void loop() {
if (Serial.available()) {
ch = Serial.read();
if ( ch == '1' ) {
Serial.println(analogRead(A0)); // if '1' is received, then send back analog read A0
}
else if (ch == '2') {
digitalWrite(13,HIGH); // if '2' is received, turn on the led attached to 13
}
else if (ch == '3') {
digitalWrite(13,LOW); // if '3' is received then turn off the led attached 13
} else {
delay(10);
}
}
}
另外,我创建了一个github存储库,其中包含一些用于python-arduino通信的示例:
https://github.com/gskielian/Arduino-DataLogging/blob/master/PySerial/README.md
答案 3 :(得分:0)
在loop
代码的Arduino
函数中,您永远不会结束换行符\n
,这只是ser.readline()
的问题,因为它会读到\n
字符。
在setup
功能期间,您正确发送了一个\n
字符,该字符可以解释发送的初始值,但不能解释数据。
或许修改你的Arduino代码:
void loop(){
for(i=0;i<25;i++){
for(a=0;a<i;a++){
if((a==9)||(a==19)||(a==24)) {
Serial.print('l');
} else {
Serial.print('d');
}
} /*end for loop a*/
for(b=0;b<25-i;b++){
Serial.print('l');
} /*end for loop b*/
Serial.print('\n'); // CODE EDITED HERE
delay(2000);
}
}
你的python代码就是这样......
ser = None
try:
ser = serial.Serial('/dev/AMA0',9600,timeout=3)
ser.open()
while True:
try:
serial_data = ser.readline()
print serial_data
except:
pass
except:
pass
finally:
if ser:
ser.close()
答案 4 :(得分:-1)
试试sudo rasbpi-config
,
选择界面选项,说“没有”#39;到第一条消息(&#34;内核登录&#34;),&#39;是&#39;到第二条消息(&#34;&#34;上的串行通信;)。我发现如果第一条消息在它上面就会抛出错误。说不#39;解决它。