菜鳥之路——Python學習之串口通信(與STC89C51)源碼及打包發布試水
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)源碼及打包發布試水