ページ 11

2つの通信をうまく捌く方法

Posted: 2012年1月15日(日) 00:25
by ぽんた
SHマイコンとVB.NET2.0アプリケーションをLANで接続したいと思います。
次のようにLAN経由の接続要求を待ち受けているmain()ループを考えます。
また、GPSからおよそ1秒ごとに送られてくるSPIシリアル通信の頭文字 "$" を
発見した時、パーサに通すような処理をします。

コード:

/* 一部簡略化しています */
void main(void){
	while(1){
		if(!isTcpOpen(SOCKET0)){
			TCP_ServerOpen();
		}else if( getSnSR(SOCKET0) == Sn_SR_CLOSED){
			TCP_ServerClose();
		}
		if(io_getchar() == '$'){
			perse(); /* パーサを起動 */
		}
	}
}
LANにはSPIで得た情報を処理した結果を送出します。

このとき、LAN経由の接続要求を0.2秒ごとに受けるのですが、
LANとSPIの2つの通信タイミングが衝突することが容易に考えられます。
接続要求には完全にか、あるいは優先して応答すべきだと思いますので、
このさいSPI通信のデータは取りこぼしがあっても構いません。

割り込みなどを使って、なんとかスマートに処理したいと思うのですが、
良い知恵をお持ちのかたはいらっしゃいますか?

Re: 2つの通信をうまく捌く方法

Posted: 2012年1月15日(日) 09:57
by ぽんた
次のプロセスで自己解決できる見通しになりましたので取り急ぎご報告します。

1.GPSに対してRate(自動送出)モードからQuery(問合応答)モードに切り替えるコマンドを送信。
2.LAN通信は接続要求があればプロセスに対して割り込みを行う。
3.SPI通信はGPS側のLAN通信の割り込み処理中でデータ送出をQuery(応答要求)する。

結果としてC言語の相談ではなく、考え方の問題でした。
お騒がせしました。