电子爱好者应该不会对“上位机”这个词感到陌生,毕竟或多或少有过接触。但若是说到上位机的开发的话,大家就不一定熟悉了。很多电子爱好者完全没有接触过上位机的开发工作,他们真的没有相应的需求吗?不,究其原因,国内相关开发资料和例子不足,所以初学者在学习过程中几乎不会接触到相关内容。

近来刚好手上有个小东西需要做个上位机,在C#、Matlab、QT、Labview之间徘徊许久之后最终选择了Python,继而了解了一些相关知识,在此分享一些我整理的经验,希望能够帮助后来者。

从一个按键开始

一个简单的demo

Python作为一种脚本语言,一大优势就是可以方便地调用各种各样的库。比如,可以使用Qt的一些组件,在Python中调用Qt~~~~可以参考这个官方示例。

例子里面的核心代码如下:

@Slot()

def say_hello():

print("Button clicked, Hello!")

# Create the Qt Application

app = QApplication(sys.argv)

# Create a button, connect it and show it

button = QPushButton("Click me")

button.clicked.connect(say_hello)

button.show()

# Run the main Qt loop

app.exec_()

首先,定义了一个函数say_hello来打印输出信息,“@Slot()”是一个装饰器,表明该函数是一个“槽”,对此概念不了解的童鞋需要补一点QT的知识。然后,创建了一个QT应用、创建了一个按钮控件、将函数say_hello连接到按键、显示按钮控件,最后,启动QT主循环。

创建应用和启动主循环可以说是调用QT组件的“套路”,关于button的操作则示范了一个操作空间的大概流程。此外,作为按钮控件,say_hello可以理解为button的“事件函数”,每发生一次按钮按下的事件,函数就被执行一次。

明确我们的需求

基于官方的demo,我们可以进行一些修改来创建自己的应用。当然,首先要明确需求,我们的上位机应当能够对下位机进行控制,就以LED的控制为例子把,上位机具有一个按键,按一下板载LED(单个)亮起,再按一下熄灭,同时,按键上最好能够通过颜色或文字显示LED当前的状态。

改造demo

我们把槽函数修改如下:

led = "ON"

# @Slot()是一个装饰器,标志着这个函数是一个slot(槽)

@Slot()

def led_toggle():

'''按下按钮,翻转LED状态'''

global led

if led == "ON":

led = "OFF"

button.setText("LED OFF!")

else :

led = "ON"

button.setText("LED ON!")

print(led)

在定义函数前我们创建了一个叫led的字符串并指向“ON”,在函数内部我们声明led为全局的(python默认指定为局部变量),并对led的内容进行判断,如果其指向的内容为“ON”,修改它以指向“OFF”,并通过setText这一方法设置按键上的文字为“LED OFF!”。不为“ON”时的操作基本也是这样。

修改之后demo的运行效果如下:(按下后变为LED ON!/LED OFF!)

修改后的demo的完整代码在这里

建立桥梁——串口和JSON

serial库的简单使用

在单片机上,串口是极常用的通信接口,上位机对单片机的控制可以基于串口来进行,python中控制串口需要使用serial库。

serial库下的Serial方法可以创建并返回一个串口对象,使用的例子如下:

ser = serial.Serial('COm10',115200,timeout=0.5) #打开指定串口

该方法默认设置数据为“8N1”格式,一般指定com口、波特率和超时时间(单位:ms)即可。

(com端口自己开设备管理器看)

有了串口对象就可以发数据了,写入的例子如下:

ser.write(b"hello serial!")

b表示将字符串以字节(bytes)形式编码并发送。

json库的简单使用

json是一种常用的、跨平台的数据交换格式,对于我们这个“控制一个LED的亮灭”的需求,使用一个键值对就可以解决。

例如,我们首先创建一个data_on来存源数据。

data_on = { 'led' : 0 }

关于值的意义,我们可以规定0表示LED亮、1表示LED灭。

然后,把源数据打包为json字符串。

json_led_on = json.dumps(data_on, sort_keys=True, separators=(',', ':'))

类似的,可以创建一个内容为“{"LED":1}”的json字符串。

串口发送json的测试用例在这里

完整的上位机

虽然说我们已经能够通过串口发数据了,但是自己指定串口号还是有些麻烦,这里提供一个搜索并返回可用串口列表的程序。

加上这个,再合并一下代码,我们控制LED的简易上位机就完成了,代码在这里。

当然,下位机还等着写呢。

下位机的处理

在这篇文章中,我对在Keil里面使用jansson库处理JSON的方法进行了一些讲解,这次的使用没有超过原来的范围,不赘述了。

核心业务部分的代码如下:

void Task_LEDControl()

{

uint16_t len = 0;

int led = 0;

char json_RX_buffer[400] = {'\0'};

json_t *led_raw;

json_error_t error;

if(usart1_rx_ok == 1)

{

usart1_rx_ok = 0;

len = usart1_rx_count;

usart1_rx_count = 0;

for(uint16_t i=0;i

json_RX_buffer[i] = usart1_rx_buffer[i];

}

led_raw = json_loads(json_RX_buffer, JSON_ENCODE_ANY, &error);

json_unpack(led_raw,"{s:i}","led",&led);

if(led == 0) {

Board_LED_ON();

printf("led on!\n");

}

else {

Board_LED_OFF();

printf("led off!\n");

}

json_delete(led_raw); //删除json对象

memset(json_RX_buffer,0x00,sizeof(json_RX_buffer)); //清空数组

}

}

