完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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("端口: %dn" % 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("端口: %dn" % 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的互发消息) |
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1183浏览 3评论
609浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
601浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2336浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1897浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 03:19 , Processed in 1.576527 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号