STM32L010で9600bpsのソフトウェアシリアルのライブラリ化
x Mbed2
目的
ソフトウェアシリアルのテスト
シリアルの出力先は、PA_2
メインプログラム
//SER_LB_9600_010_1
#include "mbed.h"
#include "SER_9600_010_1.h"
//メイン関数
int main()
{
pc.baudNS(9600);
//無限ループ
while(1) {
//文字列の表示
pc.printNS("HELLO WORLD\r\n");
//4桁の値の表示
pc.printNS( 1234 );
//リターン
pc.printNS("\r\n");
//1秒の待ち
wait_ms(1000);
} //while
} //main
//容量削減
void error(const char* format, ...) {}
SER_9600_010_1.hのプログラム
//SER_9600_010.h
//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)
char ch_hex_a_b[16];
char *ch_hex_a(int x)
{
ch_hex_a_b[4] = 0;
if ( x >= 9000 ) {x = x - 9000; ch_hex_a_b[0] = '9';
} else if( x >= 8000 ) {x = x - 8000; ch_hex_a_b[0] = '8';
} else if( x >= 7000 ) {x = x - 7000; ch_hex_a_b[0] = '7';
} else if( x >= 6000 ) {x = x - 6000; ch_hex_a_b[0] = '6';
} else if( x >= 5000 ) {x = x - 5000; ch_hex_a_b[0] = '5';
} else if( x >= 4000 ) {x = x - 4000; ch_hex_a_b[0] = '4';
} else if( x >= 3000 ) {x = x - 3000; ch_hex_a_b[0] = '3';
} else if( x >= 2000 ) {x = x - 2000; ch_hex_a_b[0] = '2';
} else if( x >= 1000 ) {x = x - 1000; ch_hex_a_b[0] = '1';
} else { ch_hex_a_b[0] = '0';
}//if
ch_hex_a_b[3] = '0' + ( x - (DIV10(x) * 10) ); // 3 <- 120 - 123
x = DIV10(x); // 12 <= 123 / 10
ch_hex_a_b[2] = '0' + ( x - (DIV10(x) * 10) ); // 2 <- 12 - 10
ch_hex_a_b[1] = '0' + DIV10(x); // 1 <- 12 / 10
return(ch_hex_a_b);
} //ch_hex_a
#define UART_DELAY 101 // 1/9600 98-105
DigitalOut TX(PA_2);
//クラスの定義
struct _pc
{
void baudNS(int sp); //メソッドの宣言
int putcNS(char ch); //メソッドの宣言
int printNS(char *str1); //メソッドの宣言
int printNS(int num); //メソッドの宣言 オーバーロード
};
//ポートをhiにする 初期化
//メソッドの定義
void _pc::baudNS(int sp)
{
TX=1;
wait_ms(1);
}//baudNS
//仮想シリアルへの一文字出力 9600bps
//メソッドの定義
int _pc::putcNS(char ch)
{
TX=1;
TX=0;//Start
wait_us(UART_DELAY);
for(int ii=0; ii<8; ii++) { //Data x 8
TX=(ch>>ii)&1;
wait_us(UART_DELAY);
}; //for
TX=1;//Stop
wait_us(UART_DELAY);
return(0);
}//putcNS
//文字列の表示
//メソッドの定義
int _pc::printNS(char *str1)
{
//文字の中身がゼロか
while(*str1) {
//一文字出力
putcNS(*str1 ++);
} //while
//戻り値
return(0);
}//printNS
//文字列の表示 オーバーロード 4桁
//メソッドの定義
int _pc::printNS(int num)
{
if(num < 0) { putcNS('-'); num = 0 - num; }
char *str1 = ch_hex_a(num);
//文字の中身がゼロか
while(*str1) {
//一文字出力
putcNS(*str1 ++);
} //while
//戻り値
return(0);
}//printNS
//実体の作成
_pc pc;
Author And Source
この問題について(STM32L010で9600bpsのソフトウェアシリアルのライブラリ化), 我々は、より多くの情報をここで見つけました https://qiita.com/caa45040/items/148153e5b83772d9704e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .