STM32L010のソフトウェアシリアルで文字を受信する STM32 RX 9600bps
x Mbedのリビジョンは、125
目的
表示器等用のソフトウェアシリアルを作ってみた。
忙しい人よう
https://os.mbed.com/users/caa45040/code/serial_rx_test_010/
#include "mbed.h"
//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)
//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010
#define UART_DELAY 96 // 1/9600
DigitalOut TX(PA_2);
DigitalIn RX(PA_3);
//DigitalOut TX(PA_9);
//DigitalIn RX(PA_10);
char ch_hex_a_b[5];
char *ch_hex_a(int l_num)
{
int a,b,c;
int q=0;
if(l_num < 0) { l_num = 0 - l_num; q = 1;}
b=DVI10(l_num);
c=l_num-(b*10);
l_num=b;
a=DVI10(l_num);
b=l_num-(a*10);
ch_hex_a_b[0] = '0' + a;
ch_hex_a_b[1] = '0' + b;
ch_hex_a_b[2] = '0' + c;
ch_hex_a_b[3] = 0;
if( q == 1 ) {ch_hex_a_b[0]='-';}
return(ch_hex_a_b);
} //ch_hex_a
//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch) {
TX=1;
TX=0;//START
wait_us(UART_DELAY);
for(int ii=0;ii<8;ii++){
TX=(ch>>ii)&1;
wait_us(UART_DELAY);
}; //for
TX=1;//Stop
wait_us(UART_DELAY);
return(0);
} //pc_putc
//文字列の表示
int pc_printf(char *str1) {
int ii = 0; //ループカウンター
while(str1[ii]!=0){
//一文字出力
pc_putc(str1[ii]);ii++;
} //while
//戻り値
return(0);
}
//タイマーの定義
Timer t;
int a,b,c,d,e,f,g,h;
int bs;
int zt,at,bt,ct,dt,et,ft,gt,ht,it;
char *ret1="\r\n";
int pc_getc()
{
//待ちループ
while( RX == 1 ) {}
//llllllllllllllllllllllllllllllllllllllll
zt = t.read_us();
wait_us(156-7-12);
a=RX;
at = t.read_us();
wait_us(104-7-11);
b=RX;
bt = t.read_us();
wait_us(104-7-11);
c=RX;
ct = t.read_us();
wait_us(104-7-11);
d=RX;
dt = t.read_us();
wait_us(104-7-10);
//hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
e=RX;
et = t.read_us();
wait_us(104-7-11);
f=RX;
ft = t.read_us();
wait_us(104-7-12);
g=RX;
gt = t.read_us();
wait_us(104-7-11);
h=RX;
ht = t.read_us();
wait_us(156-7-11);
it = t.read_us();
//pc_printf(ret1);
//pc_printf("0 zt=");
//pc_printf( ch_hex_a(zt) );
//pc_printf(ret1);
//pc_printf("156 at=");
//pc_printf( ch_hex_a( 156 - (at-zt) ) );
//pc_printf(ret1);
//pc_printf("260 bt=");
//pc_printf( ch_hex_a( 260 - (bt-zt) ) );
//pc_printf(ret1);
//pc_printf("364 ct=");
//pc_printf( ch_hex_a( 364 - (ct-zt) ) );
//pc_printf(ret1);
//pc_printf("468 dt=");
//pc_printf( ch_hex_a( 468 - (dt-zt) ) );
//pc_printf(ret1);
//pc_printf("572 et=");
//pc_printf( ch_hex_a( 572 - (et-zt) ) );
//pc_printf(ret1);
//pc_printf("677 ft=");
//pc_printf( ch_hex_a( 677 - (ft-zt) ) );
//pc_printf(ret1);
//pc_printf("781 gt=");
//pc_printf( ch_hex_a( 781 - (gt-zt) ) );
//pc_printf(ret1);
//pc_printf("885 ht=");
//pc_printf( ch_hex_a( 885 - (ht-zt) ) );
//pc_printf(ret1);
//pc_printf("1041 it=");
//pc_printf( ch_hex_a( 1041 - (it-zt) ) );
//pc_printf(ret1);
//h=0; g=1; f=0; e=0; d=0; c=0; b=0; a=1;
bs=h*128+g*64+f*32+e*16+d*8+c*4+b*2+a;
//char str2[2]={ bs ,0};
//pc_printf(" ch=[");
//pc_printf( str2 );
//pc_printf(ret1);
return(bs);
}//pc_getc
int main()
{
RX.mode( PullUp ); // 内蔵プルアップを使う
//タイマーの開始
t.start();
//pc.printf("Hello World!\r\n");
//t.stop();
char ch;
while(1) {
t.reset();
ch = pc_getc();
char str2[2]={ ch ,0};
pc_printf("-----ch=[");
pc_printf( str2 );
pc_printf(ret1);
wait(1.0);
}//while
}//main
//容量削減
void error(const char* format, ...){}
Author And Source
この問題について(STM32L010のソフトウェアシリアルで文字を受信する STM32 RX 9600bps), 我々は、より多くの情報をここで見つけました https://qiita.com/caa45040/items/91bc4665095d65eb971b著者帰属:元の著者の情報は、元の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 .