目前正在做一个上下位机通讯的程序,上位机使用的是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;
}
看程序,貌似没啥问题
自己写个协议约定不可以不?
比如在你的数据加头,加长度(为命令+数据长度+校验),加命令,xxxxx(数据) 加校验
底下处理时,根据头来判断数据合法,按长度接受数据。。。。
兄弟,你说的这个是这样子的,我每次发的命令都是固定长度的,经常出现的情况是数据不能完整地收到,比如发个01 02 05 EE EF 39 57 42这样子的数据,可能能接到的是05 EE EF 39 57 42这个样子,我的程序后面要加错误处理的,但问题是这段程序出错的机率也不能太大,发个一两次就出一次问题,这个机率我实在不能忍受。
在电脑上用串口调试软件,设置的波特率格式为"9600,N,8,1",发送的时候就不时出现上面我给你介绍的那种情况,除非每次从上位机只发一个字符,比如"01",等上100ms左右的时间再发"02",这样的接收不会出错,但这样发实在太慢,也不能满足要求。我在VC的程序中试过的,将那个等待时间改为50ms下位机都会接收出错。
麻烦专家和各位高手帮我,谢谢了
我这个程序是删节之后用来测试的,wanyeye这位兄弟说的在你的数据加头,加长度,加命令,xxxxx(数据) 加校验
底下处理时,根据头来判断数据合法,按长度接受数据。。。。 ,这些事情我写的正式的程序里面都有,但关键是数据都接收不完整,还没有到处理那个问题的地步,wanyeye说的我已经记下了。
在实验中下位机能够接收数据,但经常接收数据不完整,或者是丢失数据
介个,如果板子上没有什么干扰的话
你看看你的时钟源,别用什么片内的RC什么的,一定要选片外的晶体
你再看看
CKCON =0x02;//系统时钟24576000 T1时钟=24576000/48=512000,48分频
TH1=0xF4;//波特率为9600
这两个的配置和计算
要是可能的话,尽量选数据手册里给的推荐值
可以把波特率改的更高或更低些,看出现的问题是不是跟你在9600时问题一样,首先要明确问题出现在哪里。
按照楼上兄弟所说的选数据手册的推荐值试试。
谢谢专家和楼上的这位兄弟,我的程序问题已经找到了,串口这一段程序没有出问题,问题出在中断优先级上,低优先级的串口中断被高优先级的定时器中断打断了,而我的中断优先级没有设置,导致程序出了问题。