引言

经常的时候我们要实现两个代码之间的通信,比如说两个不同不同人写的代码要对接,例如将python指令控制Arduino控件的开关,此处使用串口通信是非常方便的,下面笔者将结合自己踩过的坑来讲述下自己的学习经历。

首先是挑战杯审报的一个项目,即采用机器学习模型分类数据,结合Arduino的压力传感器模块,而机器学习大多采取python,数据无法做到实时传输,最后放弃了。

图1 压力传感器模型

然后是python需要通过Arduino的北斗模块获取位置数据,这个也需要做两个代码之间的通信。

当时的我被这两个问题卡了好久也没有想到解决方案

感觉像是很复杂又完全没有思路

后来查阅大量资料终于得到解决

此处大概有两个重要的环节:串口通信和上位机控制

在说之前我们先要了解一下串行接口

伟大的百度百科告诉我们:

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

(传送速度较慢这个。。。)

(反正我们就传个几KB的数据,慢就慢吧)

(手动微笑)

串口通信

打开我们的Arduino编译器,可以看到有一个选择板子所在的端口的选项

图2 Arduino编译器的端口

像此处写的COM4就是指的是Arduino开发板所在的串口,如果需要通过Arudino来上传代码到开发板上所需要使用的就是这个串口来与Arduino开发板进行通信

用过的人都知道Arduino有一个串口监视器(图右上角)和一个Serial.print()函数

图3 串口监视器的位置

如果我们使用Serial.print()函数的话,传过来的数据就能够成功的在串口监视器上显示出来

图4 Serial.print()函数结合串口监视器的描述

那么我们需要思考一个问题:

既然传过来的数据能够用Arduino来看

那么其他的软件如果能够打开的话效果就会非常好

由此我们就需要做串口通信的问题啦

--------------------------------------------------------------------------------------------------------------------------------------------------

知识链接:其实Arduino主要起到的仅仅只有一个编译的作用,这个串口监视只是它的副业。。

--------------------------------------------------------------------------------------------------------------------------------------------------

一、设置串口

此处我们采用python打开这个串口以实现串口通信

编译器使用pyCharm

首先安装pyserial

图5 安装pyserial

(万能的pip install真好用)

pyserial的作用在于提供一个从串口读取信息的接口

现在我们已经拥有串口通信的基础了

赶紧把包导进来(注意使用import serial而不是import pyserial)

这里介绍一个基本函数serial.Serial(a,b,c)来设置一个串口

a为一个字符串代表串口的位置(如COM3)

b为一个数字代表波特率

(值得注意的是Arduino中Serial.begin()所设定的东西一定要求与你读到的波特率相同)

c为超时的时间,单位为s

初始化如图所示

图6 串口设置与初始化

此处的意义是打开一个名字叫COM1的串口,以9600波特率,0.5秒作为超时

二、读取信息

采用readline函数以读取一列数据

由于此处我们定义的变量是ser

所以下面也同样使用ser

即ser.readline()函数

下面贴出代码

首先是python端代码

图7 python端代码和运行结果(由于此处我是COM4串口就设置的是COM4)

  1. import serial
  2.  
  3. serialPort = "COM4" # 串口
  4. baudRate = 9600 # 波特率
  5. ser = serial.Serial(serialPort, baudRate, timeout=0.5)
  6. print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
  7.  
  8. while 1:
  9. str = ser.readline()
  10. print(str)
  11.  
  12. ser.close()

然后是Arduino端代码

  1. void setup(){
  2. Serial.begin();
  3. }
  4. void loop(){
  5. Serial.print("Hello,World!\n");
  6. }

至此

Arduino端向python端传输数据已经完成

上位机控制

由于Arduino的控制很有可能需要其他代码传送运行结果给它

所以上位机对于Arduino的控制也是十分有意义的

利用上位机的控制

我们能够实现代码直接控制开关的结果

例如输入一个数然后开关打开灯亮

此处我们就采用这个作为Model

一、Arduino函数介绍

此处要介绍三个新的函数Serial.read() Serial.available() pinMode()

1.Serial.read()

这个函数的作用在于从COM接口读取一个字节的数据

2.Serial.available()

这个函数的作用在于查看COM接口是否有数据读入

3.pinMode((串口号),OUTPUT) 将一个端口设置为输出口

有了这两个函数过后接下来会简单很多

二、接口实现

Arduino端口

我们需要实现以下功能:

1.灯原来亮

2.按下0后灯灭

3.按下1后灯亮

首先我们需要向Arduino芯片内写入代码

但有一点需要注意

如果要将二极管LED直接接到接口上的话只能接13号接口

因为13号接口自带正好适合LED的电阻

有了上面的基础

我就直接贴代码了

附带详细注释哦

  1. void setup(){
  2. Serial.begin();
  3. pinMode(, OUTPUT);//设置13号端口作为输出端口
  4. digitalWrite(,HIGH);//让灯开始时亮
  5. }
  6. char var;
  7. void loop(){
  8. while(Serial.available()>)//当有信号的时候
  9. {
  10. var=Serial.read();
  11. if(var=='')//传过来的是0
  12. digitalWrite(,LOW);
  13. if(var=='')//传过来的是1
  14.  digitalWrite(,HIGH);
  15. }
  16. }

python端口

此处python接口采用serial中的write函数来向串口中写入数据

注意一下输入的一定要是ASCII字符

