从树莓派 pi3 串口读取数据

问题描述

我正在尝试读取传真机传输的传真页,我使用嵌入式调制解调器(mt9234smi)接收传真页,并通过串行端口将此调制解调器与pi3连接,并通过pi3上的python脚本读取数字数据并保存在文件中作为二进制数据, 传真机和调制解调器之间的速率(PSTN 模拟信号) 14.4 k 调制解调器 (DCE) 和 raspBerry pi3(主机或 DTE)之间的芽率 38400 k

当通过调制解调器(2 类传真 AT 命令)将页面从 pi3 发送到远程传真机时,它可能工作, 但是当从调制解调器接收数据并将文件保存为二进制数据时,我注意到数据量太大并且我注意到大量重复字节(文件的大小必须接近 1.5 k,但我收到近 5 k) 请注意,我正在使用硬件流控制 (CTS) 并在发送脚本时充分使用它。

下面是从modem开始接收数据后从modem串口接收到的数据重复字节的示例:

b'\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n' b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

b'\xd4\x00Sf\xa0\x02\x9b5\x00\x14\xd9\xa8\x00\xa6\xcd@\x056j\x00)\xb3P\x01M\x9a\x80\n'

你知道这个字节是什么意思吗? 我还有一个问题,在从调制解调器接收数据期间,什么时间可以从串口缓冲区捕获字节? 我注意到我的软件从串口调制解调器读取了重复的字节,因为速度存在差异。

在我的接收脚本下面(注意我必须用单个替换成对并用字符替换成对,并通过 reveive 结束流数据) DLE =x10,SUB =x1a,ETX = x03 。

           byte=port.read(1)
           num_byte+=1
           while True :         
                if byte== b'\x10':
                            x = port.read(1)
                            if x== b'\x03':
                                b.write(b'\x10x\03')
                                print('end of file')
                                num_byte+=2
                                b.close()
                                break
                            
                            if x == b'\x10':
                                b.write(b'\x10')
                                byte = port.read(1)
                                dle_dle+=1
                                print(byte)
                                num_byte+=1
                                
                                continue
                            if x== b'\x1a':
                                b.write(b'\x10\x10')
                                sub+=1
                                num_byte+=2
                                print(byte)
                                byte = port.read(1)
                                continue
                                    
                    if byte==b'\n':
                        x=port.read(1)
                        if x== b'l':
                            b.write(b'\n')
                            byte = port.read(1)
                            line+=1
                            continue
                        else:
                            b.write(byte)
                            b.write(x)
                            byte = port.read(1)
                            continue
                    else:
                  
                        b.write(byte)
                        byte = port.read(1)
                        num_byte+=1
                b.close()

如果我的接收循环是错误的还是正确的,任何人都可以知道我吗,我注意到我从串行端口收到了太多的重复数据。 谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)