搜索
bottom↓
回复: 33

请教下,c8051 的串口发送是中断方式还是查询方式好 ...

[复制链接]

出0入0汤圆

发表于 2015-9-14 16:09:04 | 显示全部楼层 |阅读模式
请教下,c8051 的串口发送是采用查询方式还是中断方式好 ?? 发送数据量不是很大。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-9-14 16:14:56 | 显示全部楼层
中断方式节省CPU资源。

出10入61汤圆

发表于 2015-9-14 16:17:02 | 显示全部楼层
发送一般用查询就行,程序简单,接收因为不知道何时来所以一般用中断

出0入42汤圆

发表于 2015-9-14 16:17:50 | 显示全部楼层
除非是极简的程序,一般还是用中断方式来管理串口的收和发较好。

出0入10汤圆

发表于 2015-9-14 17:03:38 | 显示全部楼层
中断方式好

出0入0汤圆

发表于 2015-9-14 20:03:25 | 显示全部楼层
我都是采用中断方式~~~~~~~~~~~~

出0入0汤圆

 楼主| 发表于 2015-9-14 21:20:45 | 显示全部楼层
lisingch 发表于 2015-9-14 16:14
中断方式节省CPU资源。

貌似这个中断方式发送,要不停的中断,这样会不会也造成cpu的负担啦 ???

出0入0汤圆

发表于 2015-9-15 08:19:47 | 显示全部楼层
可不可以说:根据需求决定———参考2、3楼      

出0入0汤圆

发表于 2015-9-15 08:45:28 | 显示全部楼层
hpdell 发表于 2015-9-14 21:20
貌似这个中断方式发送,要不停的中断,这样会不会也造成cpu的负担啦 ??? ...


看你用什么波特率

115200的话中断间隔时间比较短,频繁进入中断,好像7、80us那样子,

9600的话1ms中断1次,效率明显不同

出0入0汤圆

发表于 2015-9-15 09:54:12 | 显示全部楼层
7、80us中断一次对现在的CPU算个啥呀,C8051的串口我最高做过3M波特率的,纯中断方式收发。

出0入0汤圆

发表于 2015-9-15 10:19:26 | 显示全部楼层
如果系统是半双工工作且没人机接口,那就可以考虑不用中断发送,反正也没事做

出0入0汤圆

发表于 2015-9-15 10:28:19 | 显示全部楼层
我也觉得应该是根据实际情况来看,如果需要实现的功能比较简单,查询和中断都可以,你选择你觉得简单的熟悉的~如果程序比较复杂,那采用中断的可能性就比较大,还要考虑优先级和中断的方式、周期之类的

出0入0汤圆

发表于 2015-9-15 11:46:45 | 显示全部楼层
轮循方式效率低,发送时要等待,当然如果只是用printf之类,或者不在呼等待,就用轮循方式,用法简单。

出0入4汤圆

发表于 2015-9-15 12:14:36 | 显示全部楼层
hpdell 发表于 2015-9-14 21:20
貌似这个中断方式发送,要不停的中断,这样会不会也造成cpu的负担啦 ??? ...

不会一直中断,发送完成后就退出中断,有需要发送时才开下中断。

接收是一直开中断,但是如果没有数据接收,就不会进中断,没有开销呀

出20入0汤圆

发表于 2015-9-15 12:27:13 | 显示全部楼层
  用中断比较好。

出0入0汤圆

发表于 2015-9-15 13:41:18 | 显示全部楼层
看你的系统设计原则吧,如果发送期间CPU就没有要做的事情,查询也可以,如果CPU很忙的话,还是用中断发送比较好些

出0入0汤圆

发表于 2015-9-15 14:54:27 来自手机 | 显示全部楼层
DMA做FIFO路过

出0入0汤圆

 楼主| 发表于 2015-9-15 15:17:59 | 显示全部楼层
本帖最后由 hpdell 于 2015-9-15 16:16 编辑


c8051 貌似没有dma把

出200入657汤圆

发表于 2015-9-15 15:19:14 | 显示全部楼层
中断方式是省cpu资源,可是复杂程度成指数增加
特别是数据本身有相当复杂的帧协议的情况下

