1. 程式人生 > >菜鳥之路——Python學習之串口通信(與STC89C51)源碼及打包發布試水

菜鳥之路——Python學習之串口通信(與STC89C51)源碼及打包發布試水

方式 lin enc error: pri 打開端口 端口號 兩個 關閉

想做上位機控制系統,就拿51來試試水。

Python環境:Win10+Python 3.6.4(64位)+serial,pyserial

一、上位機程序的編寫

import serial
ser = serial.Serial("COM3", 4800)
ser.write(‘1‘.encode())
ser.close()

對,沒錯,就這幾行,就把“1”的ASCII以4800的波特率發送給COM3端口
.encode()是將字符串進行編碼,可以用.decode()進行解碼
以上只是實現了發送一個字符,為了,讓他好看點,我加入了PythonGUI。用的是tkinter模塊


import serial
from tkinter import *

ser = serial.Serial("COM3", 4800)

def open():
    ser.write(‘1‘.encode())
    var.set("已打開")
def close():
    ser.write(‘2‘.encode())
    data = ser.read()
    print(data)
    var.set("未打開")

root = Tk()
root.title("設備打開與關閉")
frame1 = Frame(root)
frame2 = Frame(root)

var = StringVar()
var.set("未打開")
textLabel = Label(frame1,
                  textvariable=var,
                  justify=LEFT)
textLabel.pack(side=LEFT)

theButton1 = Button(frame2, text="打開", command=open)
theButton1.pack()

theButton2 = Button(frame2, text="關閉", command=close)
theButton2.pack()

frame1.pack(padx=10, pady=10)
frame2.pack(padx=10, pady=10)

mainloop()

運行之後是這樣的
技術分享圖片
是不是特別寒磣,哈哈哈,我今天剛開始學。就湊合看吧。
基本就是點打開,就給串口發送數據‘1’,點打開,就給串口發送數據‘2’。下位機單片機裏面會對‘1’和‘2’進行識別,記得哦,這是字符‘1’和‘2’不是數字1和2。串口通信裏都是以ASCII碼進行通信的。
附:serial常用方法
import serial導入模塊

ser = serial.Serial(0) #打開第一個串口

ser.portstr #串口的標識,windows下是COM1,COM2,COM3

ser.write(“hello") #往串口寫數據

ser.close() 關閉串口

ser.open() 打開串口

ser = serial.Serial(‘COM1‘, 115200) 設置端口號和波特率,並打開端口

data = ser.read()讀一個字符

data = ser.read(20) 讀20個字符

data = ser.readline() 讀一行,以/n結束,要是沒有/n就一直讀,容易阻塞。

data = ser.readlines()和ser.xreadlines()都需要設置超時時間

ser.baudrate = 9600 設置波特率

ser 查看當前串口的狀態

ser.isOpen() 看看這個串口是否已經被打開

註意:新建py文件的時候不要以serial命名,我就是命名的serial,導致出問題了。因為代碼裏有import serial。本來要引入人家官方庫呢,你再自己命名個serial,他就就近引用的你這個文件,肯定出問題啦。

也就是這個錯誤
AttributeError: module ‘serial‘ has no attribute ‘Serial‘

二 、下位機單片機程序的編寫

#include "reg52.h"           //此文件中定義了單片機的一些特殊功能寄存器
#include<intrins.h>
typedef unsigned int u16;     //對數據類型進行聲明定義
typedef unsigned char u8;

void UsartInit()
{
    SCON=0X50;          //設置為工作方式1
    TMOD=0X20;          //設置計數器工作方式2
    PCON=0X80;          //波特率加倍
    TH1=0XF3;               //計數器初始值設置,註意波特率是4800的
    TL1=0XF3;
    ES=1;                       //打開接收中斷
    EA=1;                       //打開總中斷
    TR1=1;                  //打開計數器
}

void main()
{   
    P2=0x00;
    UsartInit();  //    串口初始化
    while(1);       
}

void Usart() interrupt 4
{
    u8 receiveData;
    u8 sendData;
    sendData=‘1‘;

    receiveData=SBUF;//出去接收到的數據
    RI = 0;//清除接收中斷標誌位

    if (receiveData==‘1‘)
    {
    P2=0xf0;
    }
    else if (receiveData==‘2‘)
    {
    P2=0x0f;
    }
}

也就這樣了。燒寫到單片機裏,然後就可以隨心所欲啦。
另外,單片機一次只能接收一個字節,接收一個字節就把RI置0,再去接收下一個字節。

今天弄出來的,就是來試試水。玩一下。以後會更新做好的控制系統。

三、打包發布exe

還是為了試水,把寫好的Python文件打包成exe能在Windows下直接運行。
目前有pyinstaller和py2exe兩個模塊
py2exe不支持Python3.4以上的版本。我是Python3.6(64位)。可以用最新版的pyinstaller
那就直接在cmd窗口
pip install pyinstaller
然後就
pyinstaller.exe -F 文件所在路徑
就行了,親測可用

菜鳥之路——Python學習之串口通信(與STC89C51)源碼及打包發布試水