2009-08-22 14 views
3

私は、シリアルポートからデータを読み取り、TCP接続を介してそのデータを送信するアプリケーションを開発しています。残念ながら、シリアルポートからデータを読み取っている間、決して停止しません。 EOFマークやEOLなどの特殊文字は検出されません。LinuxとCでシリアルポート経由でファイルを送信する

CとLinuxのシリアルポートでファイルの終わり(または「接続の終了」)を検出するにはどうすればよいですか?

+0

シリアルポートに接続されているデバイスの制御量はどれくらいですか? TCPソケットの反対側のデバイスはどうですか? –

+0

TCPソケットにデータを書き込むタイミングをどのように決定しますか?つまり、ソケットを介して送信する前にデータセット全体を受信しようとしていますか、またはソケットからデータを読み込んでいて、すぐに(またはわずかにバッファされて)ソケットに書き込んでいますか? –

答えて

6

シリアルリンクに使用されているプロトコルに比べてどれだけの制御があるかによって異なります。ファイルに暗黙的にファイルの終わりのマーカーが含まれていない限り(あなたの投稿が理解できないので)、ファイルを転送するために何らかの通信プロトコルを実装する必要があります。

BBS時代に使用された最も単純なプロコールのいくつかはXMODEMであり、その誘導体です。彼らはあなたが使用するのに十分シンプルかもしれません。

シリアル回線の反対側に本格的なコンピュータがある場合は、シリアル回線経由でPPPリンクを設定し、TCP/IP経由で通信するほうがずっと簡単です。代わりに、生のリンクの

stty -F /dev/ttySx -a 

セット調理リンク:

stty -F /dev/ttySx cooked 
0

は、シリアルポートの設定を確認してください。パケットフレームはなく、エラーチェックも行われないため、生のシリアルリンク経由でファイルを確実に送信することはできません。 XMODEM、KERMITなどのプロトコルを使用する必要があります。

このようなプロトコルを実装するのは簡単ではありません。もう一方の端もコンピュータであれば、リンク上でTCP/IPを実行する方が簡単です。 SLIPまたはPPPをご覧ください。

2

シリアルリンクはバイトのみを送信

1

シリアルポートは、モデム制御回線(ドロップするとDCD)によってアウトオブバンドで通知されるハングアップ状態で「ファイルの終わり」を示します。あなたがヌルモデムに接続しているなら、それは決して起こりません。

他の回答が示唆しているように、フレーミングメカニズムを使用します。あなたはZMODEMのようなもので豚全体を移動する必要はないかもしれません - ファイルサイズの前にファイルのプレフィックスを付け、CRC32チェックサムはリンクに合理的にエラーがなく8ビットクリーンであればよいでしょう。

0

安くて汚いソリューション: Linux上で、UNIXまたはOSXは単に '画面-L <serial_device> <ボーレート>' を実行します。もう一方の端では、ファイルの出力をrawモードでコンソールに書き込みます。 -Lはそれをファイルに記録します。その内容は相手先から転送されたファイルになります。 xxdで内容を確認して、ソースでの内容と一致することを確認します。

関連する問題