openmv与msp432串口通信

发布者:eaff86最新更新时间:2022-08-05 来源: csdn关键字:openmv  msp432  串口通信 手机看文章 扫描二维码
随时随地手机看文章

根据 OpenMV与stm32,msp432等单片机的串口通讯(已经写好一个识别色块的例程,可直接使用)keil(MDK)改进。


一、首先有一个大思想的问题,举个例子就是假如msp432充当“大脑”,openmv就相当于“眼睛”,那么链接所写的就是“眼睛”一直在向“大脑”发送数据,中断会一直触发。那么我们换种思路,如果是我“大脑”发个信号之后,“眼睛”再将数据发送给“大脑”。

(利:中断触发减少,可调整数据发送速率,可主动请求数据。)

(弊:主程序占用,请求可能会被搁置,如果使用定时器的延时可以避免这个。)


二、就是他的那个代码里有一个数据的判断是错误的。


下面是openmv的代码


# Blob Detection and uart transport

import sensor, image, time

from pyb import UART

import json

import lcd

# For color tracking to work really well you should ideally be in a very, very,

# very, controlled enviroment where the lighting is constant...

yellow_threshold   = (1, 17, -20, 11, -12, 17)

#记得更改要识别色块的阈值

# You may need to tweak the above settings for tracking green things...

# Select an area in the Framebuffer to copy the color settings.


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.

lcd.init() # Initialize the lcd screen.

#lcd初始化

uart = UART(3, 115200)

uart.init(115200,bits=8,parity=None,stop=1)

#这里是UART3,115200

def find_max(blobs):

    max_size=0

    for blob in blobs:

        if blob.pixels() > max_size:

            max_blob=blob

            max_size = blob.pixels()

    return max_blob

#得到识别面积最大的色块


while(True):

    img = sensor.snapshot() # Take a picture and return the image.


    blobs = img.find_blobs([yellow_threshold])


    if blobs:


        max_blob=find_max(blobs)

        img.draw_rectangle(max_blob.rect())

        img.draw_cross(max_blob.cx(), max_blob.cy())

        img.draw_string(0,0,'x='+str(max_blob.cx()),color=(0,0,0))

        img.draw_string(0,10,'y='+str(max_blob.cy()),color=(0,0,0))

        output_str=bytearray([0x2c,4,max_blob.cx(),max_blob.cy(),max_blob.w(),max_blob.h(),0x5B])

        

        #output_str="[%d,%d,%d,%d]" % (max_blob.cx(),max_blob.cy(),max_blob.w(),max_blob.h()) #方式1

        #output_str=json.dumps([max_blob.cx(),max_blob.cy()]) #方式2

        #output_str = json.dumps(max_blob)

       # print('you send:',output_str)


        lcd.display(img) # Take a picture and display the image.


    #将图像显示在lcd中

    #else:

        ##print('not found!')

        #print('you send:',output_str)

        #output_str=bytearray([0x2c,0,0x5B])

        #uart.write(output_str)


    if uart.any():

        a=uart.readline().decode().strip()

       # b=int(a)

        print(a)

        if a=='x':

            uart.write(output_str)

            print('you send:',output_str)

        a='NULL'

        b=0


#加入了一个判断的条件,当主机发送'x'时,我发送数据


还有一些当时存在疑惑的地方这里解释一下


output_str=bytearray([0x2c,4,max_blob.cx(),max_blob.cy(),max_blob.w(),max_blob.h(),0x5B])


2c就相当于报头,5B相当于结尾

2c在ccs中不是16进制显示的话会是’,’ ASCII码是44

