Anyone know of any scriptable asynchronous communication tools?

The closest so-far appears to be Kermit. It’s been around since CP/M, but apparently there’s still no centralised language reference and the syntax predates Perl.

  • @Lodra@programming.dev
    link
    fedilink
    English
    33 months ago

    Uh email? It’s not exactly exciting but there are loads of tools available for automating emails. Definitely asynchronous. Does it fit your needs?

    • Onno (VK6FLAB)OP
      link
      3
      edit-2
      3 months ago

      No, it needs to be serial communication. My use case is talking to a CNC.

      Edit: fat fingers: “ea” -> “to a”

      • @catloaf@lemm.ee
        link
        fedilink
        English
        13 months ago

        So you’re just pushing ASCII over the wire? That’s such a simple scenario that you probably don’t even need a program for it. Reading and writing /dev/ttyS0 directly would be enough.

        If any scriptable terminals aren’t sufficient, you should be able to write a little custom one in your preferred language.

          • @catloaf@lemm.ee
            link
            fedilink
            English
            13 months ago

            Kermit, as you mentioned. You could probably use expect as well. But like I said, if the connection is simple but the conversation complex, you might just write it all yourself and save the time you’ll spend fighting Kermit or whatever to get it to do what you want.

        • Onno (VK6FLAB)OP
          link
          13 months ago

          That’s several recommendations for expect. I’ll start digging. Thank you.

  • @HamsterRage@lemmy.ca
    link
    fedilink
    13 months ago

    Kermit on top of FTP can work really well. Kermit has its own communication and transfer protocol, IIRC, but updates in the 1990’s allowed it to be used with TCP/IP and FTP. So you can write a script to log into a remote system, run some commands and then initiate a file transfer. The scripting allows you to wait for responses and act on them.

    • Onno (VK6FLAB)OP
      link
      13 months ago

      Yes. As I said, I’m aware of Kermit. It’s like sendmail, user friendly, just picky who it makes friends with.

      I have not discovered a complete language reference for Kermit, neither have I been able to determine if it works asynchronously, since the examples I’ve found are just polling loops, which is not what I need.

      My use case is talking over serial to a CNC to iteratively calibrate it. This requires dealing with asynchronous events, think move, interrupt by edge switch.

      • @HamsterRage@lemmy.ca
        link
        fedilink
        13 months ago

        Keep in mind that it has been decades since I last used Kermit, but I’m pretty sure the use case it was originally designed for was…

        Connect to a serial port, which had a modem attached. Talk to the modem and get it to dial a number. Presumably, the remote end answered and the port attached to its modem would issue a login prompt. Negotiate the login and then issue a bunch of commands to change directories and then launch Kermit on the remote system. After that Kermit to Kermit communications took over until you terminated the session. Finally, log off the remote system and hang up the modem.

        All of this stuff could be done via scripts. I seem to remember that it would actually wait for a response, and then parse the response in the script. I don’t remember ever doing polling loops.

        If you’re on a *nix box of some type, it’s totally possible to open up a serial port for manual I/O even in something like a bash script. Even if you have to reverse telnet to a terminal server.

        • Onno (VK6FLAB)OP
          link
          13 months ago

          I started down the bash path but came unstuck when I wanted to create a process that uses a single bidirectional serial port to write a move command, whilst reading the current location and checking to see if an end stop switch was closed to write a stop command.

          Ideally, all of it is interrupt driven, but I’m at a loss to see how I can do this with either Kermit or expect. Both appear to use a send, then wait for a response model, even if you can check for different responses.

          Of note is that the end stop is external to the serial communication, so I can’t check the same stream for that information.

          • @HamsterRage@lemmy.ca
            link
            fedilink
            13 months ago

            the end stop in external to the serial communication

            Does this mean that you have some kind of other signals or pin-outs? If so, this is starting to sound like a great project for a Raspberry Pi, because the GPIO pin array can handle that.

            • Onno (VK6FLAB)OP
              link
              13 months ago

              Yeah, it’s already on a pi, connected to my LAN and the USB port of the CNC. The switch is on a gpio pin.

              I need to automate the calibration of the three axis. In other words, tell the CNC to move a specific distance, then figure out how far it actually moved, update the number of steps per mm, rinse and repeat.

              To implement this, I have a known calibrated distance, a set of three 1-2-3 blocks, so I actually need to move until the switch closes, then ask the CNC how far it thinks it moved.

              I intend to run this several times because right now, doing it manually is giving me weird results and I’m trying to figure out the root cause of the error.

              So, I need to move an axis, interrupt the move if the switch is closed, and keep moving until the switch is closed.

              • @HamsterRage@lemmy.ca
                link
                fedilink
                13 months ago

                Maybe then you need to move one stop up from scripting into something closer to actually programming. I’d be surprised if Python doesn’t have the library support on a Pi for dealing with both serial and GPIO I/O.

                • Onno (VK6FLAB)OP
                  link
                  13 months ago

                  Yeah, I was hoping to avoid that, but it’s been heading that way for a few days now :}