3

RS232 ポートからコマンドを読み取り、次のアクションに使用できるプログラムを作成しようとしています。

文字列比較コマンドを使用して、目的の「アクション」文字列を RS232 文字列と比較しています。文字列変換のどこかで問題が発生しています。putstr コマンドを使用して、マイクロコントローラーがコンピューターから取得しているものを確認しましたが、適切に機能しません。真ん中にドットまたは「d」を付けて、文字列の最後の2文字を返します。(ドット/ dがどこから来たのかまったくわかりません..)

これが私のメインコードです:

int length;
char *str[20];
while(1)
{
    delayms(1000);
    length = 5; //maximum length per string
    getstr(*str, length); //get string from the RS232
    putstr(*str); //return the string to the computer by RS232 for debugging
    if (strncmp (*str,"prox",strlen("prox")) == 0) //check wether four letters in the string are the same as the word "prox"
    {
        LCD_clearscreen(0xF00F);
        printf ("prox detected");
    }
    else if (strncmp (*str,"AA",strlen("AA")) == 0) //check wether two letters in the string are the same as the chars "AA"
    {
        LCD_clearscreen(0x0F0F);
        printf ("AA detected");
    }
}

これらは使用される RS232 関数です:

/*
 * p u t s t r
 *
 *  Send a string towards the RS232 port
 */
void putstr(char *s)
{
    while(*s != '\0')
    {
            putch(*s);
            s++;
    }
}

/*
 * p u t c h
 *
 *  Send a character towards the RS232 port
 */
void putch(char c)
{
    while(U1STAbits.UTXBF);     // Wait for space in the transmit buffer
    U1TXREG=c;
    if (debug) LCD_putc(c);
}

/*
 * g e t c
 *
 *  Receive a character of the RS232 port
 */
char getch(void)
{
    while(!has_c());    // Wait till data is available in the receive buffer
    return(U1RXREG);
}

/*
 * g e t s t r
 *
 * Receive a line with a maximum amount of characters
 * the line is closed with '\0'
 * the amount of received characters is returned
 */
 int getstr(char *buf, int size)
 {
    int i;

    for (i = 0 ; i < size-1 ; i++)
    {
        if ((buf[i++] = getch()) == '\n') break;
    }
    buf[i] = '\0';

    return(i);
}

マイクロチップを端末に接続してこのプログラムを使用すると、次のような結果が得られます。

What I send:
abcdefgh

What I get back (in sets of 3 characters):
adbc.de.fg.h
4

2 に答える 2

3

問題は、文字列を宣言する方法です。現在のように、20 個のcharポインターの配列を宣言します。charおそらく通常の配列として宣言する必要があると思います:

char str[20];

次に、配列を関数に渡すときは、単に eg を使用しますgetstr(str, length);

于 2012-06-07T13:07:55.060 に答える
2

私の知る限り、文字列自体ではなく、文字列へのポインターを渡すと、strcmp関数が機能します。

ご利用にあたって

char *str[20];

char の配列ではなく、"str" という名前のポインターの配列を宣言しています。

問題は、ポインターの配列を strcmp 関数に渡していることです。文字列を次のように宣言することで解決できます。

 char string[20];

何らかの奇妙な理由で char * を使用する必要がある場合、次の宣言は同等です。

   char * str = malloc(20*sizeof(int)) 

それが役立つことを願っています。

于 2012-06-07T13:22:17.920 に答える