MAX3232というICがある。チャージポンプ回路を内蔵し、TTLレベルから真のRS232Cレベルに変換してくれるIC!!
ナイス!名前からしてマキシム・インテグレーテッドだろうとおもったら、Analog Devicesが買収していた。リニアテクノロジーもまさかの買収されたとおもったら、こっちもか。
さて、それはおいておき、このMAX3232を搭載したものが非常に安価で販売されている。
RS232Cコネクタ付いて48円??え?
Amazonでも5個で750円?
買ったのだが、買ってから気がついた、これメスコネクタ?装置はオスコネクタで、えーっと?クロスケーブルがいいのかストレートケーブルがいいのか判断できないぞ?ちょっと配線図を確認しないといけないですね。
かk人すると、、、ICのレシーバーRXが3ピン、トランスミッターTXが2ピンという配置のようだ。
今回ターゲットにしている電子天秤はA&Dのものなので、、例えばGH-252の取説を見ると2が、ん?Rxが送信データ?ん?レシーバーでRx、トランスミッタでTxだとおもったが、どうなってるんだろう?接続相手の配線を書いているのだと思うのだが・・・また検討しようと思います。
一対一の接続仕様ですから、パソコン側が出力の端子は、端末側は入力となります。
同じ端子記号を使うので、入出力を勘違いしないように気をつけます。
この場合は同じ端子番号同士を接続するストレートケーブルとなります。
特別な利用として、クロスケーブルを使って、パソコン同士のデータ転送に使うこともできます。
出力端子を相手の受信端子に接続するのでクロスケーブルといいます。
データ端子以外に、データのタイミングをとるRTS-CTSや、受付け許可をとるDTS-RTSがありまが、データ一時待機を必要としなければ、データのTXDとRXDのみの接続で行うことが可能です。
受付け許可をとるDTS-RTS
受付け許可をとるDTR-DSR
レベルシフタも双方向じゃないので、抵抗とダイオードで電源とGNDにクリップさせるような方式が簡単でいいのかなと思っています。
買ってきたMAX3232は発熱が結構大きくてあれ?って思っています。2kΩのプルダウンが結構聴いてるのかな。
ダイオードクリップで十分だと思いますが、信号がインバートですので、トランジスタやゲートインバータで反転させるか、ワンチップマイコンのシリアルI/Oに入力反転の設定ができるならOKです。
ワンチップマイコンのシリアルI/Oは1バイト分のバッファしかもたないので、プログラムの処理が間に合わない場合は、割り込みを使ってバッファ機能を入れる必要があります。
パソコンで受信するなら、すでにOSにバッファリング機能があるので問題ないですが、バッファ容量を超えるまで放おっておくとエラーします。
マイコンチップでバッファリングできない場合は、RTS-CTSハンドシェイクで、相手に送信待ちを要求すれば問題解決できる場合があります。
端末側の記号は入出力が逆表示なので勘違いに注意です。
RTSで送信停止要求をしない限り、送信側の都合でどんどん送られてくるので、受信漏れが無いようにしなければいけません。
シリアルデータをシフトレジスタで、1バイトのデータに変換する、シリアルI/Oを利用します。
ところが、シリアルI/Oは、1バイトの受信バッファしか持たないため、9600bpsの場合、約100uS以内にバッファデータを読まないと次のデータを取り込めなくなります。
バッファーに1バイトのデータが入ると割り込み要求してくるので、割り込みによって数百バイト程度のリングバッファにデータを一時退避させるように割り込み処理をプログラムします。
RAMに設定した容量の作業エリアを確保し、最大アドレスになったら、また先頭からの先読み後出しとするリングバッファを組みます。
メインプログラムがデータを読み出すには、最終データアドレスから1バイトづつ読みだしていきます。
実際にはもっといろいろ細かな構造が必要ですが、独自にPICマイコン用に割り込みプログラムを完成させて使っています。
通信エラーもなく快調に動作します。(^_-)-☆
食品在庫と同じで、新しいものを仕入れて古いものから使うです。(^^;
Arduinoのプログラムだと受信完了のフラグが立ったら一旦内容をメモリにコピーしますので、16MHzで数クロックなら、サブusくらいで処理が終わるかと思っています。
本来ならシリアルインターフェースの回路、受信完了したら割り込みイベント発生できるはずなので、その割り込みで処理をしておくのが効率いいかなと思っていますが、受信待っている間に処理するメニューがありませんので、ひたすらポーリングでバッファ溜まった?のループでやっています。
文字列処理は面倒なので、RS232Cで7ビットのキャラクター受信したら、即時キーボード信号でPCに送信して処理なので、今気になっているのはキーボード信号1文字の送出にどれくらい時間が必要かといったところです。
それと、9600bpsの転送速度は通常1mSでした。すみません。
2400bpsで7bitなら、S1,Data,E1で9bitなので1文字あたり、3.7mSの余裕がありますね。
ただ、送信もRS232Cを使って、同じボーレートだと、送信バッファが空になるまで受信と同じ時間がかかるので、バッファ無しだと難しいかも。
でも、送信はHIDみたいなので問題ないかな?