1

入力UARTイベントハンドラーを介して入力番号をキャプチャし、その番号のいくつかの乗算で出力しようとしています。文字列は問題なく印刷されますが、印刷後、プログラムは入力に反応しなくなります。alfabetを印刷したり、エラーメッセージを表示したりすることは可能ですが、printf関数を使用すると、端末が入力に応答しなくなり、カーソルが次の行の途中に置かれます。

これはCコードです:

#include "mss_uart.h"
#include <stdio.h>

#define RX_BUFF_SIZE    64
#define MSS_UART_57600_BAUD     57600
uint8_t g_rx_buff[RX_BUFF_SIZE];
uint8_t g_rx_idx;

void uart0_rx_handler( mss_uart_instance_t * this_uart )
{
MSS_UART_get_rx( &g_mss_uart0, &g_rx_buff[g_rx_idx], sizeof(g_rx_buff) );
if(g_rx_buff[g_rx_idx] > 96 && g_rx_buff[g_rx_idx] < 123)
{
    uint8_t message[55] = "De letter was: x, de uppercase letter van : x is y.\n\r";
    message[15] = g_rx_buff[g_rx_idx];
    message[44] = g_rx_buff[g_rx_idx];
    message[49] = g_rx_buff[g_rx_idx] - 32;

    MSS_UART_polled_tx( &g_mss_uart0, message, sizeof(message) );
}
else if(g_rx_buff[g_rx_idx] > 64 && g_rx_buff[g_rx_idx] < 91)
{
    uint8_t message[55] = "De letter was: x, de lowercase letter van : x is y.\n\r";
    message[15] = g_rx_buff[g_rx_idx];
    message[44] = g_rx_buff[g_rx_idx];
    message[49] = g_rx_buff[g_rx_idx] + 32;

    MSS_UART_polled_tx( &g_mss_uart0, message, sizeof(message) );
}
else if(g_rx_buff[g_rx_idx] > 47 && g_rx_buff[g_rx_idx] < 58)
{
    int number = g_rx_buff[g_rx_idx] - '0';
            int number2 = number * number;
            int number3 = number2 * number;
            int number4 = number3 * number;

    printf("Getallenreeks: %d, %d, %d, %d.\n\r", number, number2, number3, number4);

}
else
{
    uint8_t message[10] = "Error.\n\r";
    MSS_UART_polled_tx( &g_mss_uart0, message, sizeof(message) );
}
}

int main(void)
{
MSS_UART_init
(
        &g_mss_uart0,
        MSS_UART_57600_BAUD,
        MSS_UART_DATA_8_BITS | MSS_UART_NO_PARITY | MSS_UART_ONE_STOP_BIT
);

MSS_UART_set_rx_handler( &g_mss_uart0, uart0_rx_handler, MSS_UART_FIFO_SINGLE_BYTE    );

while ( 1 )
{}
return(0);
}

void uart0_rx_handlerは割り込みハンドラーであり、MSS_UART_get_rxは入力をg_rx_buff[g_rx_idx]に入れます。

文字に使用しているのと同じMSS_UART_polled_tx関数を使用して数値を印刷しようとしましたが、うまくいきませんでした。間違ったASCII値を出力します:

if(g_rx_buff[g_rx_idx] > 47 && g_rx_buff[g_rx_idx] < 58)
{
    int number = g_rx_buff[g_rx_idx] - '0';
    int number2 = number * number;
    int number3 = number2 * number;
    int number4 = number3 * number;

    uint8_t message[15] = "Getallenreeks: ";
    uint8_t komma[2] = ", ";
    uint8_t end[5] = ".\n\r";

    char numberstring2[2];
    char numberstring3[3];
    char numberstring4[4];

    sprintf(numberstring2, "%d", number2);
    sprintf(numberstring3, "%d", number3);
    sprintf(numberstring4, "%d", number4);

    uint8_t messagenumber[1];
    uint8_t messagenumber2[1];
    uint8_t messagenumber3[1];
    uint8_t messagenumber4[1];

    messagenumber[0] = '0' + number;
    messagenumber2[0] = '0' + number2;
    messagenumber3[0] = '0' + number3;
    messagenumber4[0] = '0' + number4;      

    http://imageshack.us/photo/my-images/843/testlan.jpg/( &g_mss_uart0, message, sizeof(message) );
    MSS_UART_polled_tx( &g_mss_uart0, messagegetal, sizeof(messagenumber) );
    MSS_UART_polled_tx( &g_mss_uart0, komma, sizeof(komma) );
    MSS_UART_polled_tx( &g_mss_uart0, messagegetal2, sizeof(messagenumber2) );
    MSS_UART_polled_tx( &g_mss_uart0, komma, sizeof(komma) );
    MSS_UART_polled_tx( &g_mss_uart0, messagegetal3, sizeof(messagenumber3) );
    MSS_UART_polled_tx( &g_mss_uart0, komma, sizeof(komma) );
    MSS_UART_polled_tx( &g_mss_uart0, messagegetal4, sizeof(messagenumber4) );
    MSS_UART_polled_tx( &g_mss_uart0, end, sizeof(end) );       
 }

