通过UDP套接字在Python中发送串行数据
我可能走错了方向,所以才来问这个问题。
我有一个串行数据源,它连接到一个系统芯片(SOC),然后通过UDP把串行数据传输到我服务器上的一个套接字。原始数据的波特率是57600,我想用Python来接收和解析这些数据。我用下面的脚本测试过,发现我确实能在端口上成功接收到数据(这个脚本可以在这里找到:https://wiki.python.org/moin/UdpCommunication)。
import socket
UDP_IP = "MY IP"
UDP_PORT = My PORT
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
print "received message:", data
因为我没有用Python的.serial库来读取数据,也没有设置波特率,所以接收到的数据都是乱码,这也是可以预料的。我的最终目标是能够接收和解析这些数据,以便在服务器端进行处理,同时还希望有其他客户端可以连接到从服务器(代理)回传的原始数据流,这就是我不直接从设备的串口处理数据的原因。
所以我的问题是,如何让Python把这个套接字当作一个串口来处理,这样我就可以设置波特率,并且可以使用#import serial和.read来读取数据?我在网上找不到任何相关的例子,这让我觉得我可能忽略了什么简单的东西,或者是在做一些愚蠢的事情。
伤心脸
2 个回答
基于事实构建
首先要做的就是总结一些事实——从系统级芯片(SOC)开始,一直到更高层次……:
- 一个发信器的串行比特流参数 ::= 57600 波特率,X-<数据位>-s,Y-<停止位>,Z-<奇偶校验位>,
- 一个中介接收过程从原始比特流中提取<数据>
- 一个中介向服务器发送过程的集成需要明确的规范(多方握手、故障检测、故障状态恢复、日志记录等的FSA模型)
- 待补充……
根据有效的需求列表进行设计
有些事情只是一堆简单的代码行。设计时要认真对照经过验证的需求列表,这样可以节省你和合作团队的时间。
在模型上进行测试
在努力从简单部分过渡到更复杂的多方场景时,实时测试是非常值得的。
在更智能的框架上进行集成
重新发明轮子绝对是浪费时间。使用一个智能框架进行服务器端集成,可以让你在特定问题领域的任务上节省大量时间和精力,而不是浪费这些时间和精力去写一个又一个的套接字框架(大多数情况下注定会失败……)
试试ZeroMQ或者nanomsg可扩展的正式通信模式框架,这样可以将解帧后的数据从你的串行比特流源发送出去,你就快成功了。
你不能把一个套接字当作串行线来使用。套接字只能用来发送和接收数据(对于TCP来说是数据流,对于UDP来说是数据包)。如果你需要控制SOC上的串行线,就得在套接字上建立一个合适的控制协议。也就是说,你可以像FTP那样使用另一个套接字来进行控制,或者像HTTP那样在同一个连接中区分控制信息和数据。而且,连接的两端都必须理解这个协议。