搜索
bottom↓
回复: 28

问题:MQX中用read函数读串口时如何做超时机制(已解决)

[复制链接]

出0入0汤圆

发表于 2014-6-12 18:41:12 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZP 于 2014-6-17 09:10 编辑

我目前在用MQX中的串口,我发现如果用read函数来读取串口数据时,当对方不发数据给串口接收,那么read函数会死等,而且会将CPU占用不放,没有超时机制,而且在线程中死等,别的线程也开启不了,就连想提示一下错误也做不了!怎么样在不改动驱动的情况下,可以让read超时自动跳出啊?

出0入42汤圆

发表于 2014-6-13 09:20:33 | 显示全部楼层
select before read, if it's POSIX like OS

出0入0汤圆

发表于 2014-6-13 09:23:36 | 显示全部楼层
和现在PE提供的那个 读串口一样,死等

出0入0汤圆

 楼主| 发表于 2014-6-13 09:26:32 | 显示全部楼层
albert_w 发表于 2014-6-13 09:20
select before read, if it's POSIX like OS

什么意思啊?谷哥了一下也没哥明白啊!

出0入0汤圆

 楼主| 发表于 2014-6-13 09:27:11 | 显示全部楼层
浪里白条 发表于 2014-6-13 09:23
和现在PE提供的那个 读串口一样,死等

是那个意思,别的啥事也干不了!

出0入42汤圆

发表于 2014-6-13 09:34:36 | 显示全部楼层
wangpengcheng 发表于 2014-6-13 09:26
什么意思啊?谷哥了一下也没哥明白啊!

Linux上的非阻塞编程可以在读写千做一个select,判断是否可读写,然后再动手

出0入0汤圆

发表于 2014-6-13 09:46:04 | 显示全部楼层
搞一个超时的计数器,到点了就break出去,这样解决可行否

出0入0汤圆

 楼主| 发表于 2014-6-13 10:30:05 | 显示全部楼层
浪里白条 发表于 2014-6-13 09:46
搞一个超时的计数器,到点了就break出去,这样解决可行否

这个方法我想过,不可行,因为当等待的时候CPU被占用,除非用硬件定时器中断!不过这种方法是最不愿意用的,程序架构就搞乱了!

出0入0汤圆

 楼主| 发表于 2014-6-13 10:30:33 | 显示全部楼层
albert_w 发表于 2014-6-13 09:34
Linux上的非阻塞编程可以在读写千做一个select,判断是否可读写,然后再动手 ...

MQX中貌似没有这种机制!

出0入0汤圆

发表于 2014-6-13 10:45:57 | 显示全部楼层
MQX开发中存不存在软件费用?

出0入0汤圆

发表于 2014-6-13 11:33:27 | 显示全部楼层
用任务和事件来做。
专门一个来读取的任务。

出0入0汤圆

 楼主| 发表于 2014-6-13 15:03:34 | 显示全部楼层
浪里白条 发表于 2014-6-13 10:45
MQX开发中存不存在软件费用?

免费开源!

出0入0汤圆

 楼主| 发表于 2014-6-13 15:04:38 | 显示全部楼层
usecool 发表于 2014-6-13 11:33
用任务和事件来做。
专门一个来读取的任务。

除非改驱动,否则不行,因为只要进入read,没接够数据他就不会退出来,也就是说该任务永远结束不了!

出0入0汤圆

发表于 2014-6-13 15:12:25 | 显示全部楼层
wangpengcheng 发表于 2014-6-13 15:04
除非改驱动,否则不行,因为只要进入read,没接够数据他就不会退出来,也就是说该任务永远结束不了! ...

改驱动也可以啊,既然都用了,只要有办法解决即可。

MQX也只是很浅显看了下,还没仔细看代码呢。

出0入0汤圆

发表于 2014-6-13 15:35:51 | 显示全部楼层
楼主现在用的哪款芯片来搞MQX啊?

出0入0汤圆

 楼主| 发表于 2014-6-13 15:48:00 | 显示全部楼层
