因为要完成上位机与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;
} */
}