当前位置: 首页 > 后端技术 > Python

【教程】SimplePythonPC之LED控制

时间:2023-03-26 18:12:41 Python

电子爱好者对“PC”这个词应该不会陌生,毕竟都或多或少接触过。但是如果说到上位机的开发,大家可能还不太熟悉。很多电子爱好者从来没有接触过上位机的开发。他们真的没有相应的需求吗?不会,原因是国内相关开发资料和实例不够,初学者在学习过程中很难接触到相关内容。最近正好手上有一个小东西需要做主机。在C#、Matlab、QT、Labview之间徘徊了半天,最终选择了Python,然后学习了一些相关的知识。我在这里分享一些我的经验,希望能够对后来者有所帮助。一键启动简单demoPython作为一种脚本语言,有一个很大的优势就是可以方便地调用各种库。比如你可以使用Qt的一些组件,在Python中调用Qt~~~~可以参考这个官方例子。示例中的核心代码如下:@Slot()defsay_hello():print("Buttonclicked,Hello!")#CreatetheQtApplicationapp=QApplication(sys.argv)#Createabutton,connectitandshowitbutton=QPushButton("Clickme")button.clicked.connect(say_hello)button.show()#运行主Qtloopapp.exec_()首先定义一个函数say_hello打印信息,“@Slot()”是一个修饰符表示该函数是一个“槽”。不懂这个概念的童鞋需要补充一点QT的知识。然后,创建一个QT应用程序,创建一个按钮控件,将函数say_hello连接到按钮上,显示按钮控件,最后,启动QT主循环。创建应用程序和启动主循环可以说是调用QT组件的“套路”,按钮的操作演示了一个操作空间的大致流程。另外,作为一个按钮控件,say_hello可以理解为按钮的“事件函数”。每当按钮按下事件发生时,该函数就会执行一次。明确我们的需求在官方demo的基础上,我们可以做一些修改来创建自己的应用。当然,首先要明确需求。我们的上位机应该可以控制下位机。以LED控制为例。上位机有一个按钮。按下板载LED(单个)点亮,然后按下它关闭。同时,最好在按钮上通过颜色或文字来显示LED当前的状态。Retrofitdemo我们修改槽函数如下:led="ON"#@Slot()是一个装饰器,标志这个函数是槽(slot)@Slot()defled_toggle():'''按下按钮,ToggleLEDstatus'''globalledifled=="ON":led="OFF"button.setText("LEDOFF!")else:led="ON"button.setText("LEDON!")打印(led)在定义函数之前,我们创建一个名为led的字符串并指向“ON”。在函数内部,我们将led声明为全局的(python默认指定为局部变量),判断led的内容,如果指向按钮的内容为“ON”,则修改为指向“OFF”,并将按钮上的文本设置为“LEDOFF!”通过setText的方法。不为“ON”时操作基本相同。修改后的demo运行效果如下:(按下它变为LEDON!/LEDOFF!)修改后的demo完整代码在这里搭桥——串口和JSONserial的简单使用library在单片机上,串口是很常用的上位机的通信接口可以基于串口控制单片机,需要用到串口库来控制python中的串口。串口库下的Serial方法可以创建并返回一个串口对象。使用示例如下:ser=serial.Serial('COm10',115200,timeout=0.5)#打开指定串口该方法默认设置数据为“8N1”格式,一般指定com口,波特率和超时时间(单位:ms)。(自己打开com口上的设备管理器看看)有了串口对象,就可以发送数据了。写入示例如下:ser.write(b"helloserial!")b表示将字符串以字节形式编码后发送。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的方法。这次使用没有超出原来的范围,就不细说了。核心业务部分代码如下:voidTask_LEDControl(){uint16_tlen=0;国际领导=0;charjson_RX_buffer[400]={'\0'};json_t*led_raw;json_error_t错误;如果(usart1_rx_ok==1){usart1_rx_ok=0;len=usart1_rx_count;usart1_rx_count=0;for(uint16_ti=0;i