C8051F340串口通讯的问题

jie3303   2009-3-13 17:14 楼主
目前正在做一个上下位机通讯的程序,上位机使用的是VC6,下位机采用C8051F340。下位机串口采用中断接收,串口波特率9600,采用串口调试工具做过检测,也用上位机的程序做过测试,在实验中下位机能够接收数据,但经常接收数据不完整,或者是丢失数据,晶振采用11.0592Mhz,下位机通信的部分程序贴出来如下,希望各位相助,头都大了。
void UART0_Init(void)
{
        SCON0|=0x10;                                                            
        CKCON =0x02;//系统时钟24576000  T1时钟=24576000/48=512000,48分频
        TH1=0xF4;//波特率为9600
        TL1=0xF4;                        
        TMOD=0x20;                     
        TR1=1;                 
}

void interrupt_UART0(void) interrupt 4
{
        EA=0;
        if(RI0)
        {
                RI0=0;
                Con=1;
                m_Buf[RecNum++]=SBUF0;
                if(RecNum==8)
                {
                    RecNum=0;
                }
        }
        EA=1;
}

回复评论 (8)

看程序,貌似没啥问题

自己写个协议约定不可以不?

比如在你的数据加头,加长度(为命令+数据长度+校验),加命令,xxxxx(数据) 加校验

底下处理时,根据头来判断数据合法,按长度接受数据。。。。

点赞  2009-3-13 18:04
兄弟,你说的这个是这样子的,我每次发的命令都是固定长度的,经常出现的情况是数据不能完整地收到,比如发个01 02 05 EE EF 39 57 42这样子的数据,可能能接到的是05 EE EF 39 57 42这个样子,我的程序后面要加错误处理的,但问题是这段程序出错的机率也不能太大,发个一两次就出一次问题,这个机率我实在不能忍受。
在电脑上用串口调试软件,设置的波特率格式为"9600,N,8,1",发送的时候就不时出现上面我给你介绍的那种情况,除非每次从上位机只发一个字符,比如"01",等上100ms左右的时间再发"02",这样的接收不会出错,但这样发实在太慢,也不能满足要求。我在VC的程序中试过的,将那个等待时间改为50ms下位机都会接收出错。
麻烦专家和各位高手帮我,谢谢了
点赞  2009-3-13 19:25
我这个程序是删节之后用来测试的,wanyeye这位兄弟说的在你的数据加头,加长度,加命令,xxxxx(数据) 加校验

底下处理时,根据头来判断数据合法,按长度接受数据。。。。 ,这些事情我写的正式的程序里面都有,但关键是数据都接收不完整,还没有到处理那个问题的地步,wanyeye说的我已经记下了。
点赞  2009-3-13 19:30
在实验中下位机能够接收数据,但经常接收数据不完整,或者是丢失数据

介个,如果板子上没有什么干扰的话

你看看你的时钟源,别用什么片内的RC什么的,一定要选片外的晶体

你再看看

CKCON =0x02;//系统时钟24576000  T1时钟=24576000/48=512000,48分频
TH1=0xF4;//波特率为9600

这两个的配置和计算

要是可能的话,尽量选数据手册里给的推荐值
点赞  2009-3-16 11:04
可以把波特率改的更高或更低些,看出现的问题是不是跟你在9600时问题一样,首先要明确问题出现在哪里。
按照楼上兄弟所说的选数据手册的推荐值试试。
点赞  2009-3-16 14:28
谢谢专家和楼上的这位兄弟,我的程序问题已经找到了,串口这一段程序没有出问题,问题出在中断优先级上,低优先级的串口中断被高优先级的定时器中断打断了,而我的中断优先级没有设置,导致程序出了问题。
点赞  2009-3-16 15:43
我也学人留个记号。
点赞  2009-3-16 15:56
我正学习呢,大家一起讨论太好了
点赞  2010-4-23 23:57
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复