26

仮想シリアル ポートに書き込み、ネットワーク経由でリモート クライアントから同じポートを介してデータを受信できるアプリケーションを開発しています。

アプリケーションは Linux サーバー上で実行されます。シリアル ポートを使用するのは初めてで、このトピックについていくつか質問があります。

クライアント

クライアントは、サーバーへの TCP 接続を確立できます。クライアントをセットアップするときは、サーバーの IP アドレス、tcp ポート (通常は 8080)、および仮想 COM ポートを提供する必要があります。

その後、クライアントは自動的にサーバーへの接続を試みます。

サーバ

サーバーには、クライアント構成で設定したものと同じ仮想COMポートがあります(COM1など)。サーバー上のアプリケーションがこのポートにデータを書き込むと、データは tcp 経由で接続されているすべてのクライアントに送信されます。クライアントからの応答は、TCP を介してサーバーに送信され、サーバーは仮想シリアル ポートを介してそれを読み取ることができます。

質問

Windows では、ほとんどの作業を行う仮想シリアル ポート コネクタhttp://www.eterlogic.com/Products.VSPE.htmlを使用しました。ただし、Linux マシンでこの問題を解決したいと考えています。

私の質問は、仮想シリアル ポートが接続され、TCP を介してこのポートを介してリッスンしているクライアントにデータを送受信できる TCP サーバーを作成するにはどうすればよいかということです。

4

3 に答える 3

42

socatを試してください。考えられるシナリオ:

socat  pty,link=/dev/virtualcom0,raw  tcp:192.168.254.254:8080&

socatは 192.168.254.254:8080 への TCP 接続を作成するため、/dev/virtualcom0 に書き込まれるすべてのものが 192.168.254.254:8080 に転送され、その逆も同様です。

もう 1 つの方法は、Linux サーバー側でser2netを介してRFC2217を使用し、Windows 側で RFC2217 ドライバーを使用することです (たとえば、http: //www.hw-group.com/products/hw_vsp/index_en.htmlシングル ポート バージョン)。また、 http: //pyserial.sourceforge.net/を取得して ser2net で動作させることもできます。

于 2014-03-27T13:30:37.353 に答える
4

あなたはsocatとser2netと他のプログラムを持っていますが、私の経験は非常に悪いです...正しく動作していません. 私はこの小さな python プログラムを実行しましたが、役に立つ可能性があります。ポート、ボーレートを更新してから、任意の tcp クライアントを使用します。自動実行スクリプトとして使用したくない場合は、最初の行を削除します

#!/usr/bin/python

import socket
import sys
import serial

#open serial port
ser = serial.Serial('/dev/ttyAMA0', 115200, timeout=0)
#create socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

#bond to the port. Don't use localhost to accept external connections
server_address = ('', 2105)
print('starting up on {} port {}'.format(*server_address))
sock.bind(server_address)

#listen
sock.listen(1)

#loop
while True:
    #waits for a new connection
    print('waiting for a connection')
    connection, client_address = sock.accept()
    try:
        print('connection from', client_address)
        #continously send from serial port to tcp and viceversa
        connection.settimeout(0.1)
        while True:
            try:
                data = connection.recv(16)
                if data == '': break
                ser.write(data)
            except KeyboardInterrupt:
                connection.close()
                sys.exit()
            except Exception as e:
                pass
            received_data = ser.read(ser.inWaiting())
            connection.sendall(received_data)
    except Exception as e:
        print e

    finally:
        #clean up connection
        connection.close()
于 2020-10-16T18:29:19.807 に答える