python串口通信实例_python3串口通信

高考志愿 2025-01-04 10:30:33

如何编写自己的串口通讯协议

workersdef sendMail(self): = min(MAX_WORKERS,len(cc_list))

下面以一个例程来做说明:

python串口通信实例_python3串口通信python串口通信实例_python3串口通信


python串口通信实例_python3串口通信


ARDUINO 代码打印

int incomingByte = 0; // 接收到的 data byteString inputString = ""; // 用来储存接收到的内容boolean newLineReceived = false; // 前一次数据结束标志 void setup() { Serial.begin(9600); //设定通讯端口及速率} void loop() { if (newLineReceived) { Serial.print(inputString); // 这里只是简单的将它打出来了,你可以根据自己的要求来用你接收到的数据...... inputString = ""; // clear the string newLineReceived = false; ........//其他你的程序 }} //serialEvent()是IDE1.0及以后版本新增的功能,不清楚为什么大部份人不愿意用,这个可是相当于中断功能一样的啊! void serialEvent(){ while (Serial.ailable()) { incomingByte = Serial.read(); //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包 inputString += (char) incomingByte; // 全双工串口可以不用在下面加延时,半双工则要加的// // 下面就是所谓的通讯协议了,如果接收到了换行符号,本例是定义了这次串口通讯数据接收结束// // 其他的你还可以加一些规则,比如数据包起始位,规定一个数据包就是以FF为开头的,如果不是就不接收// // 也可以加上数据校验位,同样在这里做一个校验判断,如果不符合,则将数据包丢掉,再通过一个标志位写个值,// //在主程序里面让发送方重发(主程序里面都写一条IF就行了)// if (incomingByte == 'n') { newLineReceived = true; } }}

uart是micropython内置库还是第三方库,怎么安装micro python第三方库?

为了用DB-API编写MySQL脚本,必须确保已经安装了MySQL。以下代码,并执行:

UART通信是MicroPython的内置库之一,可以直接在MicroPython的控制台或脚本中使用。UART通信库提供了一种与串口通信设备进行通信的方式,具有发送和接收数据的功能。

#打开包含中文的文件

Python如何通过future处理并发问题的实例详解

#用记事本打开aa.txt

这篇文章主要介绍了Python通过future处理并发问题,非常不错,具有参考借鉴价值,需要的朋友可以参考下

future初识

通过下面脚本来对future进行一个初步了解:

例子1:普通通过循环的方式

import os

import time

import sys

import requests

POP20_CC = (

"CN IN US ID BR PK NG BD RU JP MX PH VN ET EG DE IR TR CD FR"

).split()

BASE_URL = ''

DEST_DIR = 'downloads/'

def se_flag(img,filename):

path = os.path.join(DEST_DIR,filename)

with open(path,'wb') as fp:

fp.write(img)

def get_flag(cc):

= "{}/{cc}/{cc}.gif".format(BASE_URL,cc=cc.lower())

return resp.content

def show(text):随着vb版本的不断升级,vb将成为快速、易用、强劲的应用开发工具,是企业级客户/应用软件开发的工具之一。

print(text,end=" ")

sys.stdout.flush()

def download_many(cc_list):

for cc in sorted(cc_list):

image = get_flag(cc)

show(cc)

se_flag(image,cc.lower()+".gif")

return len(cc_list)

def main(download_many):

t0 = time.time()

count = download_many(POP20_CC)

elapsed = time.time()-t0

msg = "

{} flags downloaded in {:.2f}s"

print(msg.format(count,elapsed))

if __name__ == '__main__':

main(download_many) 例子2:通过future方式实现,这里对上面的部分代码进行了复用

from concurrent import futures

from flags import se_flag, get_flag, show, main

MAX_WORKERS = 20

def download_one(cc):

image = get_flag(cc)

show(cc)

se_flag(image, cc.lower()+".gif")

return cc

def download_many(cc_list):

res = executor.map(download_one, sorted(cc_list))

return len(list(res))

if __name__ == '__main__':

main(download_many) 分别运行三次,两者的平均速度:13.67和1.59s,可以看到别还是非常大的。

future

future是concurrent.futures模块和asyncio模块的重要组件