出0入0汤圆

 楼主| 发表于 2015-9-15 15:26:06 | 显示全部楼层
本帖最后由 hpdell 于 2015-9-15 16:47 编辑
laujc 发表于 2015-9-15 12:14
不会一直中断,发送完成后就退出中断,有需要发送时才开下中断。

接收是一直开中断,但是如果没有数据接 ...


我现在的问题是 使用uart1,波特率是115200,

程序开启的接收中断,在初始化时,程序就会死机,但是在有需要的地方再开启中断
接收又没有问题,现在搞蒙了,你帮我看看是什么情况啊,程序配置如下,


#define TI1 ((SCON1 & 0x02) == 0x02)
#define RI1 ((SCON1 & 0x01) == 0x01)


#define GPRS_CLR_TX_INTERRUPT_FLAG   (SCON1 &= ~0X82)                //(SCON1 &= ~0X02)   //清gprs uart1发送中断标志
#define GPRS_CLR_RX_INTERRUPT_FLAG   (SCON1 &= ~0X81)   //清gprs uart1接收中断标志


// 设置 UART0 波特率 4800
void UART0_Init(void)
{
        TMOD      |= 0x20;                        // 定时器1 方式2,time1 8bit reload
        TH1       = 0x98;
        SCON0     = 0x10;
        ET1 = 1;                                                                // 允许由TF1 标志产生的中断请求
        TR1          = 1;                                                        // 使能定时器1才能产生波特率
        ES0       = 1;
}

// 设置 UART1 波特率 115200
void UART1_Init(void)
{
        SCON1     = 0x00;
        SBRLL1    = 0xCC;    // 115200
        SBRLH1    = 0xFF;
        SCON1     = 0x10;                //使能接收           (1)
        SBCON1    = 0x43;

//        EIE2      = 0x02;                // 允许 UART1 中断        ( 2)
        EIP2      = 0x02;                // UART1 断为高优先级               

}

// Called from the Init_Device() function
void UART_Init(void)
{
        UART0_Init();

        UART1_Init();
       
}


//-----------------------------------------------------------------------------
void  UATRT1_ISR (void) interrupt    16                        //INTERRUPT_UART1
{
        if(RI1)//是否接收中断
        {
                if(SysParameter.InfoData.gprs.WaitGPRSPacket)
                {
                        SysParameter.InfoData.gprs.RxBuffer[SysParameter.InfoData.gprs.RxCounter++] = SBUF1;                        //保存数据
                       

                        if(SysParameter.InfoData.gprs.RxCounter == SysParameter.InfoData.gprs.NbrOfDataToRead )
                        {
                                SysParameter.InfoData.gprs.WaitGPRSPacket        =        0        ;
//                                SCON1 &= ~0X10;                                        //禁止接收      (3)    这步,在接收完成后禁止,再在下次接收需要时开启,他又是完全正常的,屏蔽此语句就不行了 何故啊 ??????
                                gprs_UartRcvFlag = 1;                                //接收完成标志
                        }
                }
                SCON1 &= ~0X81;                                //清接收中断标志     (4)
        }

        else if(SCON1 & 0x02)                        // 发送中断
        {                       
                gprs_UartTxFlag = 1;
                GPRS_CLR_TX_INTERRUPT_FLAG;    //SCON1 &= ~0X02;
        }
}



void  UATRT0_ISR (void) interrupt         4                        //INTERRUPT_UART0
{
        u8 temp;
        if(RI0)                                //((SCON0 & 0X01) == 0X01)
        {
                temp = SBUF0;
                FindGPSPacket(temp);    //!!!!!!!!!!
                RI0 = 0;                //清uart0 中断标志
        }
       
//        if(TI0)                        //((SCON0 & 0X02) == 0X02)
//        {
//                GPS_CLR_TX_INTERRUPT_FLAG;                //清uart0 中断标志
//                gps_UartTxFlag = 1;                                // ?????????????
//        }
}






程序的uart0 初始化时开启中断接收完全木有问题,

uart1 上面括号里面的1、2,在初始化时,随便开启哪个都不行,程序运行时就会不停的进入uart1的接收中断里面










