下面以一个例程来做说明:
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的内置库之一,可以直接在MicroPython的控制台或脚本中使用。UART通信库提供了一种与串口通信设备进行通信的方式,具有发送和接收数据的功能。
#打开包含中文的文件这篇文章主要介绍了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 标准数据库接口为 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
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
人类生存于世,少不了沟通。沟通使人类互相认知,传递信息,提升生活品质。但然单片机也需要,不然单单一个机器,无法构成一个系统,发挥更大的力量。只有单片机与外围设备传递信息,互相反馈才会有一个完美的系统。串行口通信就被发明出来,下面来了解串行口通信(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。下一篇将介绍其他三种方式,欢迎关注。
什么语言?
4. 配置串口转换:配置串口转换中的串口号、波特率、数据位等参数,将其与上述串口通过网络连接起来。看书
Visual C++_Turbo C串口通信编程实践
Visual_Basic与_RS-232_串行通信控制
字符组合不就成了字符串了吗! 怎么还是你啊,老兄,你写过网络编程没?知道什么是协议和数据包没?没的话学下网络编程。虽然这是串口通讯,不过还是会涉及到协议和数据包的问题!
首发匹配好波特率,协议一致,就可以了。具体问题具体对待
这篇文章主要为大家详细介绍了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('
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中两种套接字的建立可以用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中,可以方便地使用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教程栏目进行学习!
下面以一个例程来做说明:
创建进程: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 邮箱删除。