从python3.4开始标准库中有两个名为Future的类:concurrent.futures.Future和asyncio.Future

这两个类的作用相同:两个Future类的实例都表示可能完成或者尚未完成的延迟计算。与Twisted中的Deferred类、Tornado框架中的Future类的功能类似

注意:通常情况下自己不应该创建future,而是由并发框架(concurrent.futures或asyncio)实例化

原因:future表示终将发生的事情,而确定某件事情会发生的方式是执行的时间已经安排好,因此只有把某件事情交给concurrent.futures.Executor子类处理时,才会创建concurrent.futures.Future实例。

如:Executor.submit()方法的参数是一个可调用的对象,调用这个方法后会为传入的可调用对象排定时间,并返回一个

future

客户端代码不能应该改变future的状态,并发框架在future表示的延迟计算结束后会改变期物的状态,我们无法控制计算何时结束。

这两种future都有.done()方法,这个方法不阻塞,返回值是布尔值,指明future链接的可调用对象是否已经执行。客户端代码通常不会询问future是否运行结束,而是会等待通知。因此两个Future类都有.add_done_callback()方法,这个方法只有一个参数,类型是可调用的对象,future运行结束后会调用指定的可调用对象。

.result()方法是在两个Future类中的作用相同:返回可调用对象的结果,或者重新抛出执行可调用的对象时抛出的异常。但是如果future没有运行结束,result方法在两个Futrue类中的行为别非常大。

对concurrent.futures.Future实例来说,调用.result()方阻塞调用方所在的线程,直到有结果可返回,此时,result方法可以接收可选的timeout参数,如果在指定的时间内future没有运行完毕,会抛出TimeoutError异常。

而asyncio.Future.result方法不支持设定超时时间,在获取future结果使用yield from结构,但是concurrent.futures.Future不能这样做

不管是asyncio还是concurrent.futures.Future都会有几个函数是返回future,其他函数则是使用future,在开始的例子中我们使用的Executor.map就是在使用future,返回值是一个迭代器,迭代器的__next__方法调用各个future的result方法,因此我们得到的是各个futrue的结果,而不是future本身

关于future.as_completed函数的使用,这里我们用了两个循环,一个用于创建并排定future,另外一个用于获取future的结果

from concurrent import futures

from flags import se_flag, get_flag, show, main

MAX_WORKERS = 20

def download_one(cc):

image = get_flag(cc)

show(cc)

se_flag(image, cc.lower()+".gif")

return cc

def download_many(cc_list):

cc_list = cc_list[:5]

with futures.ThreadPoolExecutor(max_workers=3) as executor:

to_do = []

for cc in sorted(cc_list):

future = executor.submit(download_one,cc)

to_do.append(future)

msg = "Secheduled for {}:{}"

print(msg.format(cc,future))

results = []

for future in futures.as_completed(to_do):

res = future.result()

msg = "{}result:{!r}"

print(msg.format(future,res))

results.append(res)

return len(results)

if __name__ == '__main__':

main(download_many) 结果如下:

注意:Python代码是无法控制GIL,标准库中所有执行阻塞型IO作的函数,在等待作系统返回结果时都会释放GIL.运行其他线程执行,也正是因为这样,Python线程可以在IO密集型应用中发挥作用

以上都是concurrent.futures启动线程,下面通过它启动进程

concurrent.futures启动进程

concurrent.futures中的ProcessPoolExecutor类把工作分配给多个Python进程处理,因此,如果需要做CPU密集型处理,使用这个模块能绕开GIL,利用所有的CPU核心。

其原理是一个ProcessPoolExecutor创建了N个的Python解释器,N是系统上面可用的CPU核数。

使用方法和ThreadPoolExecutor方法一样

python如何连接数据库

params用字典可以传多个

Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。

Python DB-API使用流程:

引入 API 模块

获取与数据库的连接

执行SQL语句和存储过程

关闭数据库连接

什么是MySQLdb?

MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。

#!/usr/bin/python

# -- coding: UTF-8 --

import MySQLdb如果执行后的输出结果如下所示,意味着你没有安装 MySQLdb 模块:

Traceback (most recent call last):

