c8051串口通讯连上仿真器可以通讯,断开就不行

xom554   2007-8-15 19:35 楼主
c8051串口通讯连上仿真器可以通讯,断开就不行了,这是为什么?

回复评论 (5)

可能是串口输出电压不够,需要加“上拉”或“下拉”之类的
检查一下串口引脚的输出信号电压,看是否达到要求
点赞  2007-8-15 19:56
硬件上应该没有问题,因为已经有人用汇编实现了通讯,只是我用c语言做的,不知道是不是在通讯的时候要打开或是关闭一些什么标志位么?
点赞  2007-8-21 13:22
把程序 发上来看看
点赞  2007-8-29 10:58
/* 发送数据帧函数 */
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;       
}                       
点赞  2007-9-7 19:35
//主函数
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;
                        }
                           ......
                  }
点赞  2007-9-7 19:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复