将数据写入arduino python

2024-06-17 11:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将python中的数据写入到这个草图中

import serial
import smtplib
import time
s=serial.Serial('/dev/tty.usbserial-AH01LLHS',9600)
precx=500
ist=30
i=0
while True:
    s.write('1')
    stringa=s.readline()
    array=stringa.split(',')
    x=int(array[0])
    y=int(array[1])
    z=int(array[2])
    print(x,y,z)
    if(precx!=500):
        diffx=abs(x-precx)
        diffy=abs(y-precy)
        diffz=abs(z-precz)

        if((diffx>ist)|(diffy>ist)|(diffz>ist)):
            print('Ohu god',i)
            i+=1
            #time.sleep(2)
    precx=x
    precy=y
    precz=z

但是当我执行这个程序时,我在控制台上什么也看不到,而且Arduino Rx led也熄灭了。在

这是我的Arduino素描(nano atmega 328):

^{pr2}$

提前谢谢。在


Tags: importiftimeserialabsarrayintprint
1条回答
网友
1楼 · 发布于 2024-06-17 11:20:27

你一定要检查一下评论中的建议:

  • 使程序更简单,以便它总是在没有“流控制”(使用您发送的“1”字节)的情况下发送值
  • 使用串行监视器检查输出。在

首先,您应该检查在您的s.write('1')帮助之前和之后是否添加了s.flush()。然后您可能还想在arduino代码中添加flush()。在

对我来说,在初始化“流控制”算法时,这看起来真的是一个饥饿的问题。从纸面上看它很好,但在现实生活中,它可能不是。通常,当Arduino开始填满主机串行端口的缓冲区时,会发送大量垃圾。反之亦然。因此,在arduino一侧没有1,你可能会得到一个{}完全没有用的!@#$@#%@#%!@#$。在

因此,在进入循环之前,您应该添加一个init协议。arduino发送READY,主机发送READY,你把所有的东西都冲洗出来,直到两边都有{}。看起来像:

void setup() {
    Serial.begin(9600);
    Serial.println('READY');
    Serial.flush();
    char ch1 = 0, ch2 = 0;
    char incomingByte = 0;
    while (ch1 != 'O' && ch2 != 'K') {
        ch1 = Serial.read();
        if (ch1 == 'O' && ch2 == 'K')
            break;
        ch2 = Serial.read();
    }
}

在python方面:

^{pr2}$

当然,那只是你可能做什么的想法。你可以让它更复杂,或者更简单。但是在进行这种流控制之前,您确实需要创建一个集合点。在

相关问题 更多 >