浪里白条 发表于 2014-6-13 15:35
楼主现在用的哪款芯片来搞MQX啊?

MK20DN512VLK10

出0入0汤圆

发表于 2014-6-15 00:04:13 | 显示全部楼层
MQX有简单介绍下吗?

出0入0汤圆

发表于 2014-6-15 01:13:43 | 显示全部楼层
本帖最后由 tkggitfk24 于 2014-6-15 01:21 编辑

如果是polled方式,你肯定要查询有没有数据,没数据来你还死等啊, int方式可以采用事件或者信号量通知task处理,需要修改底层中断ISR, 等待信号量可以加入超时
   

出0入13汤圆

发表于 2014-6-15 08:49:48 | 显示全部楼层
搞一个信号量,有接收时在read

出0入0汤圆

 楼主| 发表于 2014-6-15 16:13:52 | 显示全部楼层
tkggitfk24 发表于 2014-6-15 01:13
如果是polled方式,你肯定要查询有没有数据,没数据来你还死等啊, int方式可以采用事件或者信号量通知task ...

关键问题是驱动都是写好的,改起来挺麻烦!

出0入0汤圆

 楼主| 发表于 2014-6-15 16:14:18 | 显示全部楼层
liao-ljj 发表于 2014-6-15 08:49
搞一个信号量,有接收时在read

实在没有办法的时候可能会用中断讯取,然后建信号量!

出0入0汤圆

 楼主| 发表于 2014-6-15 16:14:40 | 显示全部楼层
rootxie 发表于 2014-6-15 00:04
MQX有简单介绍下吗?

MQX安装路径下就有!

出0入0汤圆

 楼主| 发表于 2014-6-16 10:24:02 | 显示全部楼层
搞定了,还是自己看文档不仔细啊!串口在打开的时候有可以设置如下标志,是打开非阻塞读取串口驱动的!希望能给后面的同学提供帮助!

IO_SERIAL_NON_BLOCKING

Open the serial driver in non blocking mode. In this mode the _io_read() function doesn’t wait till the receive buffer is full, but it immediately returns received characters and number of received characters.

  1. char read_buff[50];
  2.     int index = 0, size = 0;
  3.     MQX_FILE_PTR uart_handle = fopen("ittya:", (char const *)IO_SERIAL_NON_BLOCKING);
  4.     while(1)
  5.     {
  6.         //Wait Receive
  7.         while(size == 0)
  8.         {
  9.             _time_delay(2);
  10.             size = read(uart_handle, &read_buff[index], sizeof(read_buff));
  11.         }
  12.         //Buffer Index Change
  13.         index += size;
  14.         //Receive End Test
  15.         if((read_buff[index - 1] == '\n') && (read_buff[index - 2] == '\r'))
  16.             break;
  17.     }
  18.     fclose(uart_handle);
复制代码


请版主帮忙结贴,谢谢!

出0入0汤圆

发表于 2014-6-17 09:05:20 | 显示全部楼层
wangpengcheng 发表于 2014-6-16 10:24
搞定了,还是自己看文档不仔细啊!串口在打开的时候有可以设置如下标志,是打开非阻塞读取串口驱动的!希望 ...

好的,sorry,没看到你的问题,所以也没叫MQX工程师帮你看一下。

出0入0汤圆

 楼主| 发表于 2014-6-17 09:53:28 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-6-17 09:05
好的,sorry,没看到你的问题,所以也没叫MQX工程师帮你看一下。

没事,有时候自己研究出来的印象比较深

出0入0汤圆

发表于 2014-6-17 09:54:13 | 显示全部楼层
wangpengcheng 发表于 2014-6-17 09:53
没事,有时候自己研究出来的印象比较深

好同志啊!

出0入0汤圆

发表于 2014-6-17 09:55:39 | 显示全部楼层
多谢23楼分享了。

出0入0汤圆

 楼主| 发表于 2014-6-17 11:08:05 | 显示全部楼层
lrzxc 发表于 2014-6-17 09:55
多谢23楼分享了。

不客气!共同进步!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-20 00:18

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

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