1月9日,在线听RF检波器如何简化系统设计,与ADI工程师一起学习吧!→ 报名参会 ←
电子产品世界 » 论坛首页 » 嵌入式开发 » 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<queue_size(que);i++)
              {
                 if(que._tail!=que._head)//非空
                 {
                     temp = que._data[que._tail];
                     que._tail= (que._tail+1)%QUEUE_MAX_SIZE;
                 }//此函数是从队列中取一个数据,而且从队尾开始取

                 if(pos<QUEUE_MAX_SIZE)

                     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<size;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 跳转至

回复

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