前言:这个小项目是自己的毕设,做的比较简单,之前记录是pyqt的环境配置,说实话,今天突然看到自己也都忘得差不多了,看来还是要好好记录一下自己的知识。

这个项目分为了两个部分,其中下位机的数据采集是使用STM32L0系列的开发板作为了主控器,温度采集模块是DB18B20,还有一个GSM模块,用于发送短信,比较简单的项目。上位机部分也就是使用pyserial模块来进行数据的接收,使用matplotlib模块来进行绘图。

下位机部分的代码还在,但是用于时间关系,开发板等东西已经送人了,所以这篇博客主要就讲一下上位机的程序开发,但是为了和上一篇博客中实现的效果一样,我去找到了一个软件模拟下位机向PC端发送数据。

1.模拟软件向PC端发送数据–VSPD软件

找了一篇博客,包含VSPD使用教程,放上链接如下:

https://blog.csdn.net/qq_34202873/article/details/88391265

2.串口接收数据

今天准备把之前的代码拿来跑一下,但是发现出了一些小问题,这里也记载一下,被自己蠢哭的问题。

问题1:

pyserial模块的安装问题,换了环境,但是使用pip安装,以及在pycharm中进行安装,都没有成功,下载的包都是空的文件夹,其截图如下:

解决办法,去官网下载压缩包,然后解压到你的解释器的Lib/site-packages目录下,然后运行命令进行安装;

https://pypi.org/project/pyserial/#files

命令行安装

综上问题1解决

问题2(自己犯低级错误):

a.串口初始化部分

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):

def __init__(self, parent=None):

super(MainWindow, self).__init__(parent)

self.setupUi(self)

### 1. 画图

self.my_graph_1 = MyMplCanvas()

self.left1.addWidget(self.my_graph_1)

self.t = [] ### 储存计数

self.m = [] ### 储存接收的数据

self.i = 0 ### 计数值

### 2. 串口部分

# 串口初始化为None

self.ser = None

# 设置窗口名称

self.setWindowTitle("Temperature--Serial")

# 刷新一下串口的列表

# self.refresh()

# 波特率

self.comboBox_2.addItem('115200')

self.comboBox_2.addItem('57600')

self.comboBox_2.addItem('9600')

self.comboBox_2.addItem('4800')

self.comboBox_2.addItem('2400')

self.comboBox_2.addItem('1200')

# 实例化一个定时器

self.timer = QTimer(self)

# 定时器调用读取串口接收数据

self.timer.timeout.connect(self.recv)

# 打开串口按钮

self.pushButton.clicked.connect(self.open)

# 关闭串口

self.pushButton_2.clicked.connect(self.close)

# 波特率修改

self.comboBox_2.activated.connect(self.baud_modify)

# 串口号修改

self.comboBox.activated.connect(self.com_modify)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

b.数据接收及处理

# 串口接收数据处理

def recv(self):

print("recv")

data = self.ser.readline()

#print(type(data))

out_s = data.decode('iso-8859-1')

# 调试打印输出数据

print(data)

print(out_s)

float_data = float(out_s) # 数据转化为float

#print(out_s.strip('\n'))

# 存储获取的数据

self.i = self.i + 1.0

self.t.append(self.i)

self.m.append(float_data)

#self.m.append(1)

self.lineEdit.insert(out_s)

### 方法二 接收数据后调用画图函数

self.draw()

# 串口接收数据处理

def recv(self):

print("recv")

data = self.ser.readline()

#print(type(data))

out_s = data.decode('iso-8859-1')

# 调试打印输出数据

print(data)

print(out_s)

float_data = float(out_s) # 数据转化为float

#print(out_s.strip('\n'))

# 存储获取的数据

self.i = self.i + 1.0

self.t.append(self.i)

self.m.append(float_data)

#self.m.append(1)

self.lineEdit.insert(out_s)

### 方法二 接收数据后调用画图函数

self.draw()

# 波特率修改

def baud_modify(self):

if self.ser != None:

self.ser.baudrate = int(115200)

print("波特率修改\n")

# 串口号修改

def com_modify(self):

if self.ser != None:

