问题描述如标题,如果发送的是全英文的时候或少数中文字的时候,对比发送和保存文件内容一致,没有丢数据。我(用了14万行文件发送,收到的数据对比都正确)
个人认为:GB2312编码中文字是2个字节表示,串口在读数据的时候可能只读到此中文字的第一个字节,第二个字节在下一轮读取。
代码如下,请大牛们帮忙看看,感谢!
#!/usr/bin/python
# -*-coding: utf-8 -*-
import serial
import threading
import time
from datetime import datetime
#串口相关功能
class SerialPort:
#初始化
def __init__(self, port, buand,time_out):
self.port = serial.Serial(port, buand,timeout=time_out)
self.port.close()
if not self.port.isOpen():
self.port.open()
#打开串口
def port_open(self):
if not self.port.isOpen():
self.port.open()
#关闭串口
def port_close(self):
self.port.close()
#读串口数据
def read_data(self):
global is_exit
global data_bytes
while not is_exit:
count = self.port.inWaiting()
if count > 0:
rec_str = self.port.read(count)
data_bytes = rec_str.decode('GB2312', 'ignore')
file_w.write_file()
#文件相关功能
class SerialFile:
#初始化
def __init__(self, name):
self.name = name
self.file =''
#打开文件
def open_file(self):
self.f = open(self.name,'w')
#print('====打开文件',end='')
#print(self.f,end='')
#print('====')
#self.f.write('打开就写内容,是否能保存到文件中??')
#串口读到的数据一个字符一个字符的存到文件中
def write_file(self):
global data_bytes
mutex.acquire()
#print('====写锁定开始====')
#print('data_bytes is :')
#print(data_bytes)
data_len=len(data_bytes)
#print('====数据长度',end='')
#print(data_len,end='')
#print('====')
if data_len>0:
for data in data_bytes:
if data == '\n':
self.f.write('')
#self.f.write('[%s] '%time.strftime("%Y-%m-%d %H_%M_%S", time.localtime()))
else:
self.f.write(data)
self.f.flush()#刷新buffer数据保存到文件中
data_bytes = ''
mutex.release()
#print('====写锁定结束====')
def close_file(self):
self.file.close
print('文件关闭')
if __name__ == '__main__':
serialPort = 'COM4' # 串口
baudRate = 115200 # 波特率
time_out = 2
is_exit=False
data_bytes=''
#打开串口
mSerial = SerialPort(serialPort, baudRate,time_out)
#输入待保存的文件名称
filename=input('请输入保存的文件名:')
dt=datetime.now()
nowtime_str=dt.strftime('%y-%m-%d %H-%M-%S') #当前时间
filename=nowtime_str+'_'+filename
file_w = SerialFile(filename)
file_w.open_file()
#开始数据读取线程
t1 = threading.Thread(target=mSerial.read_data)
t1.setDaemon(True)
mutex = threading.Lock()
t1.start()