********************(myFunction.c)******
* 自作汎用関数
****************************************/
#include
#include "myProject.h" // #define EU_BFSIZE
/*** EUSARTシリアル関数用 ********************/
extern char RBuf[]; // 受信文字Buffer
extern uint8_t SFlg; // 受信フラグ
static uint8_t sIdx = 0; // 受信文字列Index
/*--- Eusart受信割り込みハンドラー -------------
* eusrt.cのEUSART_Recive_ISRに追加すること
*---------------------------------------------*/
void myEusart(){
char ch;
ch = EUSART_Read();
#if ECHO == ON
EUSART_Write(ch);
#endif
if((ch == 0x0a)||(ch == 0x0d)){ // 改行処理
RBuf[sIdx] = 0;
sIdx = 0;
SFlg = 1;
}else if((ch == 0x08)&&(sIdx > 0)){ // BS処理
sIdx--;
}else{
if(sIdx < EU_BFSIZE) RBuf[sIdx++] = ch;
}
}
/*--- Eusart受信データを返す--------------------
* *str:受信データを格納する文字列
* RETURN:受信した文字数([0]ならデータ無し)
*---------------------------------------------*/
/*uint8_t EU_gets(char *str){
strcpy(str,rBuf);
return strlen(rBuf);
}
*/
/*--- Eusartへ文字列を送信 ---------------------
* *str:送信したい文字列データ
*---------------------------------------------*/
void EU_Write(char *str){
while(*str != 0){ // 文字列終りまで
EUSART_Write(*str++); // 1文字送信
}
}
/*--- Eusartへ改行を送信 ----------------------*/
void EU_Write_CR(void){
EUSART_Write('\n');
}
/*--- Eusartへ文字列送信(改行付)--------------
* *str:送信したい文字列データ
*---------------------------------------------*/
void EU_Puts(char *str){
EU_Write(str);
EU_Write_CR();
}
/*** 文字列変換関数 **************************/
/*---- 16進文字列を10進数に変換[=xtoi()/C90]----
* *str:10進数に変化したい16進数文字列
* RETURN:変換された32ビット符号無し整数
*---------------------------------------------*/
uint32_t my_xtol(char *str){
uint32_t dec;
dec = strtoul(str,NULL,16);
return (uint32_t)dec;
}
/*--- 下位4ビットを16進数文字に変換 ------------
* n:符号無し16bit整数(最下位の4bitのみ有効)
* RETURN:16進数に対応するアスキー文字
*---------------------------------------------*/
uint8_t my_utoa2(uint16_t n){
n &= 0x0F;
if(n < 10) return '0'+ (uint8_t)n;
else return 'A'+ ((uint8_t)n - 10);
}
/*--- 1ワード(16ビット)を16進文字に変換 -------
* *str:変換結果を格納する文字列
* wd :変換したい符号無し16ビットデータ
* dg :16進数文字列の桁数
*----------------------------------------------*/
void my_utoa(char *str, uint16_t wd, uint8_t dg){
if(dg > 3) *str++ = my_utoa2(wd >> 12);
if(dg > 2) *str++ = my_utoa2(wd >> 8);
if(dg > 1) *str++ = my_utoa2(wd >> 4);
*str++ = my_utoa2(wd);
*str = '\0';
}
/*--- 文字列を逆順に入替 -----------------------
* *str:文字順を入れ替えたい文字列
*-----------------------------------------------*/
void reverseString(char *str) {
uint8_t i, length;
length = (uint8_t)strlen(str);
for (int i = 0; i < length / 2; i++) {
char temp = str[i];
str[i] = str[length - 1 - i];
str[length - 1 - i] = temp;
}
}
/*--- 10進数文字列変換(下位から変換)----------
* *str:変換結果を格納する文字列
* wd :変換したい符号無し16ビットデータ
*-----------------------------------------------*/
void my_itoa2(char *str, uint16_t wd){
uint8_t i;
for(int i = 0; i < 6; i++){
*str++ = '0' + (wd % 10);
wd = wd / 10;
if(wd == 0) break;
}
*str = '\0';
}
/*--- 10進数文字列変換 -------------------------
* *str:変換結果を格納する文字列
* wd :変換したい符号無し16ビットデータ
*-----------------------------------------------*/
void my_itoa(char *str, uint16_t wd){
my_itoa2(str, wd);
reverseString(str);
}
/******* End of File ********/
|