热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

项目中遇到需要用电脑通过串口来控制单片机IO口,查询了一些资料,可以使用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;

}

程序运行结果如下:

串口助手发送命令:

单片机做出响应:

串口再次发送命令:

单片机再次做出响应:

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



推荐阅读
author-avatar
惠嘟du
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有