5B在ccs中不是16进制显示的话回是’[’ ASCII码是91

期中的max_blob.cx(),max_blob.cy(),max_blob.w(),max_blob.h()是最大的目标的x,y坐标,还有宽和高。


有一个.h头文件,在stm32中和msp432中都是一样的,都可以用。


#ifndef __openmv_H

#define __openmv_H



typedef struct

{

u16 cx;

u16 cy;//最大色块的中心坐标

u16 w;

u16 h;

u16 s;//最大色块的面积(在popenv ide软件上运行框起来的面积(w*h))

}_CARD;


void Openmv_Init(u32 bound);

void Openmv_Receive_Data(int16_t data);


extern _CARD CARD;


#endif


/* end of openmv.h */


(转自原作者)

还有.c文件


/******************************************************************************

 * MSP432 UART - Loopback with 24MHz DCO BRCLK

 *

 *  MCLK = HSMCLK = SMCLK = DCO of 24MHz

 *

 *               MSP432P401

 *             -----------------

 *            |                 |

 *       RST -|     P3.3/UCA0TXD|----定时发送数据请求

 *            |                 |

 *           -|                 |

 *            |     P3.2/UCA0RXD|----接收数据,8bit*7个

 *            |                 |

 *            |                 |

 *

 *******************************************************************************/

/* DriverLib Includes */

#include


/* Standard Includes */

#include

#include


#include "openmv.h"

_CARD CARD={0};


uint8_t RXData = 0;

uint8_t TXData = 'x';


/* UART Configuration Parameter. These are the configuration parameters to

 * make the eUSCI A UART module to operate with a 115200 baud rate. These

 * values were calculated using the online calculator that TI provides

 * at:

 * http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html

 */

const eUSCI_UART_ConfigV1 uartConfig =

{

        EUSCI_A_UART_CLOCKSOURCE_SMCLK,          // SMCLK Clock Source

        13,                                      // BRDIV

        0,                                       // UCxBRF

        37,                                      // UCxBRS  设置波特率为115200

        EUSCI_A_UART_NO_PARITY,                  // No Parity

        EUSCI_A_UART_LSB_FIRST,                  // LSB First

        EUSCI_A_UART_ONE_STOP_BIT,               // One stop bit

        EUSCI_A_UART_MODE,                       // UART mode

        EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION,  // Oversampling

        EUSCI_A_UART_8_BIT_LEN                   // 8 bit data length

};


void Openmv_Init(void)

{

    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,

             GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);


    /* Configuring UART Module */

    MAP_UART_initModule(EUSCI_A2_BASE, &uartConfig);


    /* Setting DCO to 24MHz (upping Vcore) */

    FlashCtl_setWaitState(FLASH_BANK0, 1);

    FlashCtl_setWaitState(FLASH_BANK1, 1);

    MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

    CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_24);


    /* Enable UART module */

    MAP_UART_enableModule(EUSCI_A2_BASE);

//    MAP_UART_clearInterruptFlag (EUSCI_A2_BASE);


    /* Enabling interrupts */

    MAP_UART_enableInterrupt(EUSCI_A2_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);


    MAP_Interrupt_enableInterrupt(INT_EUSCIA2);

    MAP_Interrupt_enableMaster();

}


void Openmv_Receive_Data(uint8_t data)//接收Openmv传过来的数据

