4490|11

75

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

串口通信只能输出3个字符 [复制链接]

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

最新回复

do {     if( 1 == RCIF )     {         break;     } } while ( 1 ); c = RCREG; do {     if( 1 == TXIF )     {         break;     } }                                        //////////这已经是和楼主一样的写法了,这代码以前是调通的。   详情 回复 发表于 2008-3-12 18:03
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
什么上编写的?波特率是否匹配?
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
自己动手调调程序吧
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
能收到,就跟波特率和串口无关了,
好好查你的程序吧。。。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
串口具有累加效应,如果是异步的,必须保证在传输一串字符之时的波特率差异+/-5%。

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

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

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
波特率应该没错的,是不是OERR和FERR的问题,但是我CREN=0,CREN=1后还是只能输出3个字符,一旦超过就出现乱码。。。。

单个字符重复发送是正常的。。。
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

7
 
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;
                            }

        }

}


这是主函数,大家帮忙看看啊,谢谢了
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

8
 
串口具有累加效应,如果是异步的,必须保证在传输一串字符之时的波特率差异+/-5%。

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

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

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

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

所以波特率误差只存在于字节内部,跟楼主的问题无关,
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
不用看时序了,如果两个字节之间的间隔短到串口硬件第一次检测停止位就为低,就没有同步的机会了。

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

还是解决一下楼主的问题吧。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
第一次检测起始位就为低
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

11
 
楼主,还是看看serial_setup是怎么写的吧。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

12
 
do
{
    if( 1 == RCIF )
    {
        break;
    }
} while ( 1 );

c = RCREG;

do
{
    if( 1 == TXIF )
    {
        break;
    }
}                                       
//////////这已经是和楼主一样的写法了,这代码以前是调通的。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表