yuriの日記: RS422/485→データ変換→RS232 15
日記 by
yuri
差動シリアルでもらったデータをPCに取り込んで
フォーマット変換をして
RS232で吐き出すというプログラムが欲しいと
友達に頼まれてて
何とかしてあげたいといろいろ考えているけれど
私の力ではすぐに作ってあげることができず
歯がゆい今日この頃
何とかしたいのう。
フォーマット変換をして
RS232で吐き出すというプログラムが欲しいと
友達に頼まれてて
何とかしてあげたいといろいろ考えているけれど
私の力ではすぐに作ってあげることができず
歯がゆい今日この頃
何とかしたいのう。
うむぅ懐かしい (スコア:1)
Re:うむぅ懐かしい (スコア:1)
作って^H^H教えてもらおうかなあ、、、
Re:うむぅ懐かしい (スコア:1)
で、どんなの?
だいたいこんなかんじ (スコア:1)
文章で書くとそれほど難しそうでもない気もするのですが、
通信プログラムって私には敷居が高すぎて
受信用バッファと送受信バッファはリングバッファにしたほうがいいのかなあ~とか
ポートの指定とか状態確認もしないといけないにゃあ~とか
受信データと送信データのダンプもした方がいいだろうな~とか
受信する固定長のデータのかたまりをどうやって塊として扱う(切り出す?)んだろう、とか
疑問噴出で前に進めなくなっちゃいました。
Re:だいたいこんなかんじ (スコア:1)
>バッファ
リングバッファは必要ないよ。頭出ししたらそのまま格納すればいいし。
バッファに格納したら構造体として取り出してfprintf一発で出力とかできそうな気がする。
>ダンプ
うまくいってないのがわかってからで十分。
上のfprintfをstdoutにすれば画面に出るし。
>頭出し
特定データが頭に付いてるならそれで、でなければ時間で(0.5秒以上空いたら次は頭)とか?
あとは環境依存だなぁ...。
Re:だいたいこんなかんじ (スコア:1)
>通信手順はある?
いや、垂れ流しだったと思います。
>リングバッファは必要ないよ。頭出ししたらそのまま格納すればいいし。
ほぇ?取り込んでから頭出しするのではなくて??
#頭出ししてからデータブロックを格納すれば確かに即変換処理できそう。。
データ頭出しは、出来たかなあ。。調べてこよう。
固定パターンが入っていればいいんですよね♪
(変動データの中に固定パターンが混じったらイヤンな予感がしますが)
とにかく、安く作りたいというのが強いので、WinPC上で動くアプリを作るのが
一番安そうですが、Linux機を入れるとか、PICスターターキットみたいなのを
使うというのでもお小遣いの範囲でできれば良いんですよ。
Re:だいたいこんなかんじ (スコア:1)
>リングバッファ
リングバッファが必要なのはそのデータが処理されるまでに時間がかかることがある場合なのね。で、この場合はOSの上ならリングバッファは標準装備だし、ワンチップマイコンの場合は入力があったらすぐ処理できる。なのでどちらにせよ不要なのです。
でも...それにしてもPCだとあまりにも大袈裟過ぎるですよ。通信速度にもよるけどPICなら「12系、内蔵クロック、電源はシリアルから」で十分な気が。
PICかあ。。 (スコア:1)
"複数チャネルのシリアル通信を行う場合には、1チャネルはUSARTで行い、別のチャネルはプログラムでシリアル通信"
なぁんて書いてありますね。。
サンプルを見ると、1文字ずつ取り込んで吐き出すやり方はなんとなくわかった気がしますが、、
あとはデータの塊を切り出すところを考えないとなぁ。。
1秒毎に垂れ流されるから、500msでタイマを回して取り溜めたデータをブロックとして処理すればいいのかな?そこで頭出し(固定データパターンを探す)をするのか、、
#UARTなんて触ったこともないや。できるかな?
本当いろいろ教えていただいてありがとうです。
ようこそ組み込みの世界へー(ぉ (スコア:1)
ワンチップマイコンでは「取り溜めて」くれる人がいないからそれではダメ。PC使うにしてもそれだと出力が変に遅れるし。UART使うなら受信割り込みで(あるいはステータスを見て)すぐに受信、その時頭出しできてなければ頭出し判定。受信中なら受信&終了判定。
# 送信と受信、どちらかにUART使えるなら迷わず受信に使う。送信と受信では難易度が全然違うので。
ところで、それ、ハードはいくつくらい用意するの?
Re:ようこそ組み込みの世界へー(ぉ (スコア:1)
tarosukeたんのソリューションでは、UARTとRS232の両方のインタフェース(両方Dサブ?)を備えていて、
かつC言語でプログラムを書くようなキットを使うのが一番良いということかしら?
ハードはいくつ欲しいかというと、まあ1個か2個ですね。
だいたい動作が出来るようになったら友達にこれ使いなって引き渡すけど
その後で自分でいじりたくなったらもう1個あればいいかな~と。
というか、はーどうぇあのせかいへようこそー(ふはははは(ボスキャラぽく (スコア:1)
>かつC言語でプログラムを書くようなキットを使うのが一番良いということかしら?
ソリューションレベルまで後退するなら、まずは「ASCIIで受け取る人やバイナリでデータ吐いてくる人は改造できないの?」と尋ねるよ。それができればハードは売ってる433/485-232変換アダプタで済むから。あと、Cで書くならPICじゃないほうがよいかもだ。あれは、特に12系はアセンブラで書くものだと思う。
...というかその前にハードはどうする?作ってみる?
ハードの世界はハードそうですぅ (スコア:1)
開発の背景をちょっとだけバラすと、
機器A(RS232で毎秒ASCII固定長データを吐き出す子)と
機器B(RS485で毎秒バイナリ固定長データを吐き出す子)と
機器C(機器Bのデータを受け取る子)がいて、
通常はB→C接続(Aは別の機器にデータ送出しててB、Cとは無関係)なんだけど、
ある条件のときに機器Bが使えないので、そん時は機器Aのデータを細工して
機器Bのフォーマットを作り出して、A→Cに接続しちゃおう!という仕掛けです。
元機器はそのままで、信号を分配&切り替えて使いたいんです。
PIC12系じゃないとすると、PIC16系(そういう系があるのも今日知った)か
AKIマイコンとかですかねー。
おねいさんにはアセンブラは粒度が小さすぎて使いこなせません(;o;)
電子工作なら、回路図が分かっていれば何とかなりそうです
(そりゃ誰だって出来るお
あるぇ?話が違うよ? (スコア:1)
# あと、変換方向逆じゃん。
そしたら、A,B両方から受信する必要があるから必要なポートは485の入出力1、232の入力1になるね。B-CのラインとAのラインのブリッジみたいな位置付けだと考えてよい? あと「Bが使えない状態」ではBはどうしてる?だんまり?というかBの状態を知るにはどうしたらよい?
それから、Bって一つ?485使ってるところを見ると複数繋がってる場合もありそうなんだけど、だとしたらプロトコル的に無手順ってのはありそうにない。485では衝突検出できないのでCがポーリングしてる可能性が大。でもそうすると切り替えずにバスにぶら下げるだけで済むかも(=普段の通信を中継する必要がない)。
#「見積もるから仕様書おくれ」と出かかってるけど飲み込んでおく(飲んでないじゃん>をれ
Re:あるぇ?話が違うよ? (スコア:1)
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たんも泣かないで
少し情報収集 (スコア:1)
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も齧ってみたいし、電子工作はもっと未知で興味をそそるところ…