关于arduino和openmv串口通信的问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 19783|回复: 13

[未解决] 关于arduino和openmv串口通信的问题

[复制链接]
发表于 2018-11-2 15:19 | 显示全部楼层 |阅读模式
我用下面的程序来接收openmv传来的3个数据,但是只能接收到最后的两个数据,可以帮忙看一下是哪里的问题吗,谢谢


#include <SoftwareSerial.h>

SoftwareSerial softSerial(10, 11); // RX, TX
typedef struct
{
  int data[50][3] = {{0,0,0}};
  int len = 0;
}List;
List list;

void setup() {
  // put your setup code here, to run once:
  softSerial.begin(115200);
  Serial.begin(115200);
}

void loop() {
  if(softSerial.available())
  {
    getList();
    for (int i=0; i<list.len; i++)
    {
      Serial.print(list.data[i][0]);
      Serial.print('\t');
      Serial.print(list.data[i][1]);
      Serial.print('\t');
      Serial.println(list.data[i][2]);
    }
    Serial.println("============");
    clearList();
  }

}


String detectString()
{
  while(softSerial.read() != '{');
  return(softSerial.readStringUntil('}'));
}
void clearList()
{
  memset(list.data, sizeof(list.data),0);
  list.len = 0;
}
void getList()
{
  String s = detectString();
  String numStr = "";
  for(int i = 0; i<s.length(); i++)
  {
    if(s[i]=='('){
      numStr = "";
    }
    else if(s[i] == ','){
      list.data[list.len][0] = numStr.toInt();
      numStr = "";
    }
    else if(s[i]==')'){
      list.data[list.len][1] = numStr.toInt();
      numStr = "";
      list.len++;
    }
    else{
      numStr += s[i];
    }
  }
}



9cebcc6f313b66a66cd3c6002f34873.png
发表于 2018-11-2 15:48 | 显示全部楼层
你试试 9600的波特率,有时候soft serial 115200发送没问题,接收会有问题
 楼主| 发表于 2018-11-5 19:16 | 显示全部楼层
Zoologist 发表于 2018-11-2 15:48
你试试 9600的波特率,有时候soft serial 115200发送没问题,接收会有问题

改成了9600也还是不行,可以帮我看看是不是openmv或者arduino的代码有问题吗
 楼主| 发表于 2018-11-5 19:17 | 显示全部楼层
#openmv的代码

import sensor, image, time
import json
from pyb import UART
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
blue_threshold   = ( 0, 60, -20, 64, -128, 0)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
#p4_10,p5_11,gnd_gnd

sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.

uart = UART(3, 115200)


'''
  扩宽roi
'''
def expand_roi(roi):
    # set for QQVGA 160*120
    extra = 5
    win_size = (160, 120)
    (x, y, width, height) = roi
    new_roi = [x-extra, y-extra, width+2*extra, height+2*extra]

    if new_roi[0] < 0:
        new_roi[0] = 0
    if new_roi[1] < 0:
        new_roi[1] = 0
    if new_roi[2] > win_size[0]:
        new_roi[2] = win_size[0]
    if new_roi[3] > win_size[1]:
        new_roi[3] = win_size[1]

    return tuple(new_roi)


K=680 #the value should be measured


while(True):
    clock.tick() # Track elapsed milliseconds between snapshots().
    img = sensor.snapshot() # Take a picture and return the image.

    blobs = img.find_blobs([blue_threshold], area_threshold=150)

    if blobs:
    #如果找到了目标颜色
        data=[]
        #print(blobs)
        for blob in blobs:
        #迭代找到的目标颜色区域
            b = blob[0]
            is_circle = False
            max_circle = None
            max_radius = -1


            new_roi = expand_roi(blob.rect())


            Lm = (blob[2]+blob[3])/2
            length = K/Lm
            length = str(length)
            length = float(length)



            for c in img.find_circles(threshold = 2000, x_margin = 10, y_margin = 10, r_margin = 10, roi=new_roi):
                is_circle = True
                # img.draw_circle(c.x(), c.y(), c.r(), color = (255, 255, 255))
                if c.r() > max_radius:
                    max_radius = c.r()
                    max_circle = c
            if is_circle:
                # 如果有对应颜色的圆形 标记外框
                # Draw a rect around the blob.
                img.draw_rectangle(new_roi) # rect
                img.draw_rectangle(blob.rect()) # rect
                #用矩形标记出目标颜色区域
                img.draw_cross(blob[5], blob[6]) # cx, cy
                img.draw_circle(max_circle.x(), max_circle.y(), max_circle.r(), color = (0, 255, 0))
                img.draw_circle(max_circle.x(), max_circle.y(), max_circle.r() + 1, color = (0, 255, 0))



                data.append((max_circle.x(),max_circle.y(),length))
                #data.append(length)
                data_out = json.dumps(set(data))
                uart.write(data_out +'\n')
                print('you send:',data_out)
            else:
                print("not found!")
    else:
        print("not found!")
    #print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
    # connected to your computer. The FPS should increase once disconnected.

 楼主| 发表于 2018-11-5 19:17 | 显示全部楼层
冰玉飒风 发表于 2018-11-5 19:17
#openmv的代码

import sensor, image, time

可以帮忙看看openmv的代码有没有问题吗
发表于 2018-11-5 20:37 | 显示全部楼层
冰玉飒风 发表于 2018-11-5 19:16
改成了9600也还是不行,可以帮我看看是不是openmv或者arduino的代码有问题吗

要不你先用usb转串口试试看接收和发送
 楼主| 发表于 2018-11-8 15:10 | 显示全部楼层
Zoologist 发表于 2018-11-5 20:37
要不你先用usb转串口试试看接收和发送

你试过用串口通信实现arduino和openmv的相互通信吗,我现在怀疑这种方式可不可行了
发表于 2018-11-8 16:29 | 显示全部楼层
冰玉飒风 发表于 2018-11-8 15:10
你试过用串口通信实现arduino和openmv的相互通信吗,我现在怀疑这种方式可不可行了 ...

不要轻易怀疑板子的问题,你的串口没交叉?
 楼主| 发表于 2018-11-8 17:44 | 显示全部楼层
Zoologist 发表于 2018-11-8 16:29
不要轻易怀疑板子的问题,你的串口没交叉?

交叉了,它可以接收,但是好像发送不了。
arduino发送消息给openmv应该用什么语句?Serial.print()好像就只是在电脑输出而已,怎样才能让消息传到openmv?
发表于 2019-3-3 15:18 | 显示全部楼层
你好,我也遇到相似的问题,请问解决了吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 10:54 , Processed in 0.089436 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表