{

    static uint8_t openmv[7];    //存取数据

    static uint8_t state = 0;

    uint8_t i;

    static uint8_t bit_number=0;

    if(state==0&&data==0x2C)

    {

        state=1;

        openmv[bit_number++]=data;

    }

    else if(state==1&&data==4)

    {

        state=2;

        openmv[bit_number++]=data;

    }

    else if(state==2)

    {

        openmv[bit_number++]=data;

        if(bit_number>=6)

        {

            state=3;

        }

    }

    else if(state==3)       //检测是否接受到结束标志

    {

            if(data == 0x5B)

            {

                    state = 0;

                    openmv[bit_number++]=data;

                        CARD.cx=openmv[2];

                        CARD.cy=openmv[3];

                        CARD.w=openmv[4];

                        CARD.h=openmv[5];

                        CARD.s=openmv[4]*openmv[5];

            }

            else if(data != 0x5B)

            {

                 state = 0;

                    for(i=0;i<=7;i++)

[1] [2]
关键字:openmv  msp432  串口通信 引用地址:openmv与msp432串口通信

上一篇:MSP432滴答定时器(SysTick)说明和配置
下一篇:MSP432中断初试

推荐阅读最新更新时间:2024-11-13 08:29

MSP432驱动st7920
直接上代码 /* LCD MSP432P401R PIN1 = GND PIN2 = 5V RS(CS) = 18; RW(SID/MOSI)= 15; EN(CLK) = 7; PIN15 PSB = GND; */ #include LCD12864RSPI.h #define AR_SIZE( a ) sizeof( a ) / sizeof( a ) unsigned char show0 ={0xCE,0xD2,0xB0,0xAE,0xD6,0xD0,0xB9,0xFA};//我爱中国 unsigned char show1 = I Love You ; unsigned char logo0 ={//
[单片机]
玩转单片机之三--串口通信,接收数据
#include reg51.h #define uchar unsigned char //byte #define uint unsigned int //word sbit led1=P0^0; sbit fir=P2^4; //fir=0;工作 sbit sec=P2^5; //sec=0;工作 sbit thi=P2^6; //thi=0;工作 sbit fot=P2^7; //fot=0;工作 uchar table ={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0}; //P1=table ;/* 0 1 2 3 4
[单片机]
51单片机与PC串口通信程序及硬件电路图
#include reg51.h #define BUFFERLEGTH 10 //----------------------------------------------------------------- void UART_init(); //串口初始化函数 void COM_send(void); //串口发送函数 char str ; char j; //------------------------------------------------------------------- void main(void) { unsigned char i; UART_init
[单片机]
51单片机与PC<font color='red'>串口通信</font>程序及硬件电路图
Linux环境下串口通信的设计方法和步骤
引言 数据采集系统中由于单片机侧重于控制,数据处理能力较弱,对采集的数据进行运算处理比较繁琐,如果通过串口与上位机通信,利用上位机强大的数据处理能力和友好的控制界面对数据进行处理和显示则可以提高设计效率。串口通信以其简单的硬件连接,成熟的通信协议,成为上下位机之间通信的首选。移植了Linux操作系统的s3c2440可以在Linux环境下操作串口,降低了串口操作的难度,可以使开发者集中精力开发大规模的应用程序,而不必在操作底层设计上耗费时间。 1 硬件连接 s3c2440是三星公司生产的基于ARM9核的处理器,采用3.3V 电压 供电;C8051Fxxx系列单片机是美国CYGNAL公司推出的与8051兼容的高性能高速
[单片机]
Linux环境下<font color='red'>串口通信</font>的设计方法和步骤
51单片机串口通信的驱动程序
#include reg52.h #include ./delay/delay.h #include stdio.h unsigned char temp ; void uart_init() { SCON = 0x50; //设置uart的工作方式 TMOD |= 0x20; //设置定时器工作方式 :方式二 TH1 = 0xfd; //设置波特率为9600 TR1 = 1; //打开定时器中断 } void uart_send_byte(unsigned char byte) //发送 { SBUF =byte; while(!TI)
[单片机]
STC15F2K60S2串口通信程序代码
//********************************************** //STC15F2K60S2串口通信程序,将串口接受到的数据从串口发出去 //采用22.1184M晶振,波特率115200 //为方便大家调试,特附该程序的项目工程文件下载地址,下载打开即可调试下载到单片机 // //********************************************* #include stc15fxxxx.h //调用stc15f系列头文件,下载地址: http://pan.baidu.com/s/1eRUbjLS /*************常量定义************
[单片机]
STC15F2K60S2<font color='red'>串口通信</font>程序代码
STM32单片机(7) 串口通信printf重定向
1、添加头文件 #include stdio.h 2、工程“Target -- 勾选 Use MicroLIB 3、重定义fputc函数 int fputc(int ch, FILE *f) { Uart1_PutChar((u8)ch); //此处为自定义函数,参见串口中断通信,请勿盲目复制 return (ch); } 经过上述配置后即可在项目中使用printf( Hello~ );等来发送字符串了 (printf( 格式化字符串 , 参量表 ) 与C语言使用一样)
[单片机]
STM32串口通信过程详解
按照数据传送方向分类: 单工:数据传输只支持数据在一个方向上传输; 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口; 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。 分别如下图中的a、b、c所示: 按照通信方式分类: 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口; 异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线; 在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数
[单片机]
STM32<font color='red'>串口通信</font>过程详解
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved