打印
[STC单片机]

串口通信

[复制链接]
1236|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
花儿一样ha|  楼主 | 2019-6-20 16:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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;

             }
         }

}


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

使用特权

评论回复

相关帖子

沙发
cainiao518| | 2019-6-20 17:57 | 只看该作者
首先检查有没产生串口中断

使用特权

评论回复
评论
花儿一样ha 2019-6-21 08:50 回复TA
您好,我刚初学单片机,想请教一下,如何知道是否进入中断,昨天研究了一天 
板凳
叶春勇| | 2019-6-21 08:27 | 只看该作者
不定长数据接收的关键,是两个数据帧间隔的判断。没看到代码呀。

使用特权

评论回复
地板
花儿一样ha|  楼主 | 2019-6-21 08:48 | 只看该作者
cainiao518 发表于 2019-6-20 17:57
首先检查有没产生串口中断

您好,我刚初学单片机,想请教一下,如何知道是否进入中断,昨天研究了一天

使用特权

评论回复
5
cainiao518| | 2019-6-21 08:59 | 只看该作者
花儿一样ha 发表于 2019-6-21 08:48
您好,我刚初学单片机,想请教一下,如何知道是否进入中断,昨天研究了一天 ...

找个指示灯,进串口中断就亮,出中断就灭

使用特权

评论回复
6
花儿一样ha|  楼主 | 2019-6-21 09:21 | 只看该作者
cainiao518 发表于 2019-6-21 08:59
找个指示灯,进串口中断就亮,出中断就灭

好的,谢谢您。我这就试一下

使用特权

评论回复
7
花儿一样ha|  楼主 | 2019-6-21 10:04 | 只看该作者
cainiao518 发表于 2019-6-21 08:59
找个指示灯,进串口中断就亮,出中断就灭

您好,我刚试了一下你说的加一个小灯,我是在中断函数里的if(RI==1)语句后面加了一句LED=1;不知道可以吗,就是进入中断LED小灯点亮,但是测试了一下,我用串口发送数据,小灯不亮,不知道怎么办了,还想再麻烦您一下。

使用特权

评论回复
8
xuyaqi| | 2019-6-21 10:04 | 只看该作者
参考一下 modbus 通信例程。

使用特权

评论回复
9
cainiao518| | 2019-6-21 10:08 | 只看该作者
花儿一样ha 发表于 2019-6-21 10:04
您好,我刚试了一下你说的加一个小灯,我是在中断函数里的if(RI==1)语句后面加了一句LED=1;不知道可以 ...

参考一下例程,串口初始化要正确

使用特权

评论回复
10
tianxj01| | 2019-6-21 10:22 | 只看该作者
叶春勇 发表于 2019-6-21 08:27
不定长数据接收的关键,是两个数据帧间隔的判断。没看到代码呀。

这人应该没明白其中的关键,在处于懵懵懂懂状态,因此,不会明白定长收发、不定长收发的关键之处。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

31

帖子

0

粉丝