私はシリアル通信方式を書いていると再発する問題が発生し始めています。これはタイミングが原因であるようです。私の組み込みプラットフォームはRabbit Semiconductor BL2600です。この場合、RS232のデバイスと通信しています。デバイスにコマンドを送信すると、デバイスはBL2600に返信を返し、処理されます。組み込み機器で堅牢なRS232シリアル通信方式を作るには?
私の問題は、私がコマンドを送信してから応答を待つと、私は問題を起こさないということです。しかし、私が適切な場所にブレークポイントを設定し、コードを一歩進めると、しばしば応答が得られます。私はコンピュータをBL2600とデバイスの間に置いて、(最初の問題を見た後に)RS232ストリームをリッスンし、ブレークポイントかどうかにかかわらず応答が送信されますが、BL2600はバッファ内にしか見えません私がコードを解析して、そのスタートビットを見つけようとする部分の直前で止まったら、後で文字列全体を読み込んだときにブレークポイントを設定しても、それを見つけることはできません。
私は十分待っているようには思えません。ちょうどばかげて、バッファを1秒間チェックするためのタイムアウトを設定しました(38400のボーレートで、私はブレークポイントとシングルステップがなければ何も得られません。以下は
私のコードの重要な部分である:
//clear the buffers
serCwrFlush();
while(serCwrUsed())
{
;
}
startwait = MS_TIMER;
while((serCrdUsed() > 1) && (device_timeout_check < 1000))
{
if (MS_TIMER < startwait)
{ // fix the rollover
device_timeout_check = MS_TIMER + (ULONG_MAX - startwait);
}
else
{ //set it like normal
device_timeout_check = MS_TIMER - startwait;
}
serCrdFlush();
}
serCputs("mpcal=d\r"); //This is what requests the response from the device
while(serCwrUsed())
{
;
}
startwait = MS_TIMER;
while((serCrdUsed() < 11) && (device_timeout_check < 1000))
{
if (MS_TIMER < startwait)
{ // fix the rollover
device_timeout_check = MS_TIMER + (ULONG_MAX - startwait);
}
else
{ //set it like normal
device_timeout_check = MS_TIMER - startwait;
}
}
//grab it
temp=serCpeek();
i=0;
//It expects a response like "H0V0M00.0 /r"
//So I am looking for the first character.
while((temp != 'H') && (i<100))
{
serCgetc(); //breakpoint works here
temp=serCpeek();
i++;
}
c=serCread(comp_cal_string,20, 20); //breakpoint doesn't work here
私は、車輪を再発明して、誰かが、おそらくそう、少なくとも別のプラットフォーム上で、私の前にこれを行っていることだという気持ちを持っていますデータが受信されるのに十分な長さであるが、実際にデータを捕捉するのに十分なほど速いことがわかる。
オシロスコープで信号を見ましたか?適切な範囲なしでは、このようなことはできません。 UART回線に不具合などがある場合、誤入力が発生している可能性があります。常に、実際の信号がコード内で掘り下げられる前に確認されていることを確認することから始めます。 – Lundin