求助:STC系列双串口单片机 同时使用两个串口的问题
现在我想实现这样一个功能:用pc机给单片机的串口2发数据,单片机把数据通过串口1发送给GSM模块。单片机的型号是STC12c5a32s2,用的开发板是MC55单片机开发板。
开始计划的是先把两个串口之间的通信程序调好了,可是貌似两个串口不能同时工作啊,把pc机发给单片机串口2的数据再从串口1接收回来,在pc机上显示,一直实现不了。
两个串口分别工作的时候,写的程序都能用,可是当串口2工作时,把串口1接到电脑上,串口2就不能发送数据了,各位大侠谁能帮帮我啊,小女子感激不尽!
下面分别是串口1和串口2的测试程序,就是在pc机的串口调试助手中发数据,经过单片机的串口,再回传到pc机中。
UART1test
#include <cheshi.h>
void Sys_Init(void)//话机启动的初始化程序,包含键盘与定时器,串口等
{
TH0 = 0xB8;
TL0 = 0x00; //20ms的时钟基准
//串口中断
TI=0; RI=0;
SCON=0x50; //选用方式1
TMOD=0x20;
TMOD = (TMOD & 0xf0) | 1; //MODE 1
TH1=0xfd; //波特率为9600
TL1=0xfd;
PCON=0x00; //倍频0x80
IE = 0xb0; // EA XX ET2 ES ET0 EX0 ET1 EX1
TR1=1; //enable TIMER1
// serial_port_two_initial();
ES=1; //开串口开断
TR0=1; //串口接收中断
ET0=1; //T0 中断
ET1=0; // T1 中断
EA=1;
P0=0xFF;
P1=0xFF;
P2=0xFF;
P3=0xFF;
// P4=0xff;
IO_IGT=1;
//串口2
S2CON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位,允许接收
BRT=220;
AUXR=0x14;
IE2=0x01;//允许串口2中断,ES2=1
}
void Interrupt_Receive_2(void) interrupt 4
{
unsigned char temp ;
if(RI ==1)
{
RI=0;
temp = SBUF;
UART_sendbyte(temp);
}
if(TI==1)
{
TI =0;
}
}
void UART_sendbyte(unsigned char mydata)
{
ES=0;
TI=0;
SBUF=mydata;
while(!TI);/* 等待发送完毕 */
TI=0;
ES=1;
}
void main(void)
{
Sys_Init();
while(1)
{
}
}
UART2test
#include <cheshi.h>
void Sys_Init(void)//话机启动的初始化程序,包含键盘与定时器,串口等
{
TH0 = 0xB8;
TL0 = 0x00; //20ms的时钟基准
//串口中断
TI=0; RI=0;
SCON=0x50; //选用方式1
TMOD=0x20;
TMOD = (TMOD & 0xf0) | 1;//MODE 1
TH1=0xfd; //波特率为9600
TL1=0xfd;
PCON=0x00; //倍频0x80
IE = 0xb0; // EA XX ET2 ES ET0 EX0 ET1 EX1
TR1=1; //enable TIMER1
// serial_port_two_initial();
ES=1; //开串口开断
TR0=1; //串口接收中断
ET0=1; //T0 中断
ET1=0; // T1 中断
EA=1;
P0=0xFF;
P1=0xFF;
P2=0xFF;
P3=0xFF;
// P4=0xff;
IO_IGT=1;
//串口2
S2CON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位,允许接收
BRT=220;
AUXR1=0x04;
IE2=0x01;//允许串口2中断,ES2=1
IP2H = 0x01;
IP2 = 0x01;
}
void Interrupt_Receive_2(void) interrupt 8
{
unsigned char temp ;
unsigned char k = 0;
k = S2CON ;
k= k & 0x01; //k = S2RI
if(k==1)
{
S2CON = S2CON & 0xFE; //1111,1110
temp = S2BUF;
UART_sendbyte(temp);
}
else
{
TI=0;
}
}
void UART_sendbyte(unsigned char mydata)
{
unsigned char k = 0;
P1_0 = 0;
P1_1 = 0;
IE2=0x00;
k = S2CON;
k = k & 0x02; // k == S2TI
S2CON = S2CON & 0xFD; //S2TI == 0
S2BUF=mydata;
while(!k);/* 等待发送完毕 */
S2CON= S2CON&0xfd;
IE2=0x01;
}
void main(void)
{
Sys_Init();
while(1)
{
}
}
[解决办法]
没程序,也能收发 肯定是 rx和tx短接了