self.ser.port = self.comboBox.currentText()

self.statusbar.showMessage("修改串口号")

print("串口号修改\n")

# 打开串口

def open(self):

print("打开串口\n")

print("true......")

# 开启定时器

self.timer.start(1000)

try:

self.ser = serial.Serial("com2", int(self.comboBox_2.currentText())) ### 为了方便使用软件发送的数据,

# 写死了串口com2口

## 测试

print(self.ser)

except:

print("没有可用的串口或当前串口被占用\n")

return None

self.statusbar.showMessage("打开串口")

print('open')

def close(self):

print("关闭串口\n")

# 关闭定时器,停止读取接收数据

# self.timer_send.stop()

self.timer.stop()

try:

# 关闭串口

self.ser.close()

except:

# QMessageBox.critical(self, 'pycom', '关闭串口失败')

return None

self.ser = None

self.statusbar.showMessage("关闭串口")

print('close!')

### 刷新串口的功能,在使用模拟软件发送数据时,关闭该功能

# def refresh(self):

# # 查询可用的串口

# plist = list(serial.tools.list_ports.comports())

# if len(plist) <= 0:

# print("No used com!");

# # self.statusBar.showMessage('没有可用的串口')

# self.statusbar.showMessage("没有可用串口")

# else:

# # 把所有的可用的串口输出到comboBox中去

# self.comboBox.clear()

# for i in range(0, len(plist)):

# plist_0 = list(plist[i])

# self.comboBox.addItem(str(plist_0[0]))

##绘制图形代码

def draw(self):

#print("IN draw\n")

if len(self.t) > 30: ### 储存的数据保持在 30 个,超过30个数据,就开始弹出数据,类似于队列的形式

self.t.pop(0)

self.m.pop(0)

self.my_graph_1.axes.cla()

self.my_graph_1.axes.plot(self.t,self.m, 'r')

self.my_graph_1.axes.set_xlabel('Times')

self.my_graph_1.axes.set_ylabel("Temperature")

self.my_graph_1.draw()1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

以上就是使用串口的部分,代码没有怎么优化,因为要期末考试啦,需要复习。。,请见谅

3. 使用绘图工具绘制图形

很简单,直接上代码啦,绘制图形的函数写在上面的类中,不是这个类,具体代码我也贴在上面

class MyMplCanvas(FigureCanvas): # 画布基类

"""这是一个窗口部件,即QWidget(当然也是FigureCanvasAgg)"""

def __init__(self, parent=None, width=100, height=50, dpi=100):

fig = Figure(figsize=(width, height), dpi=dpi)

self.axes = fig.add_subplot(111)

FigureCanvas.__init__(self, fig)

self.setParent(parent)

self.axes.set_xlabel('Times')

self.axes.set_ylabel("Temperature")1

2

3

4

5

6

7

8

9

10

11

12

13

14

4. main方法中的调用

if __name__ == "__main__":

app = QtWidgets.QApplication(sys.argv)

mainWindow = MainWindow()

mainWindow.show()

sys.exit(app.exec_())1

2

3

4

5

6

7

5.测试方法

1.运行pycharm代码

2.打开模拟软件

3.串口调试工具中手动发送数据(数据以\n\r结尾,具体看图中的标识)

4.观察生成的图形