File "test.py", line 3, in

import MySQLdb

ImportError: No module named MySQLdb数据库连接

连接数据库前,请先确认以下事项:

您已经创建了数据库 TESTDB.

在TESTDB数据库中您已经创建了表 EMPLOYEE

EMPLOYEE表字段为 FIRST_NAME, LAST_NAME, AGE, SEX 和 INCOME。

连接数据库TESTDB使用的用户名为 "testuser" ,密码为 "test123",可以自己设定或者直接使用root用户名及其密码,Mysql数据库用户授权请使用Grant命令。

在你的机子上已经安装了 Python MySQLdb 模块。

实例:

以下实例链接Mysql的TESTDB数据库:

#!/usr/bin/python

# -- coding: UTF-8 --

import MySQLdb

# subnonperiodic-timer()打开数据库连接

db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )

# 使用cursor()方法获取作游标

cursor = db.cursor()

# 使用execute方法执行SQL语句

cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法获取一条数据

data = cursor.fetchone()

print "Database version : %s " % data

# 关闭数据库连接

db.close()执行以上代码

Database version : 5.0.45

VisualBasic串口通信程序设计

1mscomm.vbx通信控件描述

mscomm.vbx通信控件可直接从vb的toolbox中加入窗体form,即可用其进行通信。若toolbox中无此控件,则用tools的customcontrols将mscomm.vbx从windows的子目录中加入vb的toolbox中。

1.1通信方式

mscomm.vbx有2种不同的方式来处理和解决各类通信软件的开发和设计问题

1、驱动。它与c/c 写windows软件时的窗口回调函数类似,是1种功能强大的处理问题的方法。在实际工作中,往往要处理许多通信中的相关,例如:当线路数据到达本端或cd线和rts信号线状态发生变化时,要求我们使用相应的来跟踪和处理,该控件是使用oncomm来实现的,它也包括检测和处理通信错误等方面的问题,commnt值返回近的通信或错误的数字代码。通信控件详细的错误和举例有:

mscomm-er-break收到1个breaksignal

mscomm-er-cdtocd信号超时

mscomm-ev-cdcd信号改变

2、查询方式。由程序设计者负责读取commnt的值并处理所发生的错误或。通常简单的应用程序设计可采用这种办法。

1.与范例1如出一撤,就不详细注释。2通信控件的属性

利用通信控件编制通信程序,关键是准确理解设置通信控件的属性。mscomm.vbx提供了27个关于通信控件方面的属性,例如:

commport:设置或返回通信口编号。

settings:设置或返回以字符串形式出现的数据通信格式:波特率、校验、数据位和停止位。

portopen:设置或返回通信口状态(包括打开和关闭1个通信口)

本程序应用背景为dcc95型静电除尘器自动系统软件,解决1个pc工控机(主站)与32个单片机(子站)之间的通信问题。主站与子站之间这总线式网络结构,采用rs-485通信标准,以问答方式进行数据通信。由于32个子站与主站发送通信命令(下行命令),主站在接收子站发回的相应回答命令(上行命令)后继续发送下行命令的通信形式。根据系统功能的要求,主站需发送2种类型的命令:(1)同期命令,它由定时器触发引起,每隔ls周期发送1次;(2)非周期性命令,它由作者按动相应命令按钮引起,非周期性发送。自动系统软件安装在主站上,而通信程序作为自动系统软件的一部分也安装在主站上。

本文仅列出调试通信程序时进行试验用的基本演示程序清单。试验时,用1台pc机作为主站,另一台pc机模拟32个子站的工作,两台pc机之间采用rs232c串口通信。往主站的通信演示程序窗体(form)中加入1个通信控件、2个定时器控件和1个命令按钮控件,通信控件(mscomm1)用于访问串口,发送和接收数据;periodic定时器控件(periodic)用于控制每秒由主站向各子站发送周期性命令;命令按钮控件(nonperiodic-command)与nonperiodic定时器控件(nonperiodic)用于发送非周期性命令。数据传送采用驱动的通信方式,根据不同的发送命令设置rtreshlod属性,从而引起oncomm以接收数据。

