以下内容为自学嵌入式个人笔记,如有出入,请言谈并同进步。
需求
为实现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
}
/********************************************************/
}