python写的串口助手_Python实现的简单的单片机串口助手程序

项目中遇到需要用电脑通过串口来控制单片机IO口,查询了一些资料,可以使用python来实现简单的串口通信,

所以用python实现了一个简单的单片机串口助手,可以将串口助手发往单片机的字符回传给串口助手。也可以

将配合单片机程序对单片机进行控制。

python实现的串口助手代码如下:

import time; #需要调用延时函数

import serial #需要调用串口库

import binascii #需要将传送的字符进行转换

if __name__ == '__main__':

ser = serial.Serial(); #生成串口

ser.baudrate = 4800 #设置串口波特率

ser.port = 'COM4' #设置串口号

ser.timeout = 0.1 #设置串口通信超时时间

ser.close() #先关闭串口,以免串口被占用

ser.open() #打开串口

print(ser.is_open) #打印串口状态

strSerial = '' #初始化串口传输字符串

if(ser.is_open):

while(strSerial != '0'): #判断输入是否为'0',为'0'则退出循环

strSerial = raw_input('Input:') #输入传输字符串

strHex = binascii.b2a_hex(strSerial) #将传输字符串转换为16进制

strhex = strHex.decode("hex") #以十六进制解码,这两行必须有,不然会回传乱码

ser.write(strhex) #将传输字符串写入串口

time.sleep(1) #延时1s,时间可以设置,最好设置大点,以免传输字符过多,传输

#时间过长,回传失败

n = ser.inWaiting(); #求取串口缓存中回传的字符个数

print 'n=',n #打印字符个数

if n:

data = '';

data = ser.read(1000); #读取缓存中1000个字符,值越大越好,如果该值小于传输字

#符总长度,多余的字符会被抛弃

print 'get data from serial port:',data; #打印回传的字符

ser.close() #程序结束时关闭串口,以免串口被占用

print not ser.is_open

单片机下位机程序如下:

#include "reg52.h"

typedef unsigned char u8;

typedef unsigned int u16;

u8 receiveData;

void UsartInit()//初始化串口

{

TMOD = 0X20;

TH1 = 0XF3;

TL1 = 0XF3;

PCON = 0X80;

TR1 = 1;

SCON = 0X50;

ES = 1;

EA = 1;

}

void main()

{

UsartInit();

while(1)

{

};

}

void uSART() interrupt 4 //用中断处理串口通信

{

receiveData = SBUF; //将单片机接收缓存中的字符存入receiveData

RI = 0;

SBUF= receiveData; //将receiveData中的字符存入单片机发送缓存

while(!TI); //等待回传完成

TI = 0;

}

程序运行结果如下:

对单片机下位机处理函数加以扩展,根据接收到的不同字符做出不同的动作,就可以通过串口助手对单片机

加以控制,以下程序可以通过串口控制单片机的IO口,将单片机的IO口与发光二极管相连,就可以控制二极管亮灭

#include "reg52.h"

typedef unsigned char u8;

typedef unsigned int u16;

sbit SUNROOF_OPEN = P2^0;

sbit SUNROOF_CLOSE = P2^1;

sbit SUNSHADE_OPEN = P2^2;

sbit SUNSHADE_CLOSE = P2^3;

u8 receiveData;

void UsartInit()

{

TMOD = 0X20;

TH1 = 0XF3;

TL1 = 0XF3;

PCON = 0X80;

TR1 = 1;

SCON = 0X50;

ES = 1;

EA = 1;

}

void main()

{

UsartInit();

P2 = 0; //P2口先置0,发光二极管全灭

while(1)

{

switch(receiveData)//根据接收到的值控制对应的IO口输出高低电平

{

case 'A'

SUNROOF_OPEN = 1;

break;

case 'B':

SUNROOF_OPEN = 0;

break;

case 'C':

SUNROOF_CLOSE = 1;

break;

case 'D':

SUNROOF_CLOSE = 0;

break;

case 'E':

SUNSHADE_OPEN = 1;

break;

case 'F':

SUNSHADE_OPEN = 0;

break;

case 'G':

SUNSHADE_CLOSE = 1;

break;

case 'H':

SUNSHADE_CLOSE = 0;

break;

default:

break;

}

};

}

void uSART() interrupt 4

{

receiveData = SBUF;

RI = 0;

SBUF= receiveData;

while(!TI);

TI = 0;

}

程序运行结果如下:

串口助手发送命令:

单片机做出响应:

串口再次发送命令:

单片机再次做出响应:

可以对单片机和串口助手程序加以扩展,实现更复杂的功能

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值