我的目的是想实现双串口通信,即从一个口采集数据,数据经过内部处理后,然后从另外一个串口传给另外一个设备
首先 我的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),再加到我的特定函数上去,就是错的。转换后,程序就出现异常,输出数据就错了,已经找了一个多礼拜了,还是没有找到问题,求大神指导。。。。
------解决方案--------------------
被你说晕了
硬件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)函数中发生了中断破坏了时序造成发不出去