打印

用RTX51-tiny的两个任务处理串口中断,发送和接收会影响吗?

[复制链接]
3135|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Andylue|  楼主 | 2013-8-13 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Andylue 于 2013-8-13 17:06 编辑

程序说明:用串口调试助手发送字符,数码管来显示(串口接收功能);并且串口调试助手接收程序中buf的数据(串口发送功能),这样能实现吗?怎么配合实现?环境是RTX51-tiny。任务0用来处理发送,任务1用来处理接收,并显示在数码管上。
#include <rtx51tny.h>
#include <reg52.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define led P1
uint16  counter0; /* counter for task 0 */
uint16  counter1; /* counter for task 1 */
uint8 code dis_table[]={0xc0,0xf9,0xa4,0xb0,0x99, /*segment code */
                                     0x92,0x82,0xf8,0x80,0x90};
uint8 code wei_table[]={0x01,0x02,0x04,0x08,      /*Location code */
                                     0x10,0x20,0x40,0x80};
uint8 code buf[]={"Andylue<yuanfen_330@163.com>"};
uint8 num;
uint8 uart_flag=0;
/************************************************************/
/*'delayms':
/************************************************************/
void delayms(uint8 ms)
{
        uint8 i;
        while(ms--)
        for(i=0;i<110;i++);
}
/************************************************************/
/*'init': serial interrupt initialization
/************************************************************/
void init()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        SCON=0x50;
        ES=1;
        TR1=1;
}
/************************************************************/
/*'send':
/************************************************************/
void send(uint8 dat)
{
        dat=SBUF;
        while(!TI);
        TI=0;
}
/************************************************************/
/*'sendstring':
/************************************************************/
void sendstring(uint8 *p)
{
        while(*p != '\0')
        send(*p++);
}
/************************************************************/
/*'UART_isr':
/************************************************************/
void UART_isr(void) interrupt 4
{
        if(RI)
        num= SBUF;
        uart_flag = 1;
        RI = 0;
        isr_send_signal(1);
}
/************************************************************/
/*'disnum':
/************************************************************/
void disnum()
{
        P1=dis_table[num/10];
        P2=wei_table[1];
        delayms(1);
        P1=dis_table[num%10];
        P2=wei_table[0];
        delayms(1);
}
/************************************************************/
/*  Task 0 'send_handle':
/************************************************************/
void send_handle(void) _task_ 0
{
        init();
        os_create_task(1);
        while(1)
        {
                counter0 ++;
                sendstring(buf);
                send(0x0a);
                send(0x0d);
        }
}
/********************************************************************/
/*  Task 1 'receive_handle':
/********************************************************************/
void receive_handle(void) _task_ 1
{
        uint8 i=100;
        while(1)
        {
                counter1 ++;
                os_wait1(K_SIG);
                while(i--)
                disnum();

        }
}




相关帖子

沙发
Andylue|  楼主 | 2013-8-13 18:57 | 只看该作者
上面这段代码只能实现串口接收功能,发送功能不能实现,哪位大侠帮我看看是怎么回事?

使用特权

评论回复
板凳
glmgs| | 2013-8-13 19:05 | 只看该作者
不知道呀,不过帮你顶起,求高人解决。

使用特权

评论回复
地板
greadber| | 2013-8-13 21:32 | 只看该作者
此时串口是共享设备,要加互斥信号吧

使用特权

评论回复
5
Andylue|  楼主 | 2013-8-14 18:51 | 只看该作者
greadber 发表于 2013-8-13 21:32
此时串口是共享设备,要加互斥信号吧

提的意见不错,我试试~

使用特权

评论回复
6
w522930954| | 2013-8-15 09:02 | 只看该作者
void send(uint8 dat)
{
        dat=SBUF;
        while(!TI);
        TI=0;
}
反了吧。。是SBUF=dat。。。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
Andylue + 3 赞一个!
7
Andylue|  楼主 | 2013-8-16 19:42 | 只看该作者
w522930954 发表于 2013-8-15 09:02
void send(uint8 dat)
{
        dat=SBUF;

的确是啊,写代码没注意啊。

使用特权

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

本版积分规则

个人签名:知识源于积累,成功源于执着!

4

主题

158

帖子

1

粉丝