weixin_39480022
2019-06-28 15:59 阅读 1.1k

python3.7 要从串口读数据保存到文件,运行后发现如发送的数据中文字比较多就会出现乱码或丢数据。

问题描述如标题,如果发送的是全英文的时候或少数中文字的时候,对比发送和保存文件内容一致,没有丢数据。我(用了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()

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

相关推荐