本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!
> 发布人:@日月同辉,与我共生_单片机-CSDN博客
> 欢迎你为独创博主日月同辉,与我共生点赞❤❤❤+关注👍+收藏🌹+评论☺。
系列专栏: CSDN-单片机串口通信学习系列🎁
> 我的格言是:“尽最大努力,做最好的自己!💪
要转载,请提前告知!!!
版权声明:本文为CSDN博主「日月同辉,与我共生」的原创文章,CSDN独一份。
单片机com1发送字符串Wait for Serial Communication Tset Start.和Please Send a string of data:给虚拟串口com3,接着虚拟串口发送多个数据(数据长度不定,但限制在20以下)给单片机com1,com1接收后重新将数据发送回com3。
- void UartInit(void) //9600bps@11.0592MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位数据,可变波特率
- TMOD &= 0x0F; //设置定时器模式
- TMOD |= 0x20; //设置定时器模式
- TL1 = 0xFD; //设置定时初始值
- TH1 = 0xFD; //设置定时重载值
- ET1 = 0; //禁止定时器中断
- ES=1; //串口中断打开
- TR1 = 1; //定时器1开始计时
- }
- void ES_timers() interrupt 4 //接收中断
- {
- if(RI)
- {
- RI=0;
- start_timer=1;//1.开定时器标志位置1
- if(recv_cnt
//在规定字符长度范围内接收数据 - {
- recv_buf[recv_cnt]=SBUF; //2.接收数据
- recv_cnt++;
- }
- else
- {
- recv_cnt=MAX_REX_NUM;
- }
- recv_timer_cnt=0; //3.每接收一帧数据就计数清0
- }
- }
-
- void Timer0_Init(void) //1毫秒@11.0592MHz
- {
- TMOD &= 0xF0; //设置定时器模式
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x66; //设置定时初始值
- TH0 = 0xFC; //设置定时初始值
- TF0 = 0; //清除TF0标志
- ET0=1;
- TR0 = 1; //定时器0开始计时
- }
-
- void T0_timer() interrupt 1
- {
- TR0=0;
- if(start_timer == 1)
- {
- recv_timer_cnt++;
- if(recv_timer_cnt>MAX_timer_cnt) //计数值超过规定范围说明接收完成
- {
- recv_timer_cnt=0;
- recv_cnt=0;
- recv_flag=1;//接收完成标志位置1
- }
- }
- TL0 = 0x66; //设置定时初始值
- TH0 = 0xFC; //设置定时初始值
- TR0=1;
- }
-
- void main()
- {
- UartInit(); //调用串口初始化函数
- Timer0_Init();
- EA=1; //总中断允许
- printf("Wait for Serial Communication Tset Start.\r\n");
- printf("Please Send a string of data:\r\n");
- while(1)
- {
- if(recv_flag)
- {
- start_timer=0;
- recv_flag=0;//接收完成标志位清0
- sendString(recv_buf);//发送数据
- clr_recvbuffer(recv_buf);//清除缓冲函数
- }
- }
- }
-
- void sendByte(unsigned char dat) //发送一帧数据功能函数
- {
- SBUF=dat;
- while(!TI);
- TI=0;
- }
-
- void sendString(unsigned char *dat)//发送字符串函数
- {
- while(*dat != '\0')
- {
- sendByte(*dat++);
- }
- }
-
- char putchar(char c)
- {
- sendByte(c);
- return c;
- }
-
- void clr_recvbuffer(unsigned char *buf)
- {
- unsigned char i;
- for(i=0;i
- {
- buf[i]=0;
- }
- }
2.8urat.c
- #ifndef __UART_H__
- #define __UART_H__
-
- #include
- #include
-
- #define MAX_REX_NUM 20 //规定最大长度
- #define MAX_timer_cnt 5 //定时计数规定值,超过该值,说明接收完成
-
- extern unsigned char recv_buf[MAX_REX_NUM];//将数据存储到该数组中
- extern unsigned char recv_cnt;
- extern unsigned char start_timer;//软件定时器变量,=1说明定时器开始工作
- extern unsigned char recv_timer_cnt;//软件定时器计数变量
- extern unsigned char recv_flag;//接收完成标志位
-
- void UartInit(void);
- void sendByte(unsigned char dat);
- void sendString(unsigned char *dat);
- char putchar(char c);
- void clr_recvbuffer(unsigned char *buf);
-
- #endif
亲爱的读者敬请期待,下一文更精彩!!!
一日不读书,胸臆无佳想。我叫不白吃,喜欢我的,可以支持我,博主名叫@日月同辉,与我共生