k210、openmv串口打包通信

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

k210、openmv串口打包通信


前言

提示:这里可以添加本文要记录的大概内容:

设备间可以通过串口的方式来实现简单的通信,k210和openmv串口通信的方式相识,大部分代码可以通用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、引入库

k210:

from machine import UART,Timer #串口库函数
from fpioa_manager import fm   #GPIO重定向函数

(openmv不需要这一步)

二、设置串口TX/RX引脚

k210:

fm.register(4, fm.fpioa.UART1_RX, force=True)
fm.register(5, fm.fpioa.UART1_TX, force=True)

openmv串口固定无需指定

三、初始化串口

k210:

uart = UART(UART.UART1, 115200, read_buf_len=4096)

openmv:

uart = UART(3, 115200, timeout_char=1000)

四、主函数

state = 0
rx_buff = []
tx_flag = 0

#定义串口发送打包的数据函数
def Receive(data):
    global state   #状态标志位
    global rx_buff #数据缓冲区
    global tx_flag #用于表示是否需要发送数据的标志

    if state == 0: #当状态 state == 0,如果接收到的数据为 0xb3,则进入状态 1;否则重置状态为 0
        if data == 0xb3:
            state = 1
        else:
            state = 0
            rx_buff.clear()
    elif state == 1:
        if data == 0xb3:
            state = 2
        else:
            state = 0
            rx_buff.clear()

    elif state == 2:#当状态 state ==  2,将接收到的数据追加到接收缓冲区 rx_buff 中
        rx_buff.append(data)
        state = 3
    elif state == 3:
        rx_buff.append(data)
        state = 4

    elif state == 4:#当状态 state == 4,如果接收到的数据为 0x5b,则提取 rx_buff 中的第一个和第二个字节作为有效数据 x 和 y,并输出
        if data == 0x5b:
            x = rx_buff[0]
            y = rx_buff[1]
            print("Received: x =", x, "y =", y)
            rx_buff.clear()  # 清空 rx_buff
            uart.read(uart.any())
            state = 0       # 重置 state 为 0
            tx_flag = 1  # 设置标志位,表示需要发送数据
    else:
        state = 0
        rx_buff.clear()

#定义串口打包发送函数
def send(c,d):
    FH = bytearray([0xb3,0xb3,c, d,0x5b])#打包数据
    uart.write(FH);#串口发送数据



while True:
    if uart.any():
        data = uart.readchar()  # 从串口读取一个字节数据
        Receive(data)  # 处理接收到的数据


    if tx_flag:
        Send(c, d)  # 发送数据给设备
        tx_flag = 0  # 重置标志位,表示数据已发送

    #utime.sleep_ms(10)  # 延时等待

rx_buff.clear() # 这一行接收完数据后清空 rx_buff非常重要,如果是连续且需要实时监测的数据,不清空的话可能会导致数据延迟,表现出来的效果就是反应迟钝,严重时可能会卡死。

四、k210串口数据打包通信完整代码

from machine import UART,Timer #串口库函数
from fpioa_manager import fm   #GPIO重定向函数

#设置串口TX/RX引脚
fm.register(4, fm.fpioa.UART1_RX, force=True)
fm.register(5, fm.fpioa.UART1_TX, force=True)

#初始化串口
uart = UART(UART.UART1, 115200, read_buf_len=4096)
uart.write('Hello world!')

state = 0
rx_buff = []
tx_flag = 0

#定义串口发送打包的数据函数
def Receive(data):
    global state   #状态标志位
    global rx_buff #数据缓冲区
    global tx_flag #用于表示是否需要发送数据的标志

    if state == 0: #当状态 state == 0,如果接收到的数据为 0xb3,则进入状态 1;否则重置状态为 0
        if data == 0xb3:
            state = 1
        else:
            state = 0
            rx_buff.clear()
    elif state == 1:
        if data == 0xb3:
            state = 2
        else:
            state = 0
            rx_buff.clear()

    elif state == 2:#当状态 state ==  2,将接收到的数据追加到接收缓冲区 rx_buff 中
        rx_buff.append(data)
        state = 3
    elif state == 3:
        rx_buff.append(data)
        state = 4

    elif state == 4:#当状态 state == 4,如果接收到的数据为 0x5b,则提取 rx_buff 中的第一个和第二个字节作为有效数据 x 和 y,并输出
        if data == 0x5b:
            x = rx_buff[0]
            y = rx_buff[1]
            print("Received: x =", x, "y =", y)
            rx_buff.clear()  # 清空 rx_buff
            uart.read(uart.any())
            state = 0       # 重置 state 为 0
            tx_flag = 1  # 设置标志位,表示需要发送数据
    else:
        state = 0
        rx_buff.clear()

#定义串口打包发送函数
def send(c,d):
    FH = bytearray([0xb3,0xb3,c, d,0x5b])#打包数据
    uart.write(FH);#串口发送数据



while True:
    if uart.any():
        data = uart.readchar()  # 从串口读取一个字节数据
        Receive(data)  # 处理接收到的数据


    if tx_flag:
        Send(c, d)  # 发送数据给设备
        tx_flag = 0  # 重置标志位,表示数据已发送

    #utime.sleep_ms(10)  # 延时等待

总结

以上就是k210和openmv串口打包通信的一些相关代码,希望能帮助到有需要的朋友。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值