打印

[STC单片机] 串口通讯

[仿制链接]
443|10
跳转到指定楼层
楼主

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-6-20 17:57 | 只看该作者
首要检查有没发生串口中止

谈论

花儿相同ha 2019-6-21 08:50 回复TA
您好,我刚初学单片机,想讨教一下,怎样知道是否进入中止,昨日研讨了一天 
板凳
| 2019-6-21 08:27 | 只看该作者
不定长数据接纳的要害,是两个数据帧距离的判别。没看到代码呀。
地板
 楼主 | 2019-6-21 08:48 | 只看该作者
cainiao518 宣布于 2019-6-20 17:57
首要检查有没发生串口中止

您好,我刚初学单片机,想讨教一下,怎样知道是否进入中止,昨日研讨了一天
5
| 2019-6-21 08:59 | 只看该作者
花儿相同ha 宣布于 2019-6-21 08:48
您好,我刚初学单片机,想讨教一下,怎样知道是否进入中止,昨日研讨了一天 ...

找个指示灯,进串口中止就亮,出中止就灭
6
 楼主 | 2019-6-21 09:21 | 只看该作者
cainiao518 宣布于 2019-6-21 08:59
找个指示灯,进串口中止就亮,出中止就灭

好的,谢谢您。我这就试一下
7
 楼主 | 2019-6-21 10:04 | 只看该作者
cainiao518 宣布于 2019-6-21 08:59
找个指示灯,进串口中止就亮,出中止就灭

您好,我刚试了一下你说的加一个小灯,我是在中止函数里的if(RI==1)句子后边加了一句LED=1;不知道能够吗,便是进入中止LED小灯点亮,可是测验了一下,我用串口发送数据,小灯不亮,不知道怎样办了,还想再费事您一下。
8
| 2019-6-21 10:04 | 只看该作者
参阅一下 modbus 通讯例程。
9
| 2019-6-21 10:08 | 只看该作者
花儿相同ha 宣布于 2019-6-21 10:04
您好,我刚试了一下你说的加一个小灯,我是在中止函数里的if(RI==1)句子后边加了一句LED=1;不知道能够 ...

参阅一下例程,串口初始化要正确
10
| 2019-6-21 10:22 | 只看该作者
叶春勇 宣布于 2019-6-21 08:27
不定长数据接纳的要害,是两个数据帧距离的判别。没看到代码呀。

这人应该没理解其间的要害,在处于懵懵懂懂状况,因而,不会理解定长收发、不定长收发的要害之处。
扫描二维码,随时随地手机跟帖
您需求登录后才能够回帖 登录 | 注册

本版积分规矩

我要发帖 投诉主张 创立版块 请求版主

快速回复

您需求登录后才能够回帖
登录 | 注册
高档形式

论坛热帖

封闭

抢手引荐上一条 /6 下一条

在线客服 快速回复 回来顶部 回来列表