出0入0汤圆

发表于 2015-9-15 16:22:03 | 显示全部楼层
T1还允许中断干嘛用

出0入0汤圆

发表于 2015-9-15 16:24:31 | 显示全部楼层
程序中有T1中断服务程序吗,允许中断就要有对应的中断程序,基本常识

出0入4汤圆

发表于 2015-9-15 16:40:49 | 显示全部楼层
hpdell 发表于 2015-9-15 15:26
我现在的问题是 使用uart1,波特率是115200,

程序开启的接收中断,在初始化时,程序就会死机,但是在有 ...

RI1和RI2需要程序手动清零,如果不清,就会反复进中断。
你在中断程序中清下试下。我当前不用C8051,所以只是猜测

出0入0汤圆

 楼主| 发表于 2015-9-15 16:43:54 | 显示全部楼层
modbus 发表于 2015-9-15 16:24
程序中有T1中断服务程序吗,允许中断就要有对应的中断程序,基本常识

tr1 是为了给uart0 产生波特率使用的,

对uart1 应该不会产生什么影响的把

出0入0汤圆

 楼主| 发表于 2015-9-15 16:46:21 | 显示全部楼层
laujc 发表于 2015-9-15 16:40
RI1和RI2需要程序手动清零,如果不清,就会反复进中断。
你在中断程序中清下试下。我当前不用C8051,所以 ...

对应括号里面 的 4 就是清除 uart1的 接收中断,

出0入4汤圆

发表于 2015-9-15 16:52:10 | 显示全部楼层
hpdell 发表于 2015-9-15 16:46
对应括号里面 的 4 就是清除 uart1的 接收中断,

单步走一下,如果程序一开始就卡位,肯定是哪个地方不对,很容易找出来的

出0入0汤圆

发表于 2015-9-15 17:38:00 | 显示全部楼层
hpdell 发表于 2015-9-15 16:43
tr1 是为了给uart0 产生波特率使用的,

对uart1 应该不会产生什么影响的把

你允许了T1中断,但却没有T1的中断服务程序,当T1中断时你让他去哪执行。

出0入0汤圆

发表于 2015-9-15 17:42:35 | 显示全部楼层
另外当T1用作波特率发生器时是不需要中断的,应禁止T1中断,而不是使能T1中断

出0入0汤圆

 楼主| 发表于 2015-9-16 10:22:10 | 显示全部楼层
modbus 发表于 2015-9-15 17:42
另外当T1用作波特率发生器时是不需要中断的,应禁止T1中断,而不是使能T1中断 ...

你好,我把    ET1 = 0;       屏蔽了,效果还是一样的

貌似程序运行时,串口就会收到数据,但是不知道这个数据是怎么来的,还在研究中,你们看看有没有其他的比较好的方法啊 ??

出0入0汤圆

发表于 2015-10-9 15:38:28 | 显示全部楼层
最好采用中断方式,这样CPU效率高,避免通讯错误等问题。程序处理也会简化。

出0入0汤圆

 楼主| 发表于 2015-10-9 17:14:10 | 显示全部楼层
happy_andy 发表于 2015-10-9 15:38
最好采用中断方式,这样CPU效率高,避免通讯错误等问题。程序处理也会简化。 ...

你好,已经完成采用中断方式的收发了,谢谢哦

目前看运行比较稳定

出0入0汤圆

发表于 2015-10-9 18:01:32 | 显示全部楼层
hpdell 发表于 2015-10-9 17:14
你好,已经完成采用中断方式的收发了,谢谢哦

目前看运行比较稳定

恭喜,如何你用查询的方式,你会遇到很多问题的

出0入0汤圆

 楼主| 发表于 2015-10-9 21:10:58 | 显示全部楼层
happy_andy 发表于 2015-10-9 18:01
恭喜,如何你用查询的方式,你会遇到很多问题的

是 啊,

请教下,你对stemwin 熟悉不啊 ?

出0入0汤圆

发表于 2015-10-10 11:40:21 | 显示全部楼层
hpdell 发表于 2015-10-9 21:10
是 啊,

请教下,你对stemwin 熟悉不啊 ?

没接触过,不了解。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表