python与Arduiono之间的双向串口通信

python与Arduiono之间的双向串口通信


以下内容为自学嵌入式个人笔记,如有出入,请言谈并同进步。

需求

为实现python与Arduino的双信号通信。

限制条件

Arduino和python之间的双向串口通道有些限制条件

1、python从串口发送数据需要编码

2、int不支持编码

3、Arduino端不内嵌解码算法

4、ASICLL码关于数字最多到9

5、设置电流强度在0-254之间

6、不间断的发送信号会有延迟

解决办法

将数据封装在json里
在python和Arduino端设置同步延迟

代码

python端

import json
import serial.tools.list_ports
import time
import random
import keyboard  # 导入 keyboard 模块
import struct

port_list = list(serial.tools.list_ports.comports())
print(port_list)
if len(port_list) == 0:
    print('none')
else:
    for i in range(0, len(port_list)):
        print(port_list[i])

try:  # set serialport parameters
    portName = "COM5"
    baudRate = 19200
    arduinoSer = serial.Serial(portName, baudRate)
    val = 0

    arduinoSer.flushInput()  # 刷新一下串口缓冲区,这样可以确保读取的数据是最新的。

    while True:
        if arduinoSer.isOpen():
            sendNumber = random.randint(0,254)
            data = {'number': sendNumber}
            json_data = json.dumps(data)  # 将数据转换为 JSON 格式

            arduinoSer.write(json_data.encode())  # 发送 JSON 格式数据到 Arduino
            print("Sent:", json_data)
            time.sleep(3)
        if arduinoSer.in_waiting > 0:
            received_number = arduinoSer.readline().decode().rstrip()
            print("Received Number:", received_number)


except Exception as e:
    print("erros occured:", e)


Arduino端
(以红绿灯为例)

#include <ArduinoJson.h>



int redPin = 11;    // select the pin for the red LED
int greenPin = 10;    // select the pin for the blueLED
int receivedNum = 0;

void setup() 
{
  pinMode(redPin, OUTPUT); //set redPin as OUTPUT
  pinMode(greenPin, OUTPUT);//set greenPin as OUTPUT
  Serial.begin(19200);
}
/******************************************************/
void loop() 
{

    if (Serial.available() > 0) {
        String json_string = Serial.readStringUntil('\n'); // 读取到换行符为止的数据
        Serial.println(json_string);
        json_string.trim(); // 移除前后空格和换行符
        DynamicJsonDocument json_doc(128); // 创建 JSON 文档,根据数据大小调整
        deserializeJson(json_doc, json_string); // 解析 JSON 数据

        receivedNum = json_doc["number"]; // 获取 JSON 中的数据
        analogWrite(redPin, receivedNum); //red value decrease
        analogWrite(greenPin, 255-receivedNum);//green value increase  
        delay(3000);
        Serial.println(receivedNum);
    }else {
        analogWrite(redPin, 0);     // 关闭红色 LED
        analogWrite(greenPin, 0);   // 关闭绿色 LED
  }
/********************************************************/
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值