|
用LGT8F08A进行串口通讯时,相关代码段如下:
//初始化部分
#define USART_BAUD_SELECT 23 //19200
void interface_init(void)
{
UCSR0B = (1<<RXEN0) | (1<<TXEN0);
UCSR0C = (3<<UCSZ00);
UBRR0L = (unsigned char) USART_BAUD_SELECT;
UBRR0H = 0;
}
//数据收发部分:
//通讯层--串口命令解板
uchar ReadCOMByte(void)
{
// while(RI == 0);
// RI =0;
// return(SBUF);
while(1)
{
if (UCSR0A & (1<<RXC0))
{
return UDR0;
}
}
}
void WriteCOM_Byte(uchar ucWriteData)
{
// while(TI ==0);
// TI =0;
// SBUF = ucWriteData;
while (!(UCSR0A & (1<<UDRE0)));
UDR0 = ucWriteData;
}
//应用层相关部分如下:
//从串口取一字符且回显示,小写变大写
uchar Com_Echo(void)
{
uchar ucTemp;
ucTemp = ReadCOMByte();
WriteCOM_Byte(ucTemp);
return(toupper(ucTemp));
}
//通讯模块出错部分相关代码如下:
while(1)
{
ucTemp = Com_Echo();
if(ucTemp == 'U')
{
// WriteCOM_Byte('U');
}
if(ucTemp == ':')
{
break;
}
}
//代码完成的功能就是查找数据包的同步头,如果是U时,返回数据U,如果字符是‘:’时,跳出同步包头的状态,进入数据接收。
现在的问题是,用串口调试助手SSCOM32发送数据测试时正常,但用PC软件一通讯,单片机就出错,用串口监视软件查看,没有看到单片机返回数据,此时,再关闭PC软件,启动SSCOM32后,发送数据给单片机,也没有返回,芯片的串口模块硬件好象是挂掉了,此时停止仿真器,程序指针指向的是查询接收标志位这一行: if (UCSR0A & (1<<RXC0)) ,但就是收不到电脑发送过来的数据,已仔细检查过硬件,未见异常,将代码移植到Atmega16芯片上测试,没有出现这种奇怪的现象,且PC软件发送的同步包头能正常接收和响应,完成同步包头的操作。
想不出好办法,也找不到原因,请大家提提建议,先谢谢大家! |
|