protues仿真器串口数据上传至Web服务器(COM口 与 TCP socket之间数据传输)
应用场景
1.protues仿真器串口数据上传至Web服务器。
2.此处单片机端为TCP socket服务器,Web端连接时发送相应请求,单片机及上传数据。
数据传输原理
转换程序 读取protues串口数据通过发送给socket
转换程序 监控socket接受到数据下发给串口
图中标号解释
①protues中虚拟串口可以连接到PC的COM口
下图为虚拟串口的配置(连接PC的COM1口,波特率为9600)
②通过Configure Virtual Serial Port Driver软件将PC的COM1与COM2连接,如图COM1可以与COM2互发消息
③转换程序监控COM口数据(使用Python监控)
监控COM数据代码(COM2口):
#监控COM口数据
#双线程监听COM口收发数据
import threading
import time
import serial
import string
import binascii
s = serial.Serial("COM2", 9600, timeout=5)
def send():
while True:
print('send线程...')
while True:
n = s.inWaiting()
if n:
break
data = str(binascii.b2a_hex(s.read(n)))[2:-1] #读取COM口数据
print(data) #data为COM口数据
time.sleep(0.5)
def receive():
while True:
print('receive线程...')
hex = input()
#hex = '3a 00 01 01 00' #读取下发数据
d = bytes.fromhex(hex)
s.write(d)
time.sleep(0.5)
def main():
"""创建启动线程"""
t_sing = threading.Thread(target=send, args=())
t_dance = threading.Thread(target=receive, args=())
t_sing.start()
t_dance.start()
if __name__ == '__main__':
main()
④将PC端作为socket服务器
import socket
import time
print("服务端开启")
# 创建套接字
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置IP和端口
# host = socket.gethostname()
host = '127.0.1.1'
port = 3333
# bind绑定该端口
mySocket.bind((host, port))
# 监听
mySocket.listen(10)
while True:
# 接收客户端连接
print("等待连接....")
client, address = mySocket.accept()
print("新连接")
print("IP: %s" % address[0])
print("端口: %d\n" % address[1])
while True:
# 读取消息
msg = client.recv(1024)
receive = msg.decode("utf-8")
print("服务端接收:",receive ) # 把接收到的数据进行解码
print("读取完成")
"""
if msg == b"EOF":
break
if msg == b"quit":
client.close()
mySocket.close()
print("程序结束\n")
exit()
"""
# 发送消息
#msg = input("服务端发送:")
msg = '3a 01 02 02 2c 00 00'
client.send(msg.encode(encoding='utf-8'))
print("发送完成")
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) # 格式化时间戳为标准格式
"""
if msg == "EOF":
break
if msg == "quit":
client.close()
mySocket.close()
print("程序结束\n")
exit()
"""
print('\n')
⑤以太网socket传输数据
总结
此处转换程序为自己编写,实现功能为监控COM口数据和socket数据,并实现数据从TCP到COM口,从COM到TCP的传输。
总代码(使用两个线程监控COM和TCP)
#此处单片机端为TCP socket服务器,Web端发送相应请求,单片机上传相应数据
import threading
import time
import serial
import binascii
import socket
class Server():
ip = '' #ip
port = '' #端口
t_sing = '' #线程send
t_dance = '' #线程receive
mySocket = '' #socket对象
client = '' #client对象
com = '' #com口名
baud = '' #波特率
com_connect = '' #串口对象
def __init__(self,ip,port,com,baud): #构造方法
try:
self.com =com
self.port = port
self.baud = baud
self.com_connect = serial.Serial(self.com, self.baud, timeout=20)
self.ip = ip
self.port = port
self.mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.mySocket.bind((self.ip, self.port))
self.mySocket.listen(10)
except:
print("服务器启动异常")
return -1
# 接收客户端连接
print("等待连接....")
######################################################
self.client, address = self.mySocket.accept() ##可以定义多个client
print("新连接")
print("IP: %s" % address[0])
print("端口: %d\n" % address[1])
def send_data(self):
while True:
try:
while True:
n = self.com_connect.inWaiting()
if n:
break
data = str(binascii.b2a_hex(self.com_connect.read(n)))[2:-1] # 读取COM口数据上传TCP服务器
print(data) # data为COM口数据
msg = data
print('服务器发送:', msg)
self.client.send(msg.encode(encoding='utf-8'))
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
print("发送完成\n")
except:
print('线程发送异常')
return -1
def receive(self):
while True:
try:
msg = self.client.recv(1024)
receive = msg.decode("utf-8")
print("服务端接收:", receive) # 把接收到的数据进行解码
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
print("读取完成\n")
while True:
if receive:
# print(server_reply)
break
hex = receive
# hex = '3a 00 01 01 00' #读取TCP下发数据,转发给COM口
d = bytes.fromhex(hex)
self.com_connect.write(d)
except:
print('线程接收异常')
return -1
def main(self):
"""创建启动线程"""
self.t_sing = threading.Thread(target=self.send_data, args=())
self.t_dance = threading.Thread(target=self.receive, args=())
self.t_sing.start()
self.t_dance.start()
if __name__ == '__main__':
"""
ip = '127.0.0.1'
port = 5000
com = 'COM2'
baud = 9600
"""
print('请输入创建服务器的IP:')
ip = input()
print('请输入创建服务的端口:')
port = input()
port = int(port)
print('请输入串口号(例如:COM1):')
com = input()
baud = 9600
print(f'IP:{ip},Port:{port},COM:{com},波特率:9600(默认)\n')
a = Server(ip,port,com,baud)
a.main()