一次艰苦的串口通信尝试--pc端的python vs. arduino

本文分享了一个串口通信的实例,包括上位机与Arduino的代码实现。通过结构体打包和解包的方式,成功实现了六个浮点数的传输,适合初学者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为要完成上位机与arduino之间的通信,对串口知之甚少的我进行了各种摸索和尝试,网上能搜到的完整代码几乎没有,个别代码有上下位机代码的帖子,也不能完成我的项目中的通信任务,无奈自己一边查网络帖子,一边写程序,经过两天努力,完成如下代码,实测可用,在此奉上,以供诸君查询使用。如果你有更好的解决方案,望积极评论,不吝赐教:

上位机代码:

# 作者 Tom13a   gongal@163.com
import serial
import struct
import time
import numpy as np

ser = serial.Serial('com7', 115200, timeout=0.2) #定义串口,可以根据需要把com7改为合适的值。
list1=(-4.56193261e-09, -2.04158549e-05, 4.25339884e-05, 0.999977879, 0.999999998, 1.0) #要传输的数据,六个浮点数,放在list1里面。
time.sleep(3)

for i in range(1,6):    
 data0 = list1[0]
 data1 = list1[1]
 data2 = list1[2]
 data3 = list1[3]
 data4 = list1[4]
 data5 = list1[5] # 赋值到结构体  

 data = struct.pack('>ffffff', data0, data1, data2, data3, data4, data5) #结构体打包
 ser.write(data)
 time.sleep(0.5)
 print(data)
#read
 data = ''
 p=ser.inWaiting()
 print(p)
 if p>=24:   
   
 
   data_temp = ser.read(24)
   time.sleep(0.4)
   #data_p=ser.read(2)
   data = struct.unpack('<ffffff', data_temp)   #结构体解包
   print(data)
  # print(data_p)
 else:
     datat=ser.read(p)
 
在这里插入代码片

下位机代码:

//定义一个comdata字符串变量,赋初值为空值
    String comdata = "";
    int size1;



    //numdata是分拆之后的数字数组
    int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0;
    void setup()
    {
    //定义0~6脚是输出
      for(int i = 0; i < 6; i++) pinMode(PWMPin[i], OUTPUT);
      Serial.begin(115200);
      Serial.flush();
    }
      typedef struct sdata

    {
         float  a0;
         float  a1;
         float  a2;
         float  a3;
         float  a4;
         float  a5;

    };  //如果需要对结构体里的元素单个赋值,就用: float list0[6]={list0[0],list0[1],list0[2],list0[3],list0[4],list0[5]};
    
    
    void loop()
    {
float list0[6]={0.01380237000, -0.16868371,  1.07774284, -0.90905913,  2.81380237 , 0.1};
  
   struct sdata t1={12308, -1.77590998000e-03, 0.00000000e+00 , 1.00111152000e+00 ,1.00066536e+00 , 1.00123030e+00};
   delay(500);
  
      
  /* size1=sizeof(sdata);
   byte b[size1];
    memcpy(b,&t1,size1);
    Serial.write(b,size1);
    delay(2000);*/

    byte *tobyte=(byte*)&t1;   
    delay(100);
    Serial.write(tobyte,sizeof(sdata));  
    delay(100);

   //如下这段注释掉的代码,可以用于做串口试验:
     /* while (Serial.available() > 0)
      {
      //读入之后将字符串,串接到comdata上面。
        comdata +=char( Serial.read());
         
        
        delay(2);
        //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
        mark = 1;
      } */
   
 
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值