私はシリアルポートを初めて使用し、Centos 7コンピュータにシリアル用のループバックケーブルがあります。ポートをテストするPythonエントリがありますが、ループバックが接続されていない場合でも、プログラムは期待値を返すことがわかりました。 Linuxのポートにはすでにある種のソフトウェアループバックがありますか?
これが有用な情報であれば、私は以下のようにpySerialを使用しています。 (この情報の一部をメモリから入力する必要があるため、間違って入力した場合はお詫び申し上げます。しかし、私の質問はコードに関するものではなく、このポートが実際にどのように機能するかについてです。
import serial
BAUD_RATE = 9600
def main():
tx = b"A"
COM_PORT='/dev/ttyS0'
ser = serial.Serial(COM_PORT, BAUD_RATE, timeout=1, parity=serial.PARITY_NONE, rtscts=False, dsrdtr=False)
ser.setDTR(False)
ser.flush()
print("Port " + COM_PORT)
for y in range (0,10):
print("Sent: " + str(tx))
ser.write(tx)
rx = ser.read(1)
print("Received: " + str(rx))
if(len(rx) > 0):
print(COM_PORT + " - " + str(rx))
ser.close()
if __name__ == "__main__":
main()
以下のように短く簡単なシリアルテストを使用しても同じことが起こります。
ターミナル1
cat /dev/ttyS0
ターミナル2
echo "test" > /dev/ttyS0
おわかりのように、両方のテストで予想される出力が得られましたが、ケーブルが接続されているかどうかにかかわらず同じ出力が出ました。
テスト出力
インターフェイスが実際に文字デバイスであることを確認してください。
ls -l /dev/ttyS0
出力:crw-rw----, 1 user group 4, Date /dev/ttyS0
他のプロセスが開いていないことを確認してください。
sudo lsof /dev/ttyS0
出力:エラー後でコピーする必要があります。 sudo なしで実行すると、空行が返されます。
UARTの確認
sudo setserial -v /dev/ttyS0
出力:/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
信号が印加されると、CTSと同様のピンが変化します。
sudo statserial /dev/ttyS0
出力:/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
ケーブルが接続されているかどうかにかかわらず、ポートでechoコマンドを実行しても、この出力は変わりません。
発信番号と受信番号が変更されていることを確認してください。
sudo cat /proc/tty/driver/serial
出力:
0: uart:16550A port:000003F8 irq:4 tx:8335 rx:8301
1: uart:16550A port:000002F8 irq:3 tx:0 rx:0
//There's a few more serial ports, but they all have 0 tx and rx, and on port 03F8, the tx and tx increase when I send to the serial port ttyS0
もう1つの関連する問題/症状は、Pythonスクリプトを実行した後にcat /dev/ttys0を実行できなくなることです。
そのため、pythonスクリプトを実行する前に好きなだけファイルをキャットできますが、pythonスクリプトを実行した直後にファイルをキャットすることはできず、すぐに何も返しません。確認してみると、ファイルがまだ開いていません。なぜこれが起こるのかわかりません。
修正する
送信および受信時に0と表示される他のポートをテストしたところ、実際に送信値が増加することを確認しましたが、受信できないことを確認しました。私が試していないものが受信されないようにすることはできますか?繰り返しますが、最初のポートに予期しない動作(予期しない自動ループバックを除く)があるため、いくつかの構成が異なるとします。しかし、すべてのポートに適用されるルールが見つかりませんでした。