• TsMaster报文发送


    2301_76354444 2024-05-01 14:34 采纳率: 0%
    浏览 4

    TsMaster报文发送

    lin的一个项目,重复发送lin消息,比如说一共发了3个ID(重复发送)这个时候我想停止第三个ID的发送,但是没有停掉。
    想请问朋友,有没有什么好的办法去停止这个ID,我有一个想法,就是不知道成不成立,就是利用那个python脚本,比如说我摁下ctrl a,然后这个消息就能停止掉,我摁个别的键,这条消息就可以重新发送,然后关于这个脚本应该怎样编写还不是很清楚。
    恳请朋友们的帮助,谢谢

    • 写回答
    • 专家-皆知 2024-05-01 14:34
      关注

      参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

      要实现您描述的功能,我们可以编写一个Python脚本,使用线程来控制不同ID的消息发送,并结合键盘输入来控制特定ID消息的发送与停止。这里我们假设您已经有了发送LIN消息的基本功能,可能通过某个库实现,比如pylin(注意:实际中可能需要特定的LIN通信库,这里为了示例,我们不直接使用真实的LIN库,而是模拟发送过程)。

      我们将使用keyboard库监听键盘事件,以及threading库来管理消息发送的线程。如果您还没有安装keyboard库,可以通过pip安装:

      pip install keyboard
      

      下面是一个简化的示例代码,展示了如何根据键盘输入控制特定ID的消息发送:

      import threading
      import time
      from keyboard import wait, is_pressed
      
      # 假设这是您的LIN消息发送函数,实际应用中替换为真实的发送逻辑
      def send_lin_message(message_id):
          while True:
              if message_id == 3 and is_pressed('ctrl+a'):  # 检查是否按下了Ctrl+A来停止ID=3的消息发送
                  print(f"ID {message_id} 的消息发送已停止。")
                  break
              print(f"发送 LIN 消息 ID: {message_id}")
              time.sleep(1)  # 模拟发送间隔
      
      # 创建并启动线程
      threads = []
      for id in range(1, 4):  # 发送3个ID的消息
          t = threading.Thread(target=send_lin_message, args=(id,))
          threads.append(t)
          t.start()
      
      # 等待用户输入特定指令来结束程序
      print("按任意键结束程序...")
      wait()
      for t in threads:
          t.join()  # 确保所有线程完成或停止后再退出程序
      print("所有消息发送操作已结束。")
      

      这段代码创建了三个线程,每个线程负责发送一个特定ID的消息。当用户按下Ctrl+A时,如果当前处理的是ID为3的消息,则该消息的发送会被停止。任意时刻按下键盘上的任意键,整个程序会结束,所有线程也会随之停止。

      请注意,这个示例简化了很多实际应用中的细节,比如错误处理、资源清理等。在真实环境中,确保对通信资源进行适当的管理和释放,以避免潜在的问题。

      展开全部

      评论 编辑记录
    • 专家-百锦再 全栈领域优质创作者 2024-05-01 14:34
      关注

      # 这是一个简单的用于停止和重新发送消息的脚本示例import time 
      stop_flag = False
      def send_message(message):print("
      Sending message: {}"
      .format(message))def stop_message():global stop_flagstop_flag = Trueprint("
      Message sending stopped"
      )
      def restart_message():global stop_flagstop_flag = Falseprint("
      Message sending restarted"
      )
      # 模拟发送消息的函数def send_multiple_messages(message_list):for message in message_list:if stop_flag:print("
      Message sending stopped"
      )breaksend_message(message)time.sleep(1)
      # 用于测试的消息列表messages = ["
      ID1"
      , "
      ID2"
      , "
      ID3"
      ]
      # 发送消息send_multiple_messages(messages)

      在这个示例中,我们创建了一个简单的脚本,包括了发送消息、停止消息发送和重新发送消息的功能。通过设置一个全局的stop_flag变量来控制消息的发送状态。当按下特定键时,可以调用stop_message函数来停止消息发送,再次按下特定键时,可以调用restart_message函数来重新发送消息。

      希望这个示例能帮助到你解决问题。如果有任何疑问,请随时提出。


      有问题你别着急,评论留言都可以,看到马上就回复,尽量及时补充齐
      评论
    • 码农阿豪 Java领域优质创作者 2024-05-01 14:34
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      针对这个问题,可以使用Python的多线程进行实现。具体步骤如下:
      1. 使用Python的socket库建立与lin的连接,启动消息发送线程
      import socket
      import threading
      lin_ip = "192.168.0.1"
      lin_port = 1234
      lin_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      lin_socket.connect((lin_ip, lin_port))
      def send_message(msg):
          # 发送消息
          lin_socket.sendall(msg.encode())
      # 创建线程发送消息
      t1 = threading.Thread(target=send_message, args=("ID1",))
      t2 = threading.Thread(target=send_message, args=("ID2",))
      t3 = threading.Thread(target=send_message, args=("ID3",))
      t1.start()
      t2.start()
      t3.start()
      
      1. 在主线程中监听控制台输入,根据输入停止或重新发送消息
      def stop_message():
          # 停止第三个ID的消息发送
          # 此处可以根据实际需求编写停止消息发送的逻辑
          ...
      def restart_message():
          # 重新发送第三个ID的消息
          # 此处可以根据实际需求编写重新发送消息的逻辑
          ...
      while True:
          command = input("请输入操作命令:")
          if command == "ctrl+a":
              stop_message()  # 停止第三个ID的消息发送
          elif command == "ctrl+b":
              restart_message()  # 重新发送第三个ID的消息
          else:
              print("无效的操作命令")
      

      在需要停止或重新发送消息的时候,只需要在控制台输入相应的命令即可。 示例代码:(注意要根据实际情况进行修改)

      import socket
      import threading
      lin_ip = "192.168.0.1"
      lin_port = 1234
      lin_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      lin_socket.connect((lin_ip, lin_port))
      stop_flag = False  # 停止标志
      def send_message(msg):
          global stop_flag
          while not stop_flag:
              # 发送消息
              lin_socket.sendall(msg.encode())
      # 创建线程发送消息
      t1 = threading.Thread(target=send_message, args=("ID1",))
      t2 = threading.Thread(target=send_message, args=("ID2",))
      t3 = threading.Thread(target=send_message, args=("ID3",))
      t1.start()
      t2.start()
      t3.start()
      def stop_message():
          global stop_flag
          stop_flag = True
      def restart_message():
          global stop_flag
          stop_flag = False
      while True:
          command = input("请输入操作命令:")
          if command == "ctrl+a":
              stop_message()  # 停止第三个ID的消息发送
          elif command == "ctrl+b":
              restart_message()  # 重新发送第三个ID的消息
          else:
              print("无效的操作命令")
      

      在实际应用中,还需要根据具体需求进行修改。如:加入异常处理、使用信号量等。

      展开全部

      评论
    • GISer Liu 2024-05-01 14:36
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      针对你的问题,你可以考虑通过编写一个Python脚本来实现你的需求。具体来说,你可以借助Python的``` keyboard

      以下是一个简单的Python脚本示例,用于实现你描述的功能:
      python
      Copy code
      

      import keyboard
      import time

      标记是否停止发送消息

      stop_sending = False

      模拟发送消息的函数,你需要根据实际情况替换成你的发送消息代码

      def send_message(message):
      print("发送消息:", message)

      监听键盘输入的线程函数

      def listen_keyboard():
      global stop_sending
      while True:

      监听按键事件

      if keyboard.read_event().event_type == keyboard.KEY_DOWN:

      检查按下的键是否为Ctrl+A,若是则停止发送消息

      if keyboard.is_pressed('ctrl+a'):
      stop_sending = True
      print("停止发送消息")

      检查按下的键是否为其他键,若是则恢复发送消息

      else:
      stop_sending = False
      print("恢复发送消息")

      启动键盘监听线程

      keyboard_listener = keyboard.start_recording(callback=listen_keyboard)

      模拟发送消息的主循环

      while True:
      if not stop_sending:

      发送消息

      send_message("你好,这是一条示例消息")

      延时一段时间后继续发送消息

      time.sleep(1)

      这个脚本的功能是监听键盘输入,当按下Ctrl+A时停止发送消息,按下其他键时恢复发送消息。你需要根据你的实际需求,在 send_message()
      函数中编写发送消息的代码,替换掉示例中的 print("发送消息:", message) 部分。 你可以通过安装 keyboard 库来运行这个脚本,可以使用 pip install keyboard ```进行安装。
      希望这个解决方案对你有帮助,如果有任何疑问,欢迎继续提问。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-05-06 12:46
      关注

      中午好🌞🌞🌞
      本答案参考ChatGPT-3.5

      针对你的需求,可以采用以下方式去停止第三个ID的发送:

      1. 在代码中增加一个标志位,例如stop_flag,默认为False表示不停止发送。
      2. 在程序中循环发送消息时,判断stop_flag是否为True,如果是则退出发送循环。
      3. 制定一个按键事件,例如Ctrl+a,当按下这个按键时,将stop_flag设置为True,停止发送该消息。并且设置另一个按键事件,例如Ctrl+b,当按下这个按键时,将stop_flag设置为False,重新开始发送该消息。

      修改后的代码如下:

      import serial
      import time
      import keyboard
      
      ser = serial.Serial('COM1', 115200)
      
      # LIN发送消息函数
      def send_lin_msg(msg):
          ser.write(msg)
          time.sleep(0.01)
      
      # LIN消息1
      lin_msg1 = [0x55, 0x0A, 0x6C, 0x69, 0x6E, 0x31, 0x20, 0x20, 0x20, 0x20, 0xA5]
      
      # LIN消息2
      lin_msg2 = [0x55, 0x0A, 0x6C, 0x69, 0x6E, 0x32, 0x20, 0x20, 0x20, 0x20, 0xA4]
      
      # LIN消息3
      lin_msg3 = [0x55, 0x0A, 0x6C, 0x69, 0x6E, 0x33, 0x20, 0x20, 0x20, 0x20, 0xA3]
      
      # 发送LIN消息函数
      def send_lin_msgs(msg):
          # 发送消息之前初始化stop_flag
          global stop_flag
          stop_flag = False
          
          while not stop_flag:
              # 发送消息1
              send_lin_msg(msg)
              # 发送消息2
              send_lin_msg(msg)
              # 发送消息3
              send_lin_msg(msg)
      
      # 按键事件函数
      def on_press(key):
          global stop_flag
          
          # 当按下 Ctrl+a 键时,设置 stop_flag 为 True,停止发送该消息
          if key == keyboard.Key.ctrl_l and keyboard.is_pressed('a'):
              stop_flag = True
          # 当按下 Ctrl+b 键时,设置 stop_flag 为 False,重新开始发送该消息
          if key == keyboard.Key.ctrl_l and keyboard.is_pressed('b'):
              stop_flag = False
      
      # 监听键盘按键
      with keyboard.Listener(on_press=on_press) as listener:
          # 发送消息
          send_lin_msgs(lin_msg3)
      

      需要注意的是,在代码中要注意在程序退出前要将串口关闭,避免资源泄漏。

      展开全部

      评论
  • 相关阅读:
    Java BigDecimal 类的创建对象方法以及常用的加减乘除、设置精度方法
    ShellBrowser Delphi,Delphi组件功能和工具
    linux: 切换并配置root
    安装配置Spark集群
    如何在 ggplot2 的箱线图中标记异常值
    electron
    docker基础(一)
    基于Spring Boot 3 + Spring Security6 + JWT + Redis实现登录、token身份认证
    C#:实现将整数转换为二进制表示形式的字符串算法(附完整源码)
    聊聊Java的垃圾回收机制
  • 原文地址:https://ask.csdn.net/questions/8097779