2.1窗体各控件初始化程with futures.ThreadPoolExecutor(workers) as executor:序

设置通信串口工作参数,设置periodic定时器的在断间隔为ls,nonperiodic定时器的中断间隔为0.5s。选用com2串行口

mscomm1.settings="9600,n8,1"'波特率9600,无奇偶校验位,8位数据位1位停止位

mscomm1.inputlen=0'input将读取接收缓冲区的全部内容

mscomm1.inbuffersize=1024'设置接收缓冲区的字节长度

mscomm1.portopen=true'打开通信口

mscomm1.inbuffercount=0'清除发送缓冲区数据

mscomm1.outbuffercount=0'清除接收缓冲区数据

periodic.inteval=100'设置ls定时间隔,使遥测命令每隔ls发送1次

nonperiodic.inteval=500'设置0.5s定时间隔,查询命令按钮是否处于激活状态以确定是否发送周期性命令

command-pressed=false'命令按钮为未激活状态

during-periodic=false'周期性命令数据传输尚未开始

during-nonperiodic=false'非周期性命令数据传输尚未开始

endsub

根据命令按钮状态及周期性命令数据传输状态,在nonperiodic定时器的中断程序中发送非周期性命令。

subnonperiodic-command-click()

command-pressed=true'命令按钮激活

endsub

ifduring-periodic=trueorcommand-pressed=false

thenexitsub'若周期性命令数据传输尚未结束或命令按钮处于激活状态,则退出发送非周期性命令程序。

command-pressed=false'命令按钮恢复为未激活状态

callsenddata(nonperiodic-command)'发送非周期性命令

mscomm1.rthreshold=r-nonperiodic-byte'发送非周期性命令后,设置rthreshold属性,使主站接收所设定的字节数后引发oncomm

endsub

2.eriodic定时器程序

在periodic定时器的中断程序中发送周期性命令:

subperiodic-timer()

ifduring-nonperiodic=truenexitsub'若非周期性命令数据传输尚未结束,则退出发送非周期性命令程序。

during-periodic=true'设置周期性命令数据传输状态为正在进行中

callsenddata(periodic-command)'发送周期性命令

mscomm1.rthreshold=r-periodic-byte'发送周期性命令后,主站接收r-remot-edata-byte个字节,可引发oncomm

endsub

2.4oncomm程序

根据rthreshold属性设置值,当接收缓存区内接收到相应字节的字符时,引发oncomm,在中断程序中接收数据。在此可插入处理各种不同错误或的代码

casemscomm-ev-receive

receivestring$=mscomm1.input

selectcasemscomm1.rthreshold

caser-periodic-byte'周期性命令的应答数据

calldisedata(periodic-command)'处理接收数据

duringperiodic=false'设置周期性命令数据传输状态为结束

caser-nonperiodic-byte'非周期性命令的应答数据

calldisedata(nonperiodic-command)'处理接收数据

during-nonperiodic=false'设置非周期性命令数据传输状态为结束

endselect

endselect

endsub

串行口通信(一)

1. 数据的序列化反序列化,因为有时c++和python之间通信的不是基本类型,可能是用户自定义类型;

人类生存于世,少不了沟通。沟通使人类互相认知,传递信息,提升生活品质。但然单片机也需要,不然单单一个机器,无法构成一个系统,发挥更大的力量。只有单片机与外围设备传递信息,互相反馈才会有一个完美的系统。串行口通信就被发明出来,下面来了解串行口通信(uart)。

为了能更好理解串行口通信,在介绍它之前,先来看看几个概念,补充知识,方便深入明白uart工作原理。

串行通信有两种,一位异步串行通信,二为同步串行通信。

异步串行通信 :异步串行通信是指通信双方以一个字符(包括特定附加位)作为数据传输单位且发送方传送字符的间隔时间不一定,具有不规则数据段传送特性的串行数据传输。

同步串行通信 :所谓同步通信是指在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致(同步),这就保证了通信双方在发送和接收数据时具有完全一致的定时关系。

两种串行通信不同就只有时间,在发送字符时,异步可以是不同时间间隔发送,但同步只能以固定的时间间隔发送。

波特率 :波特率表示每秒钟传送的二进制位数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。

