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;

}

程序运行结果如下:

Python实现的简单的单片机串口助手程序_第1张图片

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

加以控制,以下程序可以通过串口控制单片机的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;

}

程序运行结果如下:

串口助手发送命令:

Python实现的简单的单片机串口助手程序_第2张图片

单片机做出响应:

Python实现的简单的单片机串口助手程序_第3张图片

串口再次发送命令:

Python实现的简单的单片机串口助手程序_第4张图片

单片机再次做出响应:

Python实现的简单的单片机串口助手程序_第5张图片

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

你可能感兴趣的:(51单片机,Python)