完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 695704098 于 2015-9-2 17:23 编辑
想实现的功能呢就是:使用串口调试助手的文本格式发送字符1,单片机通过串口2接收后验证通过,发送一次数组Str1[5]内5个的字符数据,通过串口调试助手接收查看发送出来的数据。 目前的状态就是:每次复位后发送字符1,接收到一个大写打字母L,别的都没有了,而且每次复位后才能发送出来一个L,否则不管发多少次字符1,都不发出数据。 一下是本人改写的程序: /*************** 用户定义参数 *****************************/ #define MAIN_Fosc 22118400L //define main clock #define Baudrate1 9600 //define the baudrate, 如果使用BRT做波特率发生器,则波特率跟串口2一样 //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ #define Baudrate2 9600 //define the baudrate2, //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ #define BUF_LENTH 128 //定义串口接收缓冲长度 /**********************************************************/ #include sfr AUXR1 = 0xA2; sfr AUXR = 0x8E; sfr S2CON = 0x9A; //12C5A60S2双串口系列 sfr S2BUF = 0x9B; //12C5A60S2双串口系列 sfr IE2 = 0xAF; //STC12C5A60S2系列 sfr BRT = 0x9C; unsigned char uart2_wr; //写指针 unsigned char uart2_rd; //读指针 unsigned char xdata RX2_Buffer[BUF_LENTH]; bit B_ti2; /****************** 编译器自动生成,用户请勿修改 ************************************/ #define T1_TimerReload (256 - MAIN_Fosc / 192 / Baudrate1) //Calculate the timer1 reload value at 12T mode #define BRT_Reload (256 - MAIN_Fosc / 12 / 16 / Baudrate2) //Calculate BRT reload value #define TimeOut1 (28800 / (unsigned long)Baudrate1 + 2) #define TimeOut2 (28800 / (unsigned long)Baudrate2 + 2) #define TI2 (S2CON & 0x02) != 0 #define RI2 (S2CON & 0x01) != 0 #define CLR_TI2() S2CON &= ~0x02 #define CLR_RI2() S2CON &= ~0x01 /**********************************************************/ unsigned char addr; unsigned char Str1[5]={"LFA01"}; /******************** 本地函数声明 ***************/ void uart2_init(void); void UART2_TxByte(unsigned char dat); void PrintString2(unsigned char code *puts); /****************延时函数****************/ void Delay_Ms(unsigned int ms) { unsigned int i; while(ms--) for(i=0;i<550;i++); } /*********从机编号判断和数据发送********/ //如果串口1接收到主机发来的寻址从机编号,才将本从机的数据发送给主机,否则等待 //void Send_Data(void) //{ // int i; //// uchar b; //if(addr=='1') //不同的从机,这里必须修改 // { // for(i=0;i<5;i++) // { // UART2_TxByte(Str1); // Delay_Ms(10); // } // } // //} void main(void) { int i; uart2_rd = 0; uart2_wr = 0; AUXR1 |= (1<<4); //将UART2从P1口切换到 RXD2--P1.2切换到P4.2 TXD2---P1.3切换到P4.3 uart2_init(); while(1) { // if(addr=='1') // { // for(i=0;i<5;i++) // { // UART2_TxByte(str); // Delay_Ms(5); // } // } } } void UART2_TxByte(unsigned char dat) { B_TI2 = 0; S2BUF = dat; while(!B_TI2); B_TI2 = 0; } void PrintString2(unsigned char code *puts) //发送一串字符串 { for (; *puts != 0; puts++) UART2_TxByte(*puts); //遇到停止符0结束 } /**********************************************/ void uart2_init(void) { AUXR |= (1 << 3); //串口2波特率加倍 S2CON = (S2CON & 0x3f) | (1<<6); //串口2模式1,8位UART,(2^S2SMOD / 32) * BRT溢出率 S2CON |= 1 << 4; //允许串2接收 AUXR |= 1 << 4; //baudrate use BRT BRT = BRT_Reload; IE2 |= 1; //允许串口2中断 //本来在uart1_init(void)中有定义,只是用串口2时必须有以下两条才行 ES = 1; EA = 1; } /**********************************************/ void UART2_RCV (void) interrupt 8 { int a; int i; if(RI2) { CLR_RI2(); a=S2BUF; addr=a; } if(addr=='1') //不同的从机,这里必须修改 { for(i=0;i<5;i++) { UART2_TxByte(Str1); Delay_Ms(10); } } if(TI2) { CLR_TI2(); B_TI2 = 1; } } 把这以下语在主函数的while(1)中接触屏蔽,发送一次1后就一直能收到单片机发出的数据,没有任何问题,换一个字符发送给单片机后才停止,再发1,单片机仍然能持续发送数据,但是只要是放到串口中断或是写到子函数中,在中断中调用,就每次复位只能发送一次,且只发一个L if(addr=='1') { for(i=0;i<5;i++) { UART2_TxByte(str); Delay_Ms(5); } } |
|
相关推荐
4个回答
|
|
UART2_TxByte();这个函数不行吧,试试print那个函数
最佳答案
|
|
|
|
tainanle 啊 啊 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
|
|
|
|
因为放在中断里,发送了L之后,写标志位没有清零哦!
|
|
|
|
这句CLR_TI2();就是写标志位清零吧,我这样写 for(i=0;i<5;i++) { UART2_TxByte(str); CLR_TI2(); Delay_Ms(5); } 还是一样的效果,请问有什么好的办法能详细给我讲讲做么做吗? |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
7 浏览 0 评论
26 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
13 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
644 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1000 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11770 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 16:01 , Processed in 0.593028 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号