我编写了一个串口程序,能接收和输出,但是当接收超过4个字符时,就出现显示乱码,不知道是什么设置问题还是程序编写问题,谁能帮忙解决下,谢谢
能收到,就跟波特率和串口无关了,
好好查你的程序吧。。。
串口具有累加效应,如果是异步的,必须保证在传输一串字符之时的波特率差异+/-5%。
如果一个字符,他自己独占5%,甚至10%的差异都可以,如果是100个字符接连传输,就需要严格一点了。
楼主还是多给点信息,别人方有可能帮你参谋。
波特率应该没错的,是不是OERR和FERR的问题,但是我CREN=0,CREN=1后还是只能输出3个字符,一旦超过就出现乱码。。。。
单个字符重复发送是正常的。。。
void main(void)
{
unsigned char c;
serial_setup();
while(1)
{
while(1)
{
if(RCIF) break;
}
c=getch();
if(OERR||FERR)
{
CREN=0;
CREN=1;
}
switch(c)
{
case 0xFF: Display_CompanyInfo(); break;
case 0xFE: Display_CompanyInfo_CH();break;
case 0xFD: Display_ProductInfo();break;
case 0xFC: Alam_On();break;
case 0xFB: Alam_Off();break;
case 0xFA: LED_On();break;
case 0xF9: LED_Off();break;
default: break;
}
while(1)
{
if(TXIF) break;
}
}
}
这是主函数,大家帮忙看看啊,谢谢了
串口具有累加效应,如果是异步的,必须保证在传输一串字符之时的波特率差异+/-5%。
如果一个字符,他自己独占5%,甚至10%的差异都可以,如果是100个字符接连传输,就需要严格一点了。
楼主还是多给点信息,别人方有可能帮你参谋。
------------------------------------------------
不是这样的,自己再去认真看下串口的时序吧,
有起始位和停止位的,
低电平起始位、高电平停止位、还可以有校验位或第九位、停止位长短可设置,
数据位数也可以设置,波特率16分频,对中间的三个点进行判断,得到数据位取值,
所以波特率误差只存在于字节内部,跟楼主的问题无关,
不用看时序了,如果两个字节之间的间隔短到串口硬件第一次检测停止位就为低,就没有同步的机会了。
举个实际例子来说,手机与sim卡通讯的通讯基本速度为手机的时钟的1/372,如果一个手机给sim的时钟是2.4兆,那么可以在windows上用6400的波特率来正确接收,由于不知道具体的手机时钟,所以一个笨方法就是用PC的可用波特率挨个试验,可以看到,当使用6063和6776的时候,能收对两个个连续的字符,第三个就不对了,而波特率相差更多的从第一个就不对了。
还是解决一下楼主的问题吧。
楼主,还是看看serial_setup是怎么写的吧。
do
{
if( 1 == RCIF )
{
break;
}
} while ( 1 );
c = RCREG;
do
{
if( 1 == TXIF )
{
break;
}
}
//////////这已经是和楼主一样的写法了,这代码以前是调通的。