usrlib-uart.h
UARTを使うための自作ライブラリです.
普段はあまりいじらないのですが、今回は、単語の文字数を15文字に制限しないと不揮発性データ領域の内容を破壊しますので、文字数を15文字に制限する役目をここで担っています.
下記の、FIELD_CHAR 16というところが制限です.末尾のNULL文字を含めて16BYTEの文字列領域を確保します.
もしも16文字以上だと、その単語は無視されますので、トラブルを防いでいます.


void UART_Init(uint32_t BaudRate, UART2_WordLength_TypeDef WordLength, UART2_StopBits_TypeDef StopBits, UART2_Parity_TypeDef Parity);
UARTを初期化する関数です.引数の選択肢はつぎです.
BaudRate ボーレート
300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200
もっと高速でもよいのかもしれませんが試したことはありません.
PCの対応速度によっても制限されますし.
WordLength parityを含む1文字のbit数
UART2_WORDLENGTH_8D   8bitデータparityなし、または7bitデータ+parity
UART2_WORDLENGTH_9D   8bitデータ+parity
StopBits stop bit長
UART2_STOPBITS_1        1bit
UART2_STOPBITS_0_5     0.5bit
UART2_STOPBITS_2         2bit
UART2_STOPBITS_1_5     1.5bit
Parity parity
UART2_PARITY_NO  No Parity. 
UART2_PARITY_EVEN  Even Parity. 
UART2_PARITY_ODD  Odd Parity. 

void UART_PutChar(char c);       UARTに1文字送信
void UART_PutString(char *s);    UARTに文字列を送信
int separate_line(char *tmp);   
文字列tmpが含む単語を切り出すルーチンです.
たとえば、tmp="up down updown 12" だったら、upとdownとupdownと12にバラバラの単語にし変数Fieldに格納します.
単語の個数4を返します.

void UART2RX_isr(void);    UARTから1文字受信する毎の割り込み関数です.

#define FIELD_NUM 4    コマンド行内の最大の単語数を設定します
#define FIELD_CHAR 30    コマンド行内の各々の単語の最大文字数を設定します

extern char Field[FIELD_NUM][FIELD_CHAR];     コマンド行内の単語を格納する配列
extern char command[FIELD_NUM*FIELD_CHAR];    コマンド行の文字列
extern u8 UART_STR_EXIST;    1行受信したら1になるフラグ
extern int bytes_read;     受信した文字数



usrlib-uart.c
#include "stdio.h"
#include "stdlib.h"
#include "stm8s.h"
#include "usrlib-uart.h"

void UART_Init(uint32_t BaudRate, UART2_WordLength_TypeDef WordLength, UART2_StopBits_TypeDef StopBits, UART2_Parity_TypeDef Parity)
UARTを初期化する関数です.引数は上で説明しました.
{
    UART2_DeInit();
  UART2_Init(BaudRate, WordLength, StopBits, Parity, UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);   
  UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);
    UART2_Cmd(ENABLE);
}


void UART_PutChar(char c)
       UARTに1文字送信
{
   UART2_SendData8(c);
   while ((UART2->SR & UART2_SR_TXE ) != UART2_SR_TXE );
}


void UART_PutString(char *s)
    UARTに文字列を送信
{
    while (*s != '\0')
    {
        UART_PutChar(*s);
        s ++;
    }
}


// divide a line into words
//  input:
//        tmp = "abc def ghi jklm"
//  output:
//      Field[0] = "abc"
//      Field[1] = "def"
//      Field[2] = "ghi"
//      Field[3] = "jklm"
char Field[FIELD_NUM][FIELD_CHAR];
int separate_line(char *tmp){
     文字列tmpが含む単語を切り出すルーチンです.
たとえば、tmp="up down updown 12" だったら、upとdownとupdownと12にバラバラの単語にし変数Fieldに格納します.
単語の個数4を返します.

  int  p,f,fp;
  p=0;
  while(tmp[p]<=32){   // neglection top space
    if(tmp[p]==0) {Field[0][0]=0; return(0);}
        else{
            p++;
            if(p==FIELD_NUM*FIELD_CHAR-1){
                Field[0][0]=0;
                return(0);
            }
        }
  }
  f=0; fp=0;
  while(1){
    if(tmp[p]==0){  // end of line
        Field[f][fp]=0;
        if(fp==0) return(f);
        else return(f+1);
      }
    else if(tmp[p]<=32){  // space found
        if(tmp[p-1]>32){  // there is a character
          Field[f][fp]=0;
          f++; fp=0;   // prepair next word
                if(f==FIELD_NUM){
                    Field[0][0]=0;
                    return(0);
                }
          p++;
                if(p==FIELD_NUM*FIELD_CHAR-1){
                    Field[0][0]=0;
                    return(0);
                }
        }
            else{   // nothing character
                p++;
                if(p==FIELD_NUM*FIELD_CHAR-1){
                    Field[0][0]=0;
                    return(0);
                }
            }
      }
    else{  // found a character
        Field[f][fp]=tmp[p];
        fp++;
            if(fp==FIELD_CHAR){
                Field[0][0]=0;
                return(0);
            }
        p++;
            if(p==FIELD_NUM*FIELD_CHAR-1){
                Field[0][0]=0;
                return(0);
            }
      }
  }
}


// UART RX interrupt routine
// interrupt each characters
char command[FIELD_NUM*FIELD_CHAR];
u8 UART_STR_EXIST = 0;
int bytes_read = 0;

void UART2RX_isr(void) interrupt 21
    UARTから1文字受信する毎の割り込み関数です.
受信した文字をcommand文字列に格納して行を形成します.
BSを処理します.
CRを受信したら、1行受信完了なのでUART_STR_EXIST=1にします.
{
    if(UART2_GetITStatus(UART2_IT_RXNE)==SET)
    {
        char c;
        if(UART_STR_EXIST==1) return;
        c = UART2_ReceiveData8();
        if(c == '\r'){  // CR
            command[bytes_read] = '\0';
            bytes_read = 0;
            UART_STR_EXIST = 1;   // command string exist flag
            return;
        }
        else if(c == '\b'){  // BS
            if (bytes_read > 0){
                UART_PutString("\b \b");
                bytes_read--;
            }
            return;
        }
        else if(bytes_read >= FIELD_NUM*FIELD_CHAR ){
            UART_PutString("Command too long\r\n");
            bytes_read = 0;
            return;
        }
        else if(c >= 0x20 && c <= 0x7E){
            command[bytes_read++] = c;
            UART_PutChar(c);
        }
    }
}


inserted by FC2 system