首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

51串口通信中模块调整

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

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),再加到我的特定函数上去,就是错的。转换后,程序就出现异常,输出数据就错了,已经找了一个多礼拜了,还是没有找到问题,求大神指导。。。。 51串口通信中模块调整51串口通信中模块调整
被你说晕了
硬件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)函数中发生了中断破坏了时序造成发不出去

热点排行