shimamura1026
@shimamura1026

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Raspberry Pi とマイコンをシリアル通信(RS232C)でつなげたい

解決したいこと

ラズパイとマイコンのシリアル通信を可能にしたい

前提

ラズパイとマイコンのシリアル通信にトライしているが、規定のコマンドを送信しても返信がない
ラズパイとマイコンはRS232CとUSBの変換コードを介している
マイコン指定の伝送コードはASCIIで、
フォーマットは {STX}{コマンド}{CR}{チェックサム}{ETX}
「チェックサムが’0000’の場合は誤り検出を行わずに実行します。」との記述があったのでチェックサムは'0000'に固定している
マイコン付属の通信確認ソフトをPCにインストールし確認してみたが、問題なく応答したので配線等の問題ではないと思う
baudrateが9600なのは確認済み
普段はvb.netを使っているのでコードを書いてみたが、こちらでは返信があった
しかし、いざラズパイのpythonで実装しようとしたがうまくいかない

該当のソースコード


import serial

writeSer = serial.Serial('/dev/ttyUSB0',9600,timeout=1)
dat = send_data('ABC123') #送りたいコマンド

def send_data(s):
    s='\2'+s+'\15'+'0000'+'\3' #{STX} + コマンド + {CR} + チェックサム + {ETX}
    return s.encode('ascii')

for b in dat:
    print(hex(b).encode('ascii'))
    writeSer.write(hex(b).encode('ascii'))

writeSer.close()

readSer = serial.Serial('/dev/ttyUSB0',9600,timeout=1)
line = readSer.readline()
print("Read  serial:"+line.decode('ascii')) #返信表示
readSer.close()

試したこと

https://qiita.com/umi_mori/items/757834e0ef75f38cea19
https://teratail.com/questions/sgqssronc4bzcn
上記を参考に作成した

以下はちゃんと返信があったvb.netのコード

vb.net

SerialPort1.Write(Chr(&H2)) '{STX}
text = "ABC123"             '{コマンド}
For i = 1 To Len(text)
            SerialPort1.Write(Mid(text, i, 1))
Next
SerialPort1.Write(Chr(&HD)) '{CR}
text = "0000"               '{チェックサム}
For i = 1 To Len(text)
            SerialPort1.Write(Mid(text, i, 1))
Next
SerialPort1.Write(Chr(&H3)) '{ETX}

それとpythonの{CR}のところがasciiコード表だと13となっているが、\13にしてみると0x0bとなってしまう。
0x0dだと思っていたのだがこの違いは何なのか?

0

2Answer

それとpythonの{CR}のところがasciiコード表だと13となっているが、\13にしてみると0x0bとなってしまう。
0x0dだと思っていたのだがこの違いは何なのか?

CRは 0x0d で 10進数 で 13 です。
\13ではなく、\0xdと書けばよいはずです。
\13だと、8進数の13の意味なので、10進数の11、16進数の0bになります。

1Like

Comments

  1. > ラズパイとマイコンのシリアル通信を可能にしたい

    「ラズパイ」とは、「Raspberry Pi 4」とかでしょうか?
    「マイコン」とは何を指しているのでしょうか?

    UART(シリアル通信)で接続するなら、GND、TXD、RXDの3ピンを接続するだけです。
    USBが出てくるので、相手はPCでしょうか?

  2. ↑ ラズパイ(Raspberry Pi 2/3/4)と マイコン(Raspberry Pi Pico)をUART(シリアル通信)で接続する例です。

  3. @shimamura1026

    Questioner

    「ラズパイ」は「Raspberry Pi 4」です。
    すみません、「マイコン」は「マイコン用表示器」です。
    このマイコン用表示器はシリアル通信がRS232C指定です。

    UARTを使用するにはレベル変換をする必要があると思ったので、まずは表示器に付属のRS232C用コードを接続し、そこにUSB変換ケーブルを差してRaspberry Pi 4と接続させています。

  4. UARTを使用するにはレベル変換をする必要があると思ったので、まずは表示器に付属のRS232C用コードを接続し、そこにUSB変換ケーブルを差してRaspberry Pi 4と接続させています。

    それで通信できているのなら問題ないと思います。

    ちなみに、
    「マイコン用表示器」の型名が不明のため 不確実ですが、5Vで動作するなら、
    マイコン側のRS232-Cのpin2(TXD)、pin3(RXD)、pin7(GND)をラズパイの該当するピンに直接接続することもできます。(TXDとRXDはクロスで接続する)

  5. @shimamura1026

    Questioner

    print(writeSer) を入れてみると open=True と表記されるので接続はできていると思っています。
    5VDCなので直接接続は可能そうです。
    試してみます。

  6. ラズパイでUARTを使用する場合は、raspi-configでuartを有効にする必要があります。
    また、デバイスは、/dev/ttyXXX になります。

質問がわかりづらすぎるのでこんな感じですかね?

質問
RS-232Cで接続する表示器がありRaspberry Pi 4と接続したい
本体内蔵のUARTで接続するにはレベルを変換する必要があるので
USB<->RS-232C変換器を使って接続したが何も表示されない

vb.netで作ったのはちゃんと動作したのでpythonで実装したい

手順
ラズパイのUSBポートに挿す
USBシリアルを確認する

pi@raspberrypi:~/work/python $ ls -l /dev/ttyUSB*
複数挿してなければ/dev/ttyUSB0になる
シリアルのアクセス権限を追加
モジュールをインストール

0Like

Comments

  1. @shimamura1026

    Questioner

    質問内容はそれで合っています。
    どの情報が必要なのかわからなかったので、とりあえずわかることを書いてしまい逆にわかりづらくしてしまいました。すいません。

  2. @shimamura1026

    Questioner

    ・複数挿してなければ/dev/ttyUSB0になる
    $ ls -l /dev/ttyUSB* 
    で /dev/ttyUSB0 が表示されています

    ・シリアルのアクセス権限を追加
    $ stty -F /dev/ttyUSB0 
    で各種値が表示されているので権限はあるという認識でよろしいのでしょうか。

    ・モジュールをインストール
    $ pip list

    pyserial 3.5b0
    を確認しました。

Your answer might help someone💌