c8051串口通讯连上仿真器可以通讯,断开就不行了,这是为什么?
可能是串口输出电压不够,需要加“上拉”或“下拉”之类的
检查一下串口引脚的输出信号电压,看是否达到要求
硬件上应该没有问题,因为已经有人用汇编实现了通讯,只是我用c语言做的,不知道是不是在通讯的时候要打开或是关闭一些什么标志位么?
/* 发送数据帧函数 */
void Send_Data()
{
uchar i;
send_buf[0]=DevNo;
if(rec_buf[1]==0x03)//查询信息帧
{
send_buf[1]=0x03;
send_buf[2]=rec_buf[5]*2;//长度
for(i=0;i
{
send_buf[3+i]=x5045read((rec_buf[2]*256+rec_buf[3])+i);
}
getCrc(send_buf,send_buf[2]+5,1);//计算CRC
for(i=0;i
{
Send(send_buf);
}
}
else if(rec_buf[1]==0x06)//指令帧
{
send_buf[1]=0x06;
send_buf[2]=0x01;//长度
send_buf[3]=0x00;
getCrc(send_buf,6,1);//计算CRC
for(i=0;i<6;i++)//发送
{
Send(send_buf);
}
}
else if(rec_buf[1]==0x10)//参数设置帧
{
send_buf[1]=0x10;
send_buf[2]=0x01;//长度
send_buf[3]=0x00;
getCrc(send_buf,6,1);//计算CRC
for(i=0;i<6;i++)//发送
{
Send(send_buf);
}
}
else if((rec_buf[0]==0)&&(rec_buf[1]==0x43))//广播查询地址
{
send_buf[1]=0x43;
send_buf[2]=0x01;//长度
send_buf[3]=DevNo;
getCrc(send_buf,6,1);//计算CRC
for(i=0;i<6;i++)//发送
{
Send(send_buf);
}
}
else//帧错误
{
return;
}
}
/* 发送单字节数据 */
void Send(uchar m)
{
TI = 0;
SBUF = m;
while(!TI);
TI = 0;
}
//主函数
void main()
{
//uchar i;
//WDTCN=0x07;
WDTCN=0xde; // disable watchdog timer
WDTCN=0xad;
IP=0x20; //设定定时器2的优先级高于串行口
Clock_Init(); // initialize oscillator
Port_Init();
Timer_Init();
init_oled();
clear_lcd();
Init7219();
Clr7219();
Adc_Init();
Flag_Init();
ET2=1; //允许定时器2中断----------系统时钟
TR2=1; //定时器2运行
TR1=1; //定时器1运行
EA=1; //打开所有中断
ES=1; //打开串口中断
while (1)
{
if(rec_success_flag)
{
EA=0;
rec_success_flag=0;
Send_Data();
EA=1;
}
......
}