解决python通过串口发送消息给Arduino无法返回数据的问题

项目中需要用python通过串口给Arduino发送指令。还是面向百度编程,查询到以下方案

Arduino代码

#define adapterPort 3

void setup() {
  Serial.begin(9600);
  pinMode(adapterPort,OUTPUT);
}

void loop() {
  if (Serial.available()>0){
    char serialData=Serial.read();
    
    if(serialData=='H'){
      digitalWrite(adapterPort,HIGH);
      Serial.print(serialData);
      delay(800);
    }
    
    if(serialData=='L'){
      digitalWrite(adapterPort,LOW);
      Serial.print(serialData);
      delay(800);
    }
    
  }
}

通过Arduino的串口监视器发送指令,可以成功执行并返回数据

接下来通过python编写串口通信代码实现和Arduino的数据通信

Python代码

import serial
import time

arduino_serial = serial.Serial("COM4", 9600, timeout=0.5)
arduino_high=b'H'
arduino_low=b'L'

arduino_serial.write(arduino_high)
print(arduino_serial.readline())

# arduino_serial.write(arduino_low)
# print(arduino_serial.readline())

arduino_serial.close()

奇怪的事情发生了,在发送完数据之后python端就是接收不到数据

 试了各种方法,甚至都去看串口的底层原理了,还是不行,真不知道网上那些人是怎么通过那千篇一律的代码跑成的。

1000 years later......发现仅仅是需要加一行time.sleep()代码

import serial
import time

arduino_serial = serial.Serial("COM4", 9600, timeout=0.5)
arduino_high=b'H'
arduino_low=b'L'

time.sleep(3)
arduino_serial.write(arduino_high)
print(arduino_serial.readline())

time.sleep(3)
arduino_serial.write(arduino_low)
print(arduino_serial.readline())


arduino_serial.close()

接着就能正常收发数据了,原因很简单,串口连接的建立是需要时间的,网上的代码,在串口建立代码后直接发消息,这时候连接都还没建立完成呢,发过去的消息当然没回应。所以在建立连接之后sleep(3)等连接建立完成之后再发送消息,这样就可以了。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
如何通过目标追踪功能制作一个手机摄像头实时跟踪小车,该设计运用OpenCV的图像处理APP,手机APP通过摄像头实时跟踪设定的颜色目标,并且通过手机蓝牙将目标坐标位置和大小等信息输出,配合蓝牙串口模块和我写的配套Arduino数据接收库,就可以做成一个简单的手机跟踪寻迹小车。 手机实时跟踪寻迹小车视频演示: 手机实时跟踪寻迹小车手机APP截图: 安装方法: 1.直接安装Trace.apk,Android5.0以上系统需要到设置里赋予应用相机和蓝牙权限 2.在豌豆荚搜索“迹”安装,同上 使用方法: 1.进软件之后可以点击连接蓝牙,选择你的蓝牙模块(模块需要事先在手机系统蓝牙设置里面配对好),连接上之后如果有目标信息就会通过蓝牙发送到模块上,Arduino进行读取就可以了。 2.点击左上角的按钮进入预览画面,此时在预览窗口中点击任何一个你想追踪的物体,就会自动进行处理输出数据了,顶栏会显示你选中的颜色。 3.这里说明一下,跟踪原理是以颜色为特征的,所以应该尽量避免视野中出现颜色相同的物体,同时如果发现跟踪物体的周围出现大量小块的目标块,可以适当调大屏幕下方的进度条,直到杂块消失只剩一个目标。 说明一下屏幕下方各个控件的含义: 1.左边的按钮是切换手机前后镜头的(现在应该没有不带前置镜头的手机了吧…) 2.进度条用于调节图像处理阈值,这个值用于色块过滤,可以理解为,用于设置最小的目标块的限制,也就是当目标小于一定程度就过滤掉。 3.T、X、Y三个参数是目标的信息,XY是坐标大家都知道(坐标的最大值跟手机镜头分辨率有关);T是目标的大小信息,如果检测到多个目标或者没有检测到任何目标这里会显示E(error)。T可以用于粗略得判断物体的远近(近大远小),不过更推荐的方式是用Y轴判断远近(见后文的小车)。 手机实时跟踪寻迹小车设计总结: 这个小车大家可以随意搭建,只要能把你的手机放上去就行。Tmp上我用了两个舵机改造成轮子,把180度的舵机改成可以连续旋转的360舵机,这样就省下了电机驱动以及麻烦的减速箱,而且只用一根信号线就可以控制电机的正反转和速度,这部分要是大家感兴趣可以上网搜搜相关改造教程。 然后我们需要把小车和手机联系起来,通过蓝牙模块: 需要使用从机模块,最好把波特率设置为115200,连线如下: 蓝牙模块 Arduino Tx -> Rx Vcc -> 5V Gnd -> Gnd 1.注意蓝牙的Rx是不接Arduino的,因为Arduino只需要接收APP的数据而不需要发送,这样的话留出的Tx就可以通过Serial.Print()打印到电脑端的串口助手。 2.当然,考虑到一般Arduino都只有一个硬件串口,这样串口被蓝牙模块占用了之后每次下载都需要拔下蓝牙以避免数据串扰,解决办法是换用软串口或者换用Mega等不止一个串口的板子。 3.软件部分,提供已经封装好的Arduino库,放到library文件夹后打开示例就会用了 需要自己完成的部分就是,把获取到的x,y坐标转换为小车电机的速度,思路是这样的: 1.假设我们希望目标始终在屏幕中间,那么当y坐标大于屏幕y最大值的一半时让车有一个往前的基础速度V,反 之则是向后的基础速度-V; 2.如果x坐标大于屏幕x最大值的一半,那么让车子有一个旋转速度Vt,反之有个旋转速度-Vt; 最后赋值给小车的速度是:左轮 = V+Vt,右轮 = V-Vt,也就是所谓的差速驱动了。 最后给出APP和Arduino库,见“相关文件”下载。
很抱歉,我是一个文本AI模型,无法直接使用OpenMV的UART库进行串口通信。不过,我可以提供一个示例代码来说明如何使用UART库将数据通过串口发送Arduino。 在OpenMV中,你可以使用`uart`模块来实现串口通信。以下是一个示例代码,它将OpenMV的图像帧率通过串口发送Arduino: ```python import sensor import image import time from pyb import UART sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QQVGA) sensor.skip_frames(time=2000) clock = time.clock() uart = UART(3, 115200) # 根据你的实际情况选择正确的串口和波特率 while True: clock.tick() img = sensor.snapshot().lens_corr(1.8) # 检测圆形、矩形、三角形等 # ... fps = clock.fps() uart.write("%f\n" % fps) # 将数据以字符串形式发送Arduino print("FPS %f" % fps) ``` 在Arduino端,你可以使用Serial库来接收OpenMV发送数据。以下是一个示例代码,它接收来自OpenMV的帧率数据并打印到串口监视器上: ```cpp void setup() { Serial.begin(115200); // 与OpenMV的波特率保持一致 } void loop() { if (Serial.available()) { float fps = Serial.parseFloat(); // 从串口读取OpenMV发送的帧率数据 Serial.print("Received FPS: "); Serial.println(fps); } } ``` 请注意,你需要根据你的实际情况选择正确的串口和波特率,并根据需要修改数据发送和接收方式。确保OpenMV和Arduino连接到正确的串口,并在代码中进行相应的配置。 希望这个示例能帮助你理解如何使用UART库在OpenMV和Arduino之间进行串口通信。如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器人迈克猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值