这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» STC的51单片机程序如何实现不定长数据的接收?卡壳了,请大侠指点指点

共5条 1/1 1 跳转至

STC的51单片机程序如何实现不定长数据的接收?卡壳了,请大侠指点指点

工程师
2019-06-22 23:30:47 打赏

我想利用这个程序实现不定长数据的接收,先把接收的数据存入到队列中,然后从队列中取数据,再发送给上位机,我在用串口调试助手发送数据时,在接收缓冲区没有接收到数据,不知道程序那里的问题。

卡壳了,请大侠指点指点!不胜感激!


我的主要程序片段如下:


QUEUE que;

unsigned int pos =0;

/*void delayms(int z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} */


void Uart_IRQHendler() interrupt 4
{
uint ucTemp;
EA=0;

if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
RI = 0; //接收到一位数据后就让RI为零,关闭中断
ucTemp= SBUF; //保存接收到的数据
if((que._head+1)%QUEUE_MAX_SIZE!=que._tail)
{
que._data[que._head]=ucTemp;
que._head=(que._head+1)%QUEUE_MAX_SIZE;
}



}
EA =1;
}






int main(void)
{



uint recv_data[20]={0};
uint size =0;
uint i,j,temp;


P3M1&=0xFC;
P3M0|=0x03;//P3.0 P3.1
Uart1Init();

queue_reset();
//delayms(10);





while(1)
{



if(queue_size(que)>0)
{
for(i=0;i{
if(que._tail!=que._head)//非空
{
temp = que._data[que._tail];
que._tail= (que._tail+1)%QUEUE_MAX_SIZE;
}//此函数是从队列中取一个数据,而且从队尾开始取

if(pos
recv_data[pos++] = temp;//将队列中的数据均取出到这个数组中

else

pos =0;

if(temp==0x0A)
{
size = pos;
pos = 0;
}
else
size = 0;
// Uart2Data_SendByte(temp);
}

if(size>0)
{

for(j=0;j{
Uart1Data_SendByte(recv_data[j]);
}
size =0;

}
}

}

}




关键词: 串口接收 单片机程序

工程师
2019-06-22 23:44:47 打赏
2楼

参考一下 modbus 通信例程。


工程师
2019-06-22 23:58:45 打赏
3楼

EA要写在主函数里面,写在中断里面没用,因为进不去中断,只有在开启EA的情况下才能进中断。


工程师
2019-06-23 00:01:31 打赏
4楼

程序能否完整列出? 这样大家才好诊断啊~


菜鸟
2019-06-25 11:15:12 打赏
5楼

做超时接收判断。

比如,定个10ms没有收到数据,就表示一帧数据接收完毕。


串口中断赋值,定时器计时。


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]