相互通信的甲乙双方必须具有相同的波特率,不然无法成功完成串行通信。

52单片机具有一个全双工串行通信口。一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。振荡频率为6M—12M。管脚RXD( P3.0),TXD(P3.1)与串口通信有关。波特率可以设置。

串行口通信与三个寄存器有关,分别是:

这个寄存器只有SMOD位与串行口通信有关。系统复位默认为SMOD=0。当为用52单片机的定时器2产生波特率时,波特率不受SMOD影响。用定时器1产生波特率时,不去设置,就默认为0,波特率正常,设置为1时,波特率加倍。

串行口为10位通用异步接口。发送或接收一帧数据信息为10位,包括1位起始位“0”、8位数据位、1位停止位“1”。发送数据:数据从TXD端口输出,当数据写入发送缓冲器SBUF时,就启动发送器发送。发送完一帧数据后,置中断标志TI=1,申请中断,通知CPU可以发送下一个数据了。接收数据:首先使REN=1(允许接收数据),串行口从RXD接收数据,当采样到1至0跳变时,确认是起始位“0”,就开始接收一帧数据,当接收完一帧数据时,置中断标志RI=1,申请中断,通知CPU从SBUF取走接收到的数据 。

溢出速率即溢出频率,只要算出定时器每溢出一次所需要的时间T,那溢出率就是1/T。计算在没有波特率加倍(SMOD=0)的情况下,波特率为9600bps时怎样赋值计数器。这里说明一下,由于波特率是需要很的,不然通信会出错。如果采用定时器工作模式1,采用人工重载,会有较大误,因为进入中断函数也需要时间,累积时间就会出错。所以这里运用工作模式2,8位自动重装。计数器自动重装不需人工干预,减少误。

对照上面公式,波特率不加倍,SMOD=0,工作模式2,那n=8,波特os.('notepad aa.txt') #aa.txt文件必须在当前程序目录率=9600,就可以算出x=253,十六进制为fd。

范例1是将接受的数据原封不动发送出去。采用查询法,故不需要打开串口中断,不用中断函数。只需不断查询TI,RI的值,就知道数据接收发送情况。

在串口通信中,方式1是常用的,要认真理解方式1。串行数据一位一位的已经不用处理了,52单片机已经有一个模块处理完了。只要知道接收一个数据,产生一次接收中断,要软件置0.,发送一个数据会产生一次发送中断,也要软件置0。自行置0,处理好数据就OK。下一篇将介绍其他三种方式,欢迎关注。

串口通信如何接收字符串啊?

TerminateProcess(handle, exitCode)

什么语言?

4. 配置串口转换:配置串口转换中的串口号、波特率、数据位等参数,将其与上述串口通过网络连接起来。

看书

Visual C++_Turbo C串口通信编程实践

Visual_Basic与_RS-232_串行通信控制

字符组合不就成了字符串了吗! 怎么还是你啊,老兄,你写过网络编程没?知道什么是协议和数据包没?没的话学下网络编程。虽然这是串口通讯,不过还是会涉及到协议和数据包的问题!

首发匹配好波特率,协议一致,就可以了。具体问题具体对待

python中如何实现发送邮件及附件功能的具体详解

这篇文章主要为大家详细介绍了python实现发送邮件及附件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

今天给大伙说说python发送邮件,的多余的话自己去百度好了,还有一大堆文档说实话不到万不得已的时候一般人都不会去看,回归主题:

本人是mac如果没有按照依赖模块的请按照下面的截图安装

导入模块如果没有错误,表示已经安装成功。

Python发送一个未知MIME类型的文件附件其基本思路如下:

1. 构造MIMEMultipart对象做为根容器

2. 构造MIMEText对象做为邮件显示内容并附加到根容器

3. 构造MIMEBase对象做为文件附件内容并附加到根容器

a. 读入文件内容并格式化

b. 设置附件头

4. 设置根容器属性

5. WaitForSingleObject(handle, milisecond)得到格式化后的完整文本

6. 用tp发送邮件

实例代码:

# -- coding:utf-8 --

import tplib

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.mime.application import MIMEApplication

class Mailer(object):

self.mail_list = maillist