コード出力の例: http: //imageshack.us/photo/my-images/843/testlan.jpg/ 左の端末はprintf関数の使用を示し、右の端末は数値に対するMSS_UART_polled_tx関数の使用を示しています(2番目のコードブロックに示されています) )。

4

2 に答える 2

1

最大のエラーは「\r\ n」の長さを4(2)としてカウントしたことだと思います。もう1つは、終了するNULバイトが使用するスペースを含む`sizeofstringarray'を使用したことです。

  /** added */
#include <stdint.h>
#include <stdio.h>

struct xx;
typedef struct xx mss_uart_instance_t;

void MSS_UART_get_rx( mss_uart_instance_t * the_uart, uint8_t buff[] , size_t len );
void MSS_UART_polled_tx( mss_uart_instance_t * the_uart, uint8_t buff[] , size_t len );
    /** End added */

#define RX_BUFF_SIZE    64
#define MSS_UART_57600_BAUD     57600

uint8_t g_rx_buff[RX_BUFF_SIZE];
uint8_t g_rx_idx;

void uart0_rx_handler( mss_uart_instance_t * this_uart )
{
    MSS_UART_get_rx( this_uart, &g_rx_buff[g_rx_idx], sizeof g_rx_buff );
    if(g_rx_buff[g_rx_idx] >= 'a' && g_rx_buff[g_rx_idx] <= 'z')
    {
        uint8_t message[] = "De letter was: x, de uppercase letter van : x is y.\n\r";
        message[15] = g_rx_buff[g_rx_idx];
        message[44] = g_rx_buff[g_rx_idx];
        message[49] = g_rx_buff[g_rx_idx] - ('a' - 'A');

        MSS_UART_polled_tx( this_uart, message, strlen(message) ); /* 52 */
    }
    else if(g_rx_buff[g_rx_idx] >= 'A' && g_rx_buff[g_rx_idx] <= 'Z' )
    {
        uint8_t message[] = "De letter was: x, de lowercase letter van : x is y.\n\r";
        message[15] = g_rx_buff[g_rx_idx];
        message[44] = g_rx_buff[g_rx_idx];
        message[49] = g_rx_buff[g_rx_idx] + ('a' - 'A');

        MSS_UART_polled_tx( this_uart, message, strlen(message) ); /* 52 */
    }
    else if(g_rx_buff[g_rx_idx] >= '0' && g_rx_buff[g_rx_idx] <= '9')
    {
        uint8_t bigbuff[70] ;
        size_t buflen;
        int number = g_rx_buff[g_rx_idx] - '0';
                int number2 = number * number;
                int number3 = number2 * number;
                int number4 = number3 * number;

        buflen = sprintf(bigbuff, "Getallenreeks: %d, %d, %d, %d.\n\r", number, number2, number3, number4);
        MSS_UART_polled_tx( this_uart, bigbuff, buflen );

    }
    else
    {
        uint8_t message[] = "Error.\n\r";
        MSS_UART_polled_tx( this_uart, message, strlen(message) ); /* 8 */
    }
}
于 2012-03-21T16:56:30.417 に答える
0

2つの問題があると思います。

1つは、割り込みハンドラー内でprintf()を呼び出していて、ハングしていることです。おそらく、プラットフォーム上でprintf()を割り込みコンテキストから呼び出すことはできません。これは、(推測で)割り込み駆動の出力を使用しようとし、割り込みが無効になっているために発生しない完了割り込みを待機するためです。

2番目の問題は、2番目の例からの出力に関する期待に関係することです。彼らは私には大丈夫に見えます。かなり大きな数を乗算してから、char値に追加しています。これにより、1文字になりますが、これは不要な文字または記号である可能性があります。例えば

'0' + 16 == '@'

あなたの例の1つに見られるもの。「16」、つまり「1」と「6」の2文字を出力する場合は、個々の文字を計算するためにさらに作業を行う必要があります(10による除算を含む)。

于 2012-03-21T16:56:10.120 に答える