protues仿真器串口数据上传至Web服务器(COM口 与 TCP socket之间数据传输)

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()

效果(通过转换程序实现COM与TCP的互发消息)

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值