self.mail_title = mailtitle

self.mail_content = mailconimport requests #导入爬虫的库,不然调用不了爬虫的函数tent

self.mail_host = ""

self.mail_user = "your email name"

self.mail_pass = "your email password"

self.mail_tfix = ""

me = self.mail_user + "<" + self.mail_user + "@" + self.mail_tfix + ">"

msg = MIMEMultipart()

msg['Subject'] = 'Python mail Test'

msg['From'] = me

msg['To'] = ";".join(self.mail_list)

#puretext = MIMEText('

你好,
'+self.mail_content+'

','html','utf-8')

puretext = MIMEText('纯文本内容'+self.mail_content)

msg.attach(puretext)

# jpg类型的附件

jpgpart = MIMEApplication(open('/home/mypan/1949777163775279642.jpg', 'rb').read())

jpgpart.add_header('Content-Disition', 'attachment', filename='beauty.jpg')

msg.attach(jpgpart)

# 首先是xlsx类型的附件

#xlsxpart = MIMEApplication(open('test.xlsx', 'rb').read())

#xlsxpart.add_header('Content-Disition', 'attachment', filename='test.xlsx')

#msg.attach(xlsxpart)

# mp3类型的附件

#mpart = MIMEApplication(open('kenny.mp3', 'rb').read())

#mpart.add_header('Content-Disition', 'attachment', filename='benny.mp3')

#msg.attach(mpart)

# pdf类型附件

#part = MIMEApplication(open('foo.pdf', 'rb').read())

#part.add_header('Content-Disition', 'attachment', filename="foo.pdf")

#msg.attach(part)

try:

s.connect(self.mail_host) #连接到指定的tp。参数分别表示pt主机和端口

s.login(self.mail_user, self.mail_pass) #登录到你邮箱

s.sendmail(me, self.mail_list, msg.as_string()) #发送内容

return True

except Exception, e:

print str(e)

return False

if name == 'main':

#send list

mailto_list = ["",""]

mail_title = 'Hey subject'

mail_content = 'Hey this is content'

mm = Mailer(mailto_list,mail_title,mail_content)

res = mm.sendMail()

print res

python有哪些网络通信的模块

在Python中两种套接字的建立可以用socket模块来实例化

使用给定的地址族、套接字类型、协议编号(默认为0)来创建

TCP/IP套接字

Tcpsock

=socket.sock点击并拖拽以移动6.常用方法之get方法传参实例(2)et(socket.AF_INET,socket.AF_STREAM)

Tcpsock

=socket.soc3、实例ket()默认不填

UDP/IP套接字

Udpsock

=socket.socket(socket.AF_INET,socket.AF_DGRAM)

python如何调用其他程序

resp = requests.get()

在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码。为了更好地控制运行的进程,可以使用win32process模块中的函数,如果想进一步控制进程,则可以使用ctype模块,直接调用kernel32.dll中的函数。下面介绍4种方式:

1、os.()函数

os模块中的()函数可以方便地运行其他程序或者脚本,模式如下:

os.(command):command: 要执行的命令,如果要向脚本传递参数,可以使用空格分割程序及多个参数

实例:

#打开记事本

os.('notepad')

#直接打开aa.txt

os.('aa.txt')

#直接打开Excel文件

如何安装MySQLdb?os.('aa.xlsx')

#直接打开Word文件

os.('bb.docx')

filepath='测试.xlsx'

os.(filepath.decode('utf8').encode('GBK'))2、ShellExecute函数

使用win32api模块中的ShellExecute()函数来运行其他程序,格式如下

ShellExecute(hwnd, op, file, args, dir, show)

hwnd:父窗口的句柄,如果没有父窗口,则为0

op: 要运行的作,为open,print或者为空

file: 要运行的程序,或者打开的脚本

args: 要向程序传递的参数,如果打开的是文件则为空

show: 是否显示窗口

使用ShellExecute函数,就相当于在资源管理器中双击文件图标,系统会打开相应程序运行。

import win32api

win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 0) # 后台执行

win32api.ShellExecute(0, 'open', 'notepad.exe', '', '', 1) # 前台打开

