シリアルプログラミング:測定時間の間に文字
-
20-09-2019 - |
質問
私の送受信データをシリアルラインLinuxいて教えてください間の遅延は文字です。
Modbusを使用し3.5文字が遅れ検出のメッセージフレーム。がある場合以上15文字の遅れには、メッセージフレームが宣言された不完全なものです。
書い、迅速プログラムをCでは基本的には
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
// setup newtio
....
tcsetattr(fd, TCSANOW, &newtio);
for(;;) {
res = read(fs, buf, 1);
if (res > 0) {
// store time in milliseconds?
//do stuff
}
}
あ測定の時間。はかる上で重要な要素である取得データからのシリアル線の異なる。
こ掛け入SIGIOに信号があった場合には、データがるようになデータを8バイトです。
(あるのは、私が確かに存在するmodbus図書館のものを使いたいのことを他のアプリケーション等)
解決
MODBUSは、古いプロトコルの多くのようで、本当に現代のハードウェアを嫌っています。
一度に8つのバイトを取得している理由は次のとおりです。 お使いのPCは、ハードウェアでは、送受信に(少なくとも)16バイトのシリアルFIFOを持っています。ほとんどが64バイトまたは大きなされます。
これはのうちの時間にUARTデバイスを伝え、char型の回数後に割り込み受け付けを発行するの可能です。
トリガレベルは調整可能であるが、低レベルのドライバは、「スマート」に設定します。 )にsetserialを使用して低遅延モードを試してみてください あなたがしなければならない場合は、シリアルドライバのコードをいじることができます。 Googleのそれ(成人向けコンテンツの警告)それはかなりではありません。
そのルーチンは擬似コードの通りです。
int actual=read (packet, timeout of 1.5 chars) look at actual # of received bytes if less than a packet, has issues, discard.
素晴らしいではありません。
他のヒント
単純な回答は--- はできません はなまでは払える気があります。シリアルドライバー)!
を書いていてMODBUS マスター あい:きのいずれかを検出するendのスレーブ対応が待ってるよ 他の 量の時間に提供していく3.5char)を受けることなく何かを選択(2)支援できますこちら)、構文解析することによって、回答のときに読んで(第方法で廃棄物の少ない。ていなければなりませんようにご注意ください待 少なくとも 3.5クトグラムを利用した英作文の時間を見送信の新しい要求を受信後、対前ます。"少なくとも"の術!待ってまりはどちらでも構いません。待って満たない。
場合は、書面にMODBUS スレーブ そのときは"新分別の手引き"を見 てのデモインのホテルを表示.するだけで できない い 確実に から使いインプリメンテーションです。好きない独自のシリアルドライバーです。
ちなみに、こんなLinuxす。これにより、安定した信じられないstupidityのMODBUSの作方法です。
私はあなたがこのことについて間違った道を進んでいると思います。そこには文字がすべて一緒に来ることを確保するためのメカニズムに組み込まれています。
基本的に、あなたはioctl()
を使用して適切VMIN
とVTIME
パラメータを設定したいしようとしています。この場合、あなたが(彼らは秒の十分の一です)VMIN
することが0
(パケット内の文字の最小数)VTIME
すると15
(文字の間に許される時間の最小量をしたいと思うように思えるます。
一部のの本当にの基本的なコード例:
struct termio t;
t.c_cc[ VMIN ] = 0;
t.c_cc[ VTIME ] = 15;
if (ioctl( fd, TCSETAW, &t ) == -1)
{
printf( msg, "ioctl(set) failed on port %s. Exiting...", yourPort);
exit( 1 );
}
あなたのopen()
前に、しかし、あなたのread()
前に行ってください。ここで私は乱暴に有用見つけたリンクのカップルがいます:
VMINとVMAX に理解する
私は、少なくとも、それはあなたの質問のための完璧な答えでない場合でも正しい方向にあなたを指す/役立つことを願っています。
使用できませんタイムアウト。高ボーレート率3.5文字タイムアウトというのは数ミリ秒単位で数百マイクロ秒単位.どのタイムアウトできない取り扱いのLinuxユーザ空間です。
クライアント側では、なめでModbusく非同期メッセージできない送信2年連続メッセージ内3.5文字タイムアウト.
サーバー側の問題である場合において非常に早い応答タイムアウトおよびLinuxでは忙しくできませんの書き防弾枠組みます。する可能性がありread()機能に戻ります。こちらはちょっとしたり、逆に)。
お客様に書き込みパケットサーバーです。タイムアウトということか20ms.
ということかとLinuxでは現在非常に忙しいので、カーネルな目覚めをおスレッド内の次の50msです。
後20msトを検出しんでいるような気がご対応で送別パケットサーバーも再前)してご利用いただけます。
場合はLinuxの目覚めにお読みのスレッドを50ms、read()関数では2つのパケットも1年半によってどのように多くのバイトで受け入れたシリアルポートドライバーです。
私の実装を使用してい簡単な方法という解析バイトon-the-fly-最初に検出する機能コードしてみ読み取られ、また、残されているすべてのバイトの特定の機能です。だ半のパケットし解析では、残りバイトのバッファです。場合によりバイト内の短いタイムアウトを追加するを行ってから試してみてください解析を、そうでない廃棄する。で、完璧なソリューション(例えばサブ-コード機能の8かる固定サイズ)でMODBUS RTUなSTX ETX文字を付加することでカスタマーサポート/よくあった。