否则Arduino接口无法读出的

  1. # -*- coding: utf-8 -*-
  2. import serial
  3.  
  4. serialPort = "COM4" # 串口
  5. baudRate = 9600 # 波特率
  6. ser = serial.Serial(serialPort, baudRate, timeout=0.5)
  7. print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
  8.  
  9. demo1=b""#将0转换为ASCII码方便发送
  10. demo2=b""#同理
  11. while 1:
  12. c=input('请输入指令:')
  13. c=ord(c)#将c转换为UTF-8标准数字
  14. if(c==48):
  15. ser.write(demo1)#ser.write在于向串口中写入数据
  16. if(c==49):
  17. ser.write(demo2)

运行结果如下:

图8 输入0时关闭

图 9 输入1时打开

------------------------------------------------------------------------------------------------------------------------------------------------------

几点注意事项:

1.接口不一定统一

2.其中函数笔者是依据自己理解来描述的,如果有问题的话希望各位大佬不要喷

3.Arduino真是太好玩了

如果各位大佬觉得笔者这篇写的还算可以的话欢迎打赏哦

2018-12-31  01:26:53  Author:Lance Yu

基于Arduino和python的串口通信和上位机控制的更多相关文章

  1. C#做一个简单的进行串口通信的上位机

    C#做一个简单的进行串口通信的上位机   1.上位机与下位机 上位机相当于一个软件系统,可以用于接收数据.控制数据.即可以对接收到的数据直接发送操控命令来操作数据.上位机可以接收下位机的信号.下位机是 ...

  2. Arduino学习笔记⑥ 硬件串口通信

    1.前言     Ardunio与计算机通信最常用的方式就是串口通信.在Arduino控制器上,串口都是位于Rx和Tx两个引脚,Arduino的USB口通过一个转换芯片与这两个串口引脚连接.该转换芯片 ...

  3. Python的串口通信(pyserial)

    串口通信是指外设和计算机间,通过数据信号线 .地线.控制线等,按位进行传输数据的一种通讯方式.这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低.串口是计算机上一种非 ...

  4. Arduino和C51之串口通信

    技术:51单片机.Arduino.串口通信   概述 本文主要讲解串口通信技术的使用方法,并通过串口点灯实验介绍了51单片机和Arduino串口的使用,为初学者学习串口知识提供帮助 详细 代码下载:h ...

  5. 基于FPGA的电压表与串口通信(上)

    实验原理 该实验主要为利用TLC549采集模拟信号,然后将模拟信号的数字量通过串口发送到PC上上位机进行显示,使用到的TLC549驱动模块在进阶实验已经使用到了,串口模块在基础实验也已经使用到了,本实 ...

  6. 基于ROS和beaglebone的串口通信方式,使用键盘控制移动机器人

    一.所需工具包 1.ROS键盘包:teleop_twist_keyboard  2.ROS串口通讯包:serial $ cd ~/catkin_ws/src $ git clone https://g ...

  7. C# 实现自定义的USB设备与上位机进行通信(上位机部分)

    因为以前没用过USB,对USB也不了解,于是上网查了很多资料,不过网上的资料都是零零散散,不清不楚的,于是我自己总结了一下,下面几个链接是网上这么多零散资料里,我觉得比较有参考意义的. USB设备连接 ...

  8. 基于FPGA的电压表与串口通信(下)

    实验操作 上电 接入5V电源,用配套的线,USB那端接电脑即可: 电源开关 按下电源开关 接串口线 接下载线 现在电脑装串口线驱动 R340qd.zip 双击进行安装 设置串口调试助手 Com1要根据 ...

  9. Python实现串口通信(pyserial)

    pyserial模块封装了对串口的访问,兼容各种平台. 安装 pip insatll pyserial 初始化 简单初始化示例 import serial ser = serial.Serial('c ...

随机推荐

  1. node exporter

    在prometheus中负责数据汇报的程序统一叫做exporter; 负责主机信息收集的node_exporter 可以利用prometheus的static_configs来拉取node_expor ...

  2. 201871010111-刘佳华《面向对象程序设计(java)》第十三周学习总结

    201871010111-刘佳华<面向对象程序设计(java)>第十三周学习总结 实验十一 图形界面事件处理技术 实验时间 2019-11-22 第一部分:理论知识总结 1.事件源:能够产 ...

  3. layUI学习第一日:myeclipse中使用layUI

    第一步:下载layUI,网址:https://www.layui.com/ 第二步:查看layUI解压后的内容,和官网解释各个文件夹的内容 第三部:在myeclipse中新建一个web project ...

  4. UVA11464 Even Parity 搜索+递推

    问题描述 UVA11464 题解 第一直觉爆搜. 发现 \(N \le 15\) ,然后后面每行都可以通过第一行递推出来. 爆搜第一行,递推后面+check \(\mathrm{Code}\) #in ...

  5. Vue 使用数组和对象控制Class

    直接上代码: <!doctype html> <html lang="en"> <head> <meta charset="UT ...

  6. Eclipse左侧的工程目录消失解决办法

    菜单栏window---->show view--->other--->project explorer

  7. 对mglearn库的理解(转)

    https://blog.csdn.net/az9996/article/details/86490496

  8. 一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生

    在网络的初期,网民很少,服务器完全无压力,那时的技术也没有现在先进,通常用一个线程来全程跟踪处理一个请求.因为这样最简单. 其实代码实现大家都知道,就是服务器上有个ServerSocket在某个端口监 ...

  9. Springboot2 Metrics之actuator集成influxdb, Grafana提供监控和报警

    到目前为止,各种日志收集,统计监控开源组件数不胜数,即便如此还是会有很多人只是tail -f查看一下日志文件.随着容器化技术的成熟,日志和metrics度量统计已经不能仅仅靠tail -f来查看了,你 ...

  10. RESTful服务最佳实践(转)

    原文:https://www.cnblogs.com/jaxu/p/7908111.html 译文作者:Jaxu 英文原文:https://files-cdn.cnblogs.com/files/ja ...