串口通信只能输出3个字符

sunnyzeng1   2008-3-12 12:02 楼主
我编写了一个串口程序,能接收和输出,但是当接收超过4个字符时,就出现显示乱码,不知道是什么设置问题还是程序编写问题,谁能帮忙解决下,谢谢

回复评论 (11)

什么上编写的?波特率是否匹配?
点赞  2008-3-12 12:25
自己动手调调程序吧
点赞  2008-3-12 13:14
能收到,就跟波特率和串口无关了,
好好查你的程序吧。。。
点赞  2008-3-12 13:17
串口具有累加效应,如果是异步的,必须保证在传输一串字符之时的波特率差异+/-5%。

如果一个字符,他自己独占5%,甚至10%的差异都可以,如果是100个字符接连传输,就需要严格一点了。

楼主还是多给点信息,别人方有可能帮你参谋。
点赞  2008-3-12 13:23
波特率应该没错的,是不是OERR和FERR的问题,但是我CREN=0,CREN=1后还是只能输出3个字符,一旦超过就出现乱码。。。。

单个字符重复发送是正常的。。。
点赞  2008-3-12 14:54
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;
                            }

        }

}


这是主函数,大家帮忙看看啊,谢谢了
点赞  2008-3-12 14:56
串口具有累加效应,如果是异步的,必须保证在传输一串字符之时的波特率差异+/-5%。

如果一个字符,他自己独占5%,甚至10%的差异都可以,如果是100个字符接连传输,就需要严格一点了。

楼主还是多给点信息,别人方有可能帮你参谋。

------------------------------------------------
不是这样的,自己再去认真看下串口的时序吧,
有起始位和停止位的,

低电平起始位、高电平停止位、还可以有校验位或第九位、停止位长短可设置,
数据位数也可以设置,波特率16分频,对中间的三个点进行判断,得到数据位取值,

所以波特率误差只存在于字节内部,跟楼主的问题无关,
点赞  2008-3-12 15:49
不用看时序了,如果两个字节之间的间隔短到串口硬件第一次检测停止位就为低,就没有同步的机会了。

举个实际例子来说,手机与sim卡通讯的通讯基本速度为手机的时钟的1/372,如果一个手机给sim的时钟是2.4兆,那么可以在windows上用6400的波特率来正确接收,由于不知道具体的手机时钟,所以一个笨方法就是用PC的可用波特率挨个试验,可以看到,当使用6063和6776的时候,能收对两个个连续的字符,第三个就不对了,而波特率相差更多的从第一个就不对了。

还是解决一下楼主的问题吧。
点赞  2008-3-12 17:42
第一次检测起始位就为低
点赞  2008-3-12 17:44
楼主,还是看看serial_setup是怎么写的吧。
点赞  2008-3-12 17:48
do
{
    if( 1 == RCIF )
    {
        break;
    }
} while ( 1 );

c = RCREG;

do
{
    if( 1 == TXIF )
    {
        break;
    }
}                                       
//////////这已经是和楼主一样的写法了,这代码以前是调通的。
点赞  2008-3-12 18:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复