欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

51串口通信中模块调整

更新时间: 2014-01-05 03:14:13 责任编辑: Author_N1

 

51串口通信中模块整合
我的目的是想实现双串口通信,即从一个口采集数据,数据经过内部处理后,然后从另外一个串口传给另外一个设备

首先  我的51是89c52,只有一个串口,我得模拟一个串口出来,这个模拟串口我只需要发送就行了。这个我已经解决了
void WByte(uchar input)  
{  
     //发送启始位  
     uchar i=8;  
     TR0=1;  
     TXD=(bit)0;  
     WaitTF0();  
  
     //发送8位数据位  
     while(i--)  
     {  
         TXD=(bit)(input&0x01);   //先传低位  
         WaitTF0();  
         input=input>>1;  
     }  
  
     //发送校验位(无)  
  
     //发送结束位  
     TXD=(bit)1;  
     WaitTF0();  
     TR0=0;  
}  

第二步,我采集的数据需要进行特殊格式转换,因为我的下位机是华为的模块,他只能识别的格式必须是AT%IPSEND="这里面是内容 必须是字符串中每个字符对应的16进制ascii"
程序是版主帮我写的,我用VC6.0运行也是正常的
char * hextodstr(char * src)
{
unsigned char i=0;
while(*src!=0)
{
   buf1[2*i]=*src/16+'0';
   buf1[2*i+1]=(*src%16)+'0';
   src++;
   i++;
   if(i>=64)
   {
//缓冲区不够
buf1[128]=0;
   return buf1;
   }
}
buf1[i*2]=0;
return buf1;
}
这个是字符串转对应的ascii
所以我定义的时候就是把双引号分开定义,定义buf2【】=“AT%IPSED=\"”,然后把strcat(buf2,buf1),再然后 strcat(buf2,“\"”)。
第三步,我把51串口程序
while (1)                       
    {
        if(Flag == 1) 
        {
            Flag = 0;
            SendByte(UartChar);
            if(UartChar == '\r')
            {
                SendByte('\n');
            }
        }
    }
缓存过来的数据用 buf3【0】=UartChar,buf3=hextodstr(buf3),再加到我的特定函数上去,就是错的。转换后,程序就出现异常,输出数据就错了,已经找了一个多礼拜了,还是没有找到问题,求大神指导。。。。
--参考方法--
引用:
Quote: 引用:

不能仿真么?
能的话看下
buf3=hextodstr(buf2);
SendStr(buf3);//我想看buf3现在是什么值
buf3应该只能得到一个字符,C51里没法返回整个字符串

版主,我上面说的不知道对不对?


被你说晕了
硬件uart虽然只有一个SBUF但是是采用移位方式处理的,所以边收边发是没问题的,给一个UART
常用的串口命令是这样处理的,实时性不高的情况

volatile uchar needtx=false;
oid main(void)
{
while(1)
{
if(needtx==true)
{
tx();
needtx=false;
}
}
}



//串口接收中断
uint8_t rxbuf[8];
void uart_rx(void) interrupt 4
{
uint8_t i;
if(RI==0)return;
for(i=0;i<sizeof(rxbuf)-1;i++)
{
rxbuf[i]=rxbuf[i+1];
}
rxbuf[sizeof(rxbuf)-1]=SBUF;
RI=0;
//检查命令,"CMD"
if(rxbuf[0]=='C' && rxbuf[1]=='M' && && rxbuf[2]=='D'  )
{
needtx=true;
rxbuf[0]=rxbuf[1]=rxbuf[2]=rxbuf[3]=0;
}
}

--参考方法--
估计是在你的WByte(uchar input)函数中发生了中断破坏了时序造成发不出去
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:14:13
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/19876/
本文WWW.DOC100.NET DOC100.NET版权所有。