python实时读取串口数据_串口的数据采集、以及数据的实时显示相关推荐

  1. python读取数据文件夹_使用python依次读取文件中的所有csv格式的数据

    使用python依次读取文件中的所有csv格式的数据: #coding=gbk import pandas as pd import os path = r'D:\ml_datasets\PHM\c6 ...

  2. python 串口读取地磅仪表_串口读取称或是地磅数据

    论坛里经常碰到称或是地磅对接的问题,想当年我也是一路问过来啊,自动一人在客户那磨练下就知道怎么做的了,今天总结下吧.我接触的称或是地磅都是串口输出数据,貌似都是串口输出(可能有别的我没接触到的). 1 ...

  3. python批量读取文本行_用Python读取几十万行文本数据

    我在使用python读取几十万行的文件中的数据,并构造字典,列表等数据结构时,再访问字典,列表时,一般都会出现内存不够的问题,然后只能循环读取几百行或者一定数量的行数来循环操作. keyword_li ...

  4. python怎么读取sav格式_利用Python读取外部数据文件

    利用Python读取外部数据文件 [color=rgb(0, 0, 0) !important]刘顺祥 [color=rgb(0, 0, 0) !important]摘要: 不论是数据分析,数据可视化 ...

  5. FPGA学习笔记_UART串口协议_串口接收端设计

    FPGA学习笔记 1. UART串口协议以及串口接收端设计 1 原理图 2 Verilog 代码 3 Modelsim仿真 4. FPGA板级验证 1.1 串口协议接收端设计 目标:FPGA接收其他设 ...

  6. python如何爬虫股票数据_如何抓取股票数据_用Python抓取新浪的股票数据

    python爬虫成长之路(一)抓取证券之星的股票数据 其中编译匹配模式findall方法使用这个匹配模式来匹配所需的信息并以列表的形式返回.正则表达式的语法非常多.下面我只列出使用的符号的含义.匹配除 ...

  7. python自动读取短信_自动化测试-自动获取手机短信验证码

    最近在做生产环境自动化测试,碰到一个难题就是短信验证码的获取,生产环境短信验证码是真实的,不能采用测试环境将短信验证码写成固定的方法解决,我的思路是:做一个apk小程序,将手机上的短信验证码实时读取出 ...

  8. clickhouse 航空数据_趣头条基于Flink+ClickHouse的实时数据分析平台

    原标题:趣头条基于Flink+ClickHouse的实时数据分析平台 分享嘉宾:王金海 趣头条 编辑整理:王彦 内容来源:Flink Forward Asia 出品平台:DataFunTalk 导读: ...

  9. python爬虫excel数据_最简单的爬数据方法:Excel爬取数据,仅需6步

    原标题:最简单的爬数据方法:Excel爬取数据,仅需6步 在看到这篇文章的时候,大家是不是都还停留在对python爬虫的迷恋中,今天就来教大家怎样使用微软的Excel爬取一个网页的后台数据,注:此方法 ...

  10. python学得好牢饭_英雄联盟LPL比赛数据可视化详细教程,可视化的魅力,你值得拥有!!!...

    LPL比赛数据可视化 完成这个项目,我感觉我已经被掏空了,我几乎用尽了我会的所有知识 html+css+javascript+jQuery+python+requests+numpy+mysql+py ...

最新文章

  1. RTX组织架构刷新出现了问题
  2. Socket网络协议之二
  3. 简述深度学习预训练和正则化
  4. XenDesktop 5.6 PVS6.1测试中出现的一例错误:Management Interface:Remote request failed
  5. 腾讯在信息流内容理解技术上的解决方案
  6. Linux下批量替换文件内容和文件名(转)
  7. selenium2.0(WebDriver) API - 转载自:http://www.cnblogs.com/puresoul/p/3477918.html
  8. Java String to InputStream
  9. 数字电子技术基础-2-逻辑函数的最小项与最大项
  10. 【Ubuntu和本地电脑互传文件】
  11. 11.4.2 内存映射的相关接口
  12. 5g手机可以用4g的手机卡吗
  13. 计算机的自动播放功能有什么用,禁用自动播放功能的几种方法
  14. Rational License Key Error的永久解决办法
  15. 中国老百姓一生要交多少税?
  16. 2020年高教社杯全国大学生数学建模竞赛 C题思路
  17. 脚本及恶意网页攻击实验
  18. JavaEE:RocketMQ安装与使用
  19. VGG (Visual Geometry Group)
  20. OneHotEncoder

热门文章

  1. Postman设置环境变量
  2. PG数据库创建视图并授权给新用户
  3. Linux dstat监控工具简讲
  4. RAM格式与JPG对比
  5. python模拟登陆steam
  6. Arduino使用蓝牙通信模块
  7. 华为 C/C++ 编程规范(精华总结)
  8. virutalbox 无线网卡桥接
  9. BRVAH(BaseRecyclerViewAdapterHelper)详解
  10. Java的常用集合框架