完整工程在这里

最终的演示效果如下:

(PS. 由于作者水平有限,再加上编写时尽量追求“新手友好”而不是代码量或效率的最优,所以很多地方可能并不简洁优雅,这一点还请原谅)

用python做一个上位机串口通信_【教程】简易Python上位机之LED控制相关推荐

  1. 用python做一个简单的投票程序_以一个投票程序的实例来讲解Python的Django框架使...

    (一)关于Django Django是一个基于MVC构造的框架.但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model).模板(Template ...

  2. 如何用python做一个会聊天的女朋友_戏精程序员,用python开发了一个女朋友,天天秀恩爱...

    很多人都知道,程序员大部分都是单身狗,然而,无奈Python实在太强大,居然可以用来开发一个女朋友出来. 其实,这个女朋友类似很多视频中,那些假装自己有女朋友或男朋友的人一样,也是在假装哦,但是程序员 ...

  3. 用python做一个简单的投票程序_如何编写一个自动投票程序

    展开全部 此文章为ocean所有32313133353236313431303231363533e59b9ee7ad9431333335346138,版权归ocean所有 如何编写投票程序,大致分为这 ...

  4. python做一个本地搜索工具_SecretFinder:一款基于Python脚本的JavaScript敏感信息搜索工具...

    SecretFinder工具介绍 SecretFinder是一款基于LinkFinder实现的Python脚本(如需BrupSuite版本,请点击这里),该工具的主要功能是帮助研究人员发现JavaSc ...

  5. 用python做一个表白软件手机版_用python写一个5.20的表白小程序吧

    (这两天老用matplotlib画那种很严肃的论文图,实在是很想偷偷画点儿别的放松下.) 恰好今天520,发现一个很美的数学公式. 这样的公式始祖来源于数学家笛卡尔的心形公曲线.而这背后是一个凄美的爱 ...

  6. 用python做一个表白神器_30秒教会你用Python制作520表白神器

    import turtleimport time# writing txtturtle.hideturtle()turtle.penup()turtle.goto(80, 50)# turtle.pe ...

  7. python 提取一个单词的所有字母_如何用python提取单词(正则表达式or分割)

    "What brings u here today!"(今天什么风把你吹过来了!),相信大家也是遇到和我一样的难题了吧,想把字母提取出来很简单,但是想把整个单词(还不是相同的单词) ...

  8. 用python做股票智能投顾模型_如何用Python建模GGM模型并对股票估值?

    内容首发 乐学偶得(http://lexueoude.com) 公众号: 乐学Fintech 用代码理解分析解决金融问题 首先我们快速了解一下什么是GGM模型. GGM模型又叫做"戈登增长模 ...

  9. python做简单的笑脸的编程_怎么用python实现画笑脸

    在Python中画笑脸可以使用turtle库实现. 1.打开idel,通过idel新建一个py文件,在空白的文件中输入下面的代码按F5运行此文件就可以画笑脸了.from turtle import * ...

最新文章

  1. mysql的or能去重吗_mysql条件查询中AND与OR联合使用的注意事项!
  2. 【Linux】FrameBuffer操作入门
  3. Spring-基于注解的配置[02自动装载bean]
  4. 7-26复习重载并实现重载部分符号
  5. Pod详解-生命周期-钩子函数
  6. 报错 插入更新_window如何解决mysql数据量过大导致的报错
  7. 配置多个git账号_一台电脑,两个及多个git账号配置
  8. 浙大PAT甲级1019. General Palindromic Number (20)
  9. 苹果自动驾驶测试车近距离实拍,头顶新添传感器和硬件
  10. MySQL中索引的长度的限制
  11. 【BZOJ4011】【HNOI2015】落忆枫音 拓扑图DP,
  12. python开发抢票软件_python自动抢票神器
  13. C++中模板的特化与偏特化
  14. python云图_python聚合云图
  15. 《算法新解》作者刘新宇:我只是想打开那些黑盒子,告诉人们里面有什么。
  16. c 汇编语言小程序100例,汇编语言小程序例子.doc
  17. 如何使用Tera Term Language (TTL)
  18. canvas 制作验证码
  19. 数据相关的在职研究生_大数据在职研究生都学什么?
  20. 超低功耗Lattice SensAI引领网络边缘人工智能设备迈向大众市场

热门文章

  1. PC端微信下的dat 文件在线解码还原成为图片
  2. AI医学影像技术展望
  3. python公众号监控_Python-WXPY实现微信监控报警
  4. 微信小程序tab选项卡,点击弹窗(带蒙版)五星好评-获取微信手机号码
  5. C11编译 systemc 2.3.3 和 SCV 2.0.1
  6. 搜索引擎排名和Page Rank 关联分析
  7. Unity 基于eventTriggers的3D场景交互系统
  8. opencv中直方图均衡函数cv::equalizeHist()的使用!!严格用程序进行了验证!
  9. 2018年图灵奖--约书亚·本吉奥、杰弗里·埃弗里斯特·辛顿和Yann LeCun简介
  10. fiori 换行_《[家教初代]Cielo》七子姬 ^第31章^ 最新更新:2010-10-22 23:30:40 晋江文学城_手机版...