パスワードを忘れた? アカウント作成
473313 journal

yuriの日記: RS422/485→データ変換→RS232 15

日記 by yuri
差動シリアルでもらったデータをPCに取り込んで
フォーマット変換をして
RS232で吐き出すというプログラムが欲しいと
友達に頼まれてて
何とかしてあげたいといろいろ考えているけれど
私の力ではすぐに作ってあげることができず
歯がゆい今日この頃

何とかしたいのう。
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 10年前はそんな感じの仕事をいっぱいやってたぉ。
    • そうなんだ~
      作って^H^H教えてもらおうかなあ、、、
      親コメント
      • # しかしPC使うのは数える程しかなかったという。たいてい専用ハードだったりワンチップマイコンだったり。
        で、どんなの?
        親コメント
        • RS422で毎秒送られてくる固定長のバイナリデータをASCII固定長フォーマットに押し込んでRS232で毎秒送り出すという代物です。
          文章で書くとそれほど難しそうでもない気もするのですが、
          通信プログラムって私には敷居が高すぎて
          受信用バッファと送受信バッファはリングバッファにしたほうがいいのかなあ~とか
          ポートの指定とか状態確認もしないといけないにゃあ~とか
          受信データと送信データのダンプもした方がいいだろうな~とか
          受信する固定長のデータのかたまりをどうやって塊として扱う(切り出す?)んだろう、とか

          疑問噴出で前に進めなくなっちゃいました。
          親コメント
          • 通信手順はある? ポーリングしなきゃならんとか応答しなきゃならんとかデータが止まったら何かするとか。

            >バッファ
            リングバッファは必要ないよ。頭出ししたらそのまま格納すればいいし。
            バッファに格納したら構造体として取り出してfprintf一発で出力とかできそうな気がする。

            >ダンプ
            うまくいってないのがわかってからで十分。
            上のfprintfをstdoutにすれば画面に出るし。

            >頭出し
            特定データが頭に付いてるならそれで、でなければ時間で(0.5秒以上空いたら次は頭)とか?

            あとは環境依存だなぁ...。
            親コメント
            • コメントありがとうございます。助かります&嬉しいです。

              >通信手順はある?
              いや、垂れ流しだったと思います。

              >リングバッファは必要ないよ。頭出ししたらそのまま格納すればいいし。
              ほぇ?取り込んでから頭出しするのではなくて??
              #頭出ししてからデータブロックを格納すれば確かに即変換処理できそう。。

              データ頭出しは、出来たかなあ。。調べてこよう。
              固定パターンが入っていればいいんですよね♪
              (変動データの中に固定パターンが混じったらイヤンな予感がしますが)

              とにかく、安く作りたいというのが強いので、WinPC上で動くアプリを作るのが
              一番安そうですが、Linux機を入れるとか、PICスターターキットみたいなのを
              使うというのでもお小遣いの範囲でできれば良いんですよ。

              親コメント
              • # いや、ま、そんなに大した事じゃないし...。

                >リングバッファ
                リングバッファが必要なのはそのデータが処理されるまでに時間がかかることがある場合なのね。で、この場合はOSの上ならリングバッファは標準装備だし、ワンチップマイコンの場合は入力があったらすぐ処理できる。なのでどちらにせよ不要なのです。

                でも...それにしてもPCだとあまりにも大袈裟過ぎるですよ。通信速度にもよるけどPICなら「12系、内蔵クロック、電源はシリアルから」で十分な気が。
                親コメント
              • PICでCプログラミング [picfun.com]のページをみてみると
                "複数チャネルのシリアル通信を行う場合には、1チャネルはUSARTで行い、別のチャネルはプログラムでシリアル通信"
                なぁんて書いてありますね。。
                サンプルを見ると、1文字ずつ取り込んで吐き出すやり方はなんとなくわかった気がしますが、、
                あとはデータの塊を切り出すところを考えないとなぁ。。
                1秒毎に垂れ流されるから、500msでタイマを回して取り溜めたデータをブロックとして処理すればいいのかな?そこで頭出し(固定データパターンを探す)をするのか、、
                #UARTなんて触ったこともないや。できるかな?

                本当いろいろ教えていただいてありがとうです。
                親コメント
              • >1秒毎に垂れ流されるから、500msでタイマを回して取り溜めたデータをブロックとして処理

                ワンチップマイコンでは「取り溜めて」くれる人がいないからそれではダメ。PC使うにしてもそれだと出力が変に遅れるし。UART使うなら受信割り込みで(あるいはステータスを見て)すぐに受信、その時頭出しできてなければ頭出し判定。受信中なら受信&終了判定。
                # 送信と受信、どちらかにUART使えるなら迷わず受信に使う。送信と受信では難易度が全然違うので。

                ところで、それ、ハードはいくつくらい用意するの?
                親コメント
              • 俺にできるのか。。。組み込みワンチップマイコン。。。

                tarosukeたんのソリューションでは、UARTとRS232の両方のインタフェース(両方Dサブ?)を備えていて、
                かつC言語でプログラムを書くようなキットを使うのが一番良いということかしら?

                ハードはいくつ欲しいかというと、まあ1個か2個ですね。
                だいたい動作が出来るようになったら友達にこれ使いなって引き渡すけど
                その後で自分でいじりたくなったらもう1個あればいいかな~と。
                親コメント
              • >tarosukeたんのソリューションでは、UARTとRS232の両方のインタフェース(両方Dサブ?)を備えていて、
                >かつC言語でプログラムを書くようなキットを使うのが一番良いということかしら?

                ソリューションレベルまで後退するなら、まずは「ASCIIで受け取る人やバイナリでデータ吐いてくる人は改造できないの?」と尋ねるよ。それができればハードは売ってる433/485-232変換アダプタで済むから。あと、Cで書くならPICじゃないほうがよいかもだ。あれは、特に12系はアセンブラで書くものだと思う。

                ...というかその前にハードはどうする?作ってみる?
                親コメント
              • ソフトな世界もハードだけど、駄洒落を言いたかっただけです、ごめん。

                開発の背景をちょっとだけバラすと、
                機器A(RS232で毎秒ASCII固定長データを吐き出す子)と
                機器B(RS485で毎秒バイナリ固定長データを吐き出す子)と
                機器C(機器Bのデータを受け取る子)がいて、
                通常はB→C接続(Aは別の機器にデータ送出しててB、Cとは無関係)なんだけど、
                ある条件のときに機器Bが使えないので、そん時は機器Aのデータを細工して
                機器Bのフォーマットを作り出して、A→Cに接続しちゃおう!という仕掛けです。
                元機器はそのままで、信号を分配&切り替えて使いたいんです。

                PIC12系じゃないとすると、PIC16系(そういう系があるのも今日知った)か
                AKIマイコンとかですかねー。
                おねいさんにはアセンブラは粒度が小さすぎて使いこなせません(;o;)

                電子工作なら、回路図が分かっていれば何とかなりそうです
                (そりゃ誰だって出来るお
                親コメント
              • A,B,Cはどれも変更不可なのは了解。
                # あと、変換方向逆じゃん。

                そしたら、A,B両方から受信する必要があるから必要なポートは485の入出力1、232の入力1になるね。B-CのラインとAのラインのブリッジみたいな位置付けだと考えてよい? あと「Bが使えない状態」ではBはどうしてる?だんまり?というかBの状態を知るにはどうしたらよい?

                それから、Bって一つ?485使ってるところを見ると複数繋がってる場合もありそうなんだけど、だとしたらプロトコル的に無手順ってのはありそうにない。485では衝突検出できないのでCがポーリングしてる可能性が大。でもそうすると切り替えずにバスにぶら下げるだけで済むかも(=普段の通信を中継する必要がない)。
                #「見積もるから仕様書おくれ」と出かかってるけど飲み込んでおく(飲んでないじゃん>をれ
                親コメント
              • あ~~~~全然違うこと書いてしまいました。ごめんなさい。

                A(ASCII送出:232)
                B(バイナリ送出:485)
                C(Aからの受け専)
                で、Aが使えない(これは人間が判断)と分かったときに手動でポチと
                B→変換機→Aの言葉→C という変換機がほし~の
                です。申し訳ないです。

                >そしたら、A,B両方から受信する必要があるから必要なポートは485の入出力1、232の入力1になるね。
                上記訂正を反映して、485入力1と232出力1です。

                >B-CのラインとAのラインのブリッジみたいな位置付けだと考えてよい?
                これも上記をうけて、A-CラインとBのブリッジ、です(ホンマすまん)。

                >それから、Bって一つ?485使ってるところを見ると複数繋がってる場合もありそうなんだけど、
                >だとしたらプロトコル的に無手順ってのはありそうにない。
                >485では衝突検出できないのでC がポーリングしてる可能性が大。
                >でもそうすると切り替えずにバスにぶら下げるだけで済むかも(=普段の通信を中継する必要がない)。

                あーこれは可能性大です。どういう手順かは、、調べて来ます。。
                それでねー、これねー、仕様書ないんですよ。。
                お金も出ないんですもの。。。
                #泣いてないッ!泣いてないからねッ!だからtarosukeたんも泣かないで

                親コメント
  • 会社の先輩と相談を受けた友達から少しだけ情報を引き出すことができたのでメモ:
    A(ASCII送出:232)
    B(バイナリ送出:485)
    C(Aからの受け専)
    という機器をつなぐ、Bからデータを貰ってAの言葉を喋ってCに流す変換機Xですが、
    ・Bは垂れ流しだけど開始時に特殊なパターンを出すことが判明
    ・Aは4800baudで、ちゃんとした規格。Bは独自フォーマット、しかもRS232
    →両方232だとなんだか話が簡単になってくれる気がしてきたお(気のせい?

    今日、VC++ Express Edition(2005と2008)にSerialPortというコントローラが
    あることも判明したので、これはVC++EEで書けるのかなあ(それよか簡単で面白い方法があれば無論飛びつきますww)と目論んでみたりしているところ。
    #RubyかJavaも齧ってみたいし、電子工作はもっと未知で興味をそそるところ…
typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...