win32api.ShellExecute(0, 'open', 'notepad.exe', 'wmi.txt', '', 1) # 打开文件

win32api.ShellExecute(0, 'open', 'iexplore.exe', '', '', 1) # 打开IE浏览器

win32api.ShellExecute(0, 'open', 'iexplore.exe', '', '', 1) # 用IE浏览器打开百度网址

win32api.ShellExecute(0, 'open', 'mspaint.exe', 'wxqr.png', '', 1) #用系统附件自带的画图打开wxqr.png3、CreateProcess

为了便于控制通过脚本运行的程序,可以使用win32process模块中的CreateProcess()函数创建一个运行相应程序的进程。其函数格式为:

appName:可执行文件名

cmdLine:命令行参数

procAttr:进程安全属性

threadAttr:线程安全属性

InheritHandle:继承标志

CreationFlags:创建标志

currentDir:进程的当前目录

Attr:创建程序的属性

结束进程:

可以使用win32process.TerminateProcess函数来结束已创建的进程, 函数格式如下:

handle:要作的进程句柄

exitCode:进程退出代码

或者使用win32nt.WaitForSingleObject等待创建的线程结束,函数格式如下:

handle : 要作的进程句柄

milisecond: 等待的时间,如果为-1,则一直等待.

import win32process

# 打开记事本,获得其句柄

handle = win32process.CreateProcess(r'C:Windows

otepad.exe', '', None, None, 0, win32process.CREATE_NO_WINDOW, None, None, win32process.STARTUPINFO())

time.sleep(4)

win32process.TerminateProcess(handle[0], 0)

import win32nt

#等待进程结束

print win32nt.WaitForSingleObject(handle[0], -1)4、使用ctypes调用kernel32.dll中的函数

使用ctypes模块可以让Python调用位于动态链接库的函数。

ctypes模块为Python提供了调用动态链接库中函数的功能。使用ctypes模块可以方便地调用由C语言编写的动态链接库,并向其传递参数。

ctypes模块定义了C语言中的基本数据类型,并且可以实现C语言中的结构体和联合体。ctypes模块可以工作在Windows,Linux,Mac OS等多种作系统,基本上实现了跨平台。

实例:

Windows下调用user32.dll中的MessageBoxA函数。

from ctypes import

user32 = windll.LoadLibrary('user32.dll')

a = user32.MessageBoxA(0, str.encode('Hello Ctypes!'), str.encode('Ctypes'), 0)

print a

更多Python相关技术文章,请访问Python教程栏目进行学习!

如何编写自己的串口通讯协议

2.2非周期性命令发送程序

下面以一个例程来做说明:

创建进程:

ARDUINO 代码打印

int incomingByte = 0; // 接收到的 data byteString inputString = ""; // 用来储存接收到的内容boolean newLineReceived = false; // 前一次数据结束标志 void setup() { Serial.begin(9600); //设定通讯端口及速率} void loop() { if (newLineReceived) { Serial.print(inputString); // 这里只是简单的将它打出来了,你可以根据自己的要求来用你接收到的数据...... inputString = ""; // clear the string newLineReceived = false; ........//其他你的程序 }} //serialEvent()是IDE1.0及以后版本新增的功能,不清楚为什么大部份人不愿意用,这个可是相当于中断功能一样的啊! void serialEvent(){ while (Serial.ailable()) { incomingByte = Serial.read(); //一个字节一个字节地读,下一句是读到的放入字符串数组中组成一个完成的数据包 inputString += (char) incomingByte; // 全双工串口可以不用在下面加延时,半双工则要加的// // 下面就是所谓的通讯协议了,如果接收到了换行符号,本例是定义了这次串口通讯数据接收结束// // 其他的你还可以加一些规则,比如数据包起始位,规定一个数据包就是以FF为开头的,如果不是就不接收// // 也可以加上数据校验位,同样在这里做一个校验判断,如果不符合,则将数据包丢掉,再通过一个标志位写个值,// //在主程序里面让发送方重发(主程序里面都写一条IF就行了)// if (incomingByte == 'n') { newLineReceived = true; } }}

版权声明:本文内容由互联。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发 836084111@qq.com 邮箱删除。