私は C プログラミングとマイクロコントローラーが初めてです。C18 を搭載した PIC18F24K20 マイクロコントローラーを使用しています。USART 送受信機能を使用してコンピュータ入力から情報を受信するようにセットアップしました。私の目標は、受信した単語を既知の単語と比較し、受信した単語に基づいて何かをコンピューターに送信することです。以下は関連するコードです。
#include "p18f24k20.h"
#include "delays.h"
#include "string.h"
#include "stdlib.h"
void CommTransmit ( rom char * );
void main (void)
{
char buf[11], data, T;
int i;
i = 0;
memset(buf, 0, sizeof buf);
while(1)
{
if (PIR1bits.RCIF)
{
data = USART_receive();
if (data != 47) // 47 is /, indicates end of string
{
buf[i] = data;
i++;
}
else
{
// T = strcmppgm2ram(buf,(const far rom char*)"test");
CommTransmit(buf);
USART_transmit('t');
buf[0] = 0'
}
}
}
}
void CommTransmit ( rom char *CommVariable )
{
char test;
test = strcmppgm2ram(CommVariable, (const far rom char*)"test");
if (test == 0)
{
USART_transmit('g');
}
}
コードは現在、何が問題なのかを判断するためにテストするように設定されています。そのまま実行すると、マイクロコントローラーが CommTransmit 関数を実行したかのように、コンピューターは「t」を受け取ります。ただし、「g」は送信されません。USART_transmit('g') 呼び出しを CommTransmit 関数の外側と if ステートメントの後に入れても、呼び出されることはありません (strcmppgm2ram 関数でスタックするように?) が、それでも 't' を送信します。
CommTransmit関数にブレークを入れて1行ずつ実行すると、正常に動作するように見えるため、これも奇妙です。しかし、MPLAB IDE 内で CommVariable を見てみると、本来あるべきものではありません (ただし、関数に呼び出される前の 'buf' 変数は正しいものです)。私が知る限り、私が見るときの CommVariable の値は、配列のサイズに依存します。
読んでみると、マイクロコントローラーが変数を格納する方法(プログラムとデータメモリの違い)が原因である可能性があると思いますが、よくわかりません。どんな助けでも大歓迎です!
編集: CommTransmit 行の前の else ステートメントで T = strcmppgm2ram 行のコメントを外すと、正しく動作することも追加する必要があります (2 つの文字列が同じ場合は T = 0)。関数を介して配列を渡すと、配列が変更され、strcmppgm2ram 関数が正しく機能しなくなると思います。