查看: 9530|回复: 10

[求助] 串口中断进不去?

[复制链接]
  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
    发表于 2012-3-7 06:41:05 | 显示全部楼层 |阅读模式
    我想通过消息将接收到的字符从串口中断发到任务中,自定义了一个串口中断,在原有执行例程的前面加了发送消息的过程。可是测试的时候发现好像无法进入中断,不知道是安装中断错了还是其它怎么样,请大家帮忙看看。
    #include "app_inc.h"


    _pool_id uart_msg_pool;  // 定义一个供串口与任务消息通信的消息池

    extern void isr_uart3(pointer user_isr_ptr);

    void task_frame(uint_32 initial_data)
    {
        _queue_id uart_msg_queue;  // 创建串口消息队列
        UART_MSG_STRUST_PTR msg_ptr;  // 定义一个消息指针
       
        MY_ISR_STRUCT_PTR  isr_ptr;  // 定义一个自定义中断指针
       
        uint_8 ch;  // 接收字符
       
        uint_8 frame_buf[64];  // 帧接收缓冲
        uint_32 index = 0; // 帧接收缓冲索引
        uint_8 frame_data_len;  // 帧通信长度
       
        MQX_FILE_PTR fp;
       
        printf(" TASK_FRAME START \n");
       
        // 创建并打开一个消息队列
        uart_msg_queue = _msgq_open(UART_MSG_QUEUE, 0); 
       
        // 创建一个消息池
        uart_msg_pool = _msgpool_create(sizeof(UART_MSG_STRUCT),
                UART_MSG_QUEUE_SIZE, 0, 0);
       
       
        // 安装一个新的串口中断
        isr_ptr = _mem_alloc_zero((_mem_size)sizeof(MY_ISR_STRUCT));
        isr_ptr->OLD_ISR_DATA = _int_get_isr_data(INT_UART3_RX_TX);
        isr_ptr->OLD_ISR =_int_get_isr(INT_UART3_RX_TX);
        _int_install_isr(INT_UART3_RX_TX, isr_uart3, isr_ptr);
       
        // 打开串口中断设备
        fp = fopen("ittyd:", (pointer) (IO_SERIAL_XON_XOFF | IO_SERIAL_TRANSLATION));
        if (!fp)
        {
            printf(" ITTYD CAN NOT BE OPENED \n");
        }
        else
        {
            printf(" ITTYD OPENED \n");
        }
       
       
        while (TRUE)
        {
            // 等待消息
            msg_ptr = _msgq_receive(uart_msg_queue, 0);
           
            printf( "receive msg \n");
           
            // 处理消息, 组帧
            // 帧首字符为FRAME_START_CHAR
            // 帧尾字符为FRAME_END_CHAR
            // 帧的有效数据最大长度为FRAME_MAX_SIZE
            // 帧有效字符的第一个指示帧有效数据长度,不包括本字符和首尾字符
            ch = msg_ptr->DATA;
           
            _msg_free(msg_ptr);
            printf("%d : %c\n", index, ch);
           
            if (index == 0)
            {
                if (ch == FRAME_START_CHAR)
                {
                    frame_buf[index++] = ch;
                }
            }
            else if (index == 1)
            {
                frame_buf[index++] = ch;
               
                frame_data_len = ch - '0';
                if (frame_data_len > FRAME_MAX_SIZE)
                {
                    index = 0;
                }
            }
            else if (index < frame_data_len+2)
            {
                frame_buf[index++] = ch;
            }
            else
            {
                if (ch == FRAME_END_CHAR)
                {
                    for (index = 0; index < frame_data_len; index++)
                    {
                        printf("%c", frame_buf[index+1]);
                    }
                    printf("\n");
                    //_msgq_send();  // 发送帧消息
                }
                index = 0;
            }
           
        }
       
    }
    我知道答案 目前已有9人回答
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
     楼主| 发表于 2012-3-7 06:43:13 | 显示全部楼层

    回复:串口中断进不去?

    // 自定义串口中断
    void isr_uart3( pointer user_isr_ptr )
    {
            MY_ISR_STRUCT_PTR  isr_ptr;
            UART_MSG_STRUST_PTR msg_ptr;  // 定义一个消息指针
    printf("isr_uart3\n");                                       
            if (UART3_S1 & UART_S1_RDRF_MASK)
            {
                    // 创建一条消息
                    msg_ptr = (UART_MSG_STRUST_PTR)_msg_alloc(uart_msg_pool);
                    msg_ptr->HEADER.TARGET_QID = _msgq_get_id(0, UART_MSG_QUEUE);
                    msg_ptr->HEADER.SIZE = sizeof(MESSAGE_HEADER_STRUCT) +
                             strlen((char_ptr)(&(msg_ptr->DATA))) + 1;
                    msg_ptr->DATA = UART3_D;
                    _msgq_send(msg_ptr);
            }
           
            isr_ptr = (MY_ISR_STRUCT_PTR)user_isr_ptr;
            (*isr_ptr->OLD_ISR)(isr_ptr->OLD_ISR_DATA);
           
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-17 10:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    38

    主题

    395

    帖子

    3

    高级会员

    Rank: 4

    积分
    780
    最后登录
    2023-11-17
     楼主| 发表于 2012-3-7 07:02:49 | 显示全部楼层

    回复:串口中断进不去?

    //=========================================================================
    // 中断任务设定
    // 自定义中断结构类型
    typedef struct my_isr_struct
    {
       pointer               OLD_ISR_DATA;  // 向ISR传递的参数
       void      (_CODE_PTR_ OLD_ISR)(pointer);  // ISR执行函数
       //_mqx_uint             TICK_COUNT;
       // pointer  ISR_RETURN_PTR;  // ISR回传参数指针
    } MY_ISR_STRUCT, _PTR_ MY_ISR_STRUCT_PTR;
    // 串口中断接收到的帧类型
    typedef struct uart_msg_struct
    {
            MESSAGE_HEADER_STRUCT   HEADER;
            uint_8 DATA;
    } UART_MSG_STRUCT, _PTR_ UART_MSG_STRUST_PTR;
    // 串口中断消息队列
    #define UART_MSG_QUEUE        8
    // 定义串口接收缓冲区长度
    #define UART_MSG_QUEUE_SIZE   64
    // 串口中断发出消息使用的消息池
    extern _pool_id uart_msg_pool;
    // 定义帧协议
    #define FRAME_START_CHAR '#'
    #define FRAME_END_CHAR   '*'
    #define FRAME_MAX_SIZE   8
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    224

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    322
    最后登录
    1970-1-1
    发表于 2012-3-7 10:17:45 | 显示全部楼层

    RE:串口中断进不去?

    open了再装自定义isr
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8

    主题

    41

    帖子

    0

    新手上路

    Rank: 1

    积分
    11
    最后登录
    1970-1-1
    发表于 2012-3-7 16:33:00 | 显示全部楼层

    回复:串口中断进不去?

    LZ,你中断中每收到一个字节就发送一个消息?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-3-7 16:47:15 | 显示全部楼层

    RE:串口中断进不去?

    fp = fopen("ittyd:", (pointer) (IO_SERIAL_XON_XOFF | IO_SERIAL_TRANSLATION));
    这里要注意,你选择的是串口3,不要开启错了串口。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    224

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    322
    最后登录
    1970-1-1
    发表于 2012-3-7 17:06:31 | 显示全部楼层

    RE:串口中断进不去?

    楼上不要误导。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-3-8 09:41:19 | 显示全部楼层

    RE:串口中断进不去?

    版主,帮忙解决一下吧。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    51

    主题

    307

    帖子

    0

    高级会员

    Rank: 4

    积分
    651
    最后登录
    2020-9-4
    发表于 2013-10-10 16:53:23 | 显示全部楼层

    回复:串口中断进不去?

    我也遇到相同问题,不知怎么解决?
     
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    51

    主题

    307

    帖子

    0

    高级会员

    Rank: 4

    积分
    651
    最后登录
    2020-9-4
    发表于 2013-10-10 16:54:03 | 显示全部楼层

    回复:串口中断进不去?

    现在解决没? 共享一下可以吗?
     
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 08:54 , Processed in 0.106943 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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