現在、STM32F0
にスマートメーター用のSMLリーダーを実装しています。 すべてが正常に動作しますが、私はstring.h
strstrを使用すると奇妙なエラーが発生する
現状からstrstr
を使用して問題を抱えている:
私はUSART経由で着信のすべてのデータが含まれているchar配列のデータを、持っています。それはHexnumbersと有効なTextstringを含んでいます。
この文字列のどこかにこのシーケンスがあります。 {0x01,0x01,0x62,0x1b,0x52,0x00,0x55}
です。
strstr
を使用して、Datastringでこの部分文字列の位置を探したいとします。
それは、この例の文字列でうまく動作しますが、それはDatastringの先頭に常にある:{0x1b,0x1b,0x1b,0x1b,0x01,0x01,0x01,0x01,0x76,0x05}
しかし、私は他の部分文字列を使用している場合、それは動作しません。ここで
私のコードです:
const char needle[] = {0x01,0x01,0x62,0x1b,0x52,0x00,0x55};
if((needle_ptr = strstr(Data,needle)) == NULL){
//No Active Power String detected
flags &= ~NewPowervalue; //Reset NewPowervalue flag
}else{
Powervalue = (needle_ptr[14]<<24) + (needle_ptr[15]<<16) + (needle_ptr[16]<<8) + (needle_ptr[17])/10000;
//Extract and calculate Powervalue
flags |= NewPowervalue; //Set NewPowervalue flag
Poweroutlets(&Powervalue);
GPIOC->ODR ^= BLED;
}
は私が間違っているの何誰もが手掛かりを持っていますか?
おそらく0x00文字の出現が問題です。これはstrstrが文字列ターミネータとして解釈する可能性があります。 – SBS
一般に、このデータをUSARTから文字列データとして扱うことは私には愚かなようです。文字列は "ねえ、どうやってやっている?"印刷可能なASCII文字(または使用している文字エンコーディング)ですべてのデータを表現できない場合は、文字列関数を使用するべきではありません。受け取っているデータに文字列が埋め込まれている場合は、文字列関数を使用する場合は最初に解析します。バイナリデータを扱うときは、['memcpy'](https://linux.die.net/man/3/memcpy)とフレンドを使用するか、独自の解析関数を記述してください。 – yano
ヌルバイト(0x00)でその文字列を終了していないため、 'strstr()'が配列の境界を読み出すので、0x1b ... 0x05 'string'が動作することは幸運です。 'strstr()'や文字列処理関数を使用している場合は、NULL終端文字列を扱っていることを確認する必要があります。答えの(少なくとも)一つで示されるように、 'memmem()'関数は、有界長メモリの仕事のための 'strstr()'のアナログです。しかし、POSIX関数(標準Cはもちろん)ではありませんが、(Linux、macOS、AIXなどの)それよりも広く利用できるかもしれません。 –