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

2020-02-11 10:00发布

本帖最后由 FSL_TICS_ZP 于 2014-6-17 09:10 编辑

我目前在用MQX中的串口,我发现如果用read函数来读取串口数据时,当对方不发数据给串口接收,那么read函数会死等,而且会将CPU占用不放,没有超时机制,而且在线程中死等,别的线程也开启不了,就连想提示一下错误也做不了!怎么样在不改动驱动的情况下,可以让read超时自动跳出啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
wangpengcheng
1楼-- · 2020-02-13 06:59
tkggitfk24 发表于 2014-6-15 01:13
如果是polled方式,你肯定要查询有没有数据,没数据来你还死等啊, int方式可以采用事件或者信号量通知task ...

关键问题是驱动都是写好的,改起来挺麻烦!
wangpengcheng
2楼-- · 2020-02-13 09:45
liao-ljj 发表于 2014-6-15 08:49
搞一个信号量,有接收时在read

实在没有办法的时候可能会用中断讯取,然后建信号量!
wangpengcheng
3楼-- · 2020-02-13 12:03
 精彩回答 2  元偷偷看……
wangpengcheng
4楼-- · 2020-02-13 14:43
搞定了,还是自己看文档不仔细啊!串口在打开的时候有可以设置如下标志,是打开非阻塞读取串口驱动的!希望能给后面的同学提供帮助!

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] == ' ') && (read_buff[index - 2] == ' '))
  16.             break;
  17.     }
  18.     fclose(uart_handle);
复制代码

请版主帮忙结贴,谢谢!
FSL_TICS_ZP
5楼-- · 2020-02-13 17:09
wangpengcheng 发表于 2014-6-16 10:24
搞定了,还是自己看文档不仔细啊!串口在打开的时候有可以设置如下标志,是打开非阻塞读取串口驱动的!希望 ...

好的,sorry,没看到你的问题,所以也没叫MQX工程师帮你看一下。
wangpengcheng
6楼-- · 2020-02-13 22:07
FSL_TICS_ZP 发表于 2014-6-17 09:05
好的,sorry,没看到你的问题,所以也没叫MQX工程师帮你看一下。

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

一周热门 更多>