在线时间58 小时
UID175586
注册时间2010-3-14
NXP金币0
TA的每日心情 | 奋斗 2017-1-17 10:45 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
高级会员

- 积分
- 780
- 最后登录
- 2023-11-17
|
我想通过消息将接收到的字符从串口中断发到任务中,自定义了一个串口中断,在原有执行例程的前面加了发送消息的过程。可是测试的时候发现好像无法进入中断,不知道是安装中断错了还是其它怎么样,请大家帮忙看看。
#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;
}
}
}
|
|