打印
[技术问题解答]

请问关于MAPS-K64这块板子有关UART多路收数据的问题

[复制链接]
2176|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephy|  楼主 | 2015-11-19 22:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想问一下,MAPS-K64例程hello_world中是一个串口收发数据的,我现在想用板子上的两个UART串口(CN7和CN12)同时进行UART收发数据,现在遇到了一个问题,就是如果将两个UART_DRV_ReceiveDataBlocking写在一个while循环进行判断,判断其中一个口收到数据,则将此数据进行处理从另一个口发送,这样的一个程序应该怎样写?
这个函数里最后一个变量它默认给的是WAIT_FOREVER,程序运行到这里就会一直等待数据,程序就会卡死,所以我该如何修改才能做到同时监视两个串口的状态,使得一个串口收到数据的时候将该数据从另一个串口发送,谢谢!

相关帖子

沙发
FSL_TICS_ZJJ| | 2015-11-20 09:41 | 只看该作者
完全同时是不可能的,因为你发送和接收还是时差。
程序中你可以用接收中断,一旦有数据接收到,就在另一个串口发出来。

使用特权

评论回复
板凳
elephy|  楼主 | 2015-11-20 09:54 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-20 09:41
完全同时是不可能的,因为你发送和接收还是时差。
程序中你可以用接收中断,一旦有数据接收到,就在另一个 ...

这个接收中断是怎么操作的?能否举个例子?

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2015-11-20 10:04 | 只看该作者
elephy 发表于 2015-11-20 09:54
这个接收中断是怎么操作的?能否举个例子?

就是开启UART的中断,一旦受到数据,就会进入到中断中,然后你把数据取出。
不过,你现在也可以直接用hello_world的代码,
        UART_DRV_ReceiveDataBlocking(BOARD_DEBUG_UART_INSTANCE, receiveBuff, 1,
                                     OSA_WAIT_FOREVER);

        /* Now, stuff the buffer for the TX side and send the character*/
        sourceBuff[0] = receiveBuff[0];

        /* Now echo the received character */
        UART_DRV_SendDataBlocking(BOARD_DEBUG_UART_INSTANCE, sourceBuff, 1,
                                  200);

第一句,使用串口1接收,等待接收到,然后把数据从另外一个串口发出,只要改下BOARD_DEBUG_UART_INSTANCE就能从另外的串口发出的。

使用特权

评论回复
5
elephy|  楼主 | 2015-11-20 10:16 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-20 10:04
就是开启UART的中断,一旦受到数据,就会进入到中断中,然后你把数据取出。
不过,你现在也可以直接用hel ...

这个我知道,但是我想同时监视两个串口,两个串口都是收数据,当然我知道不能做到同时,但是可以实现循环检测,检测到哪个来了就进入中断。
这样的程序应该如何修改?

使用特权

评论回复
6
elephy|  楼主 | 2015-11-20 11:12 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-20 10:04
就是开启UART的中断,一旦受到数据,就会进入到中断中,然后你把数据取出。
不过,你现在也可以直接用hel ...

比如我写成:
while(1)
  {   
    while(1)
    {
      UART_DRV_ReceiveDataBlocking(BOARD_DEBUG_UART_INSTANCE_U4, rxb_3g, 1, OSA_WAIT_1);
      UART_DRV_ReceiveDataBlocking(BOARD_DEBUG_UART_INSTANCE_U0, rxb_2430, 1, OSA_WAIT_1);
      if (rxb_3g[0] != '~')
      {
        rxb_3g[0] = '~';
        break;
      }
      if (rxb_2430[0] != '~')
      {
        rxb_2430[0] = '~';
        break;
      }   
     }
     UART_DRV_SendDataBlocking(BOARD_DEBUG_UART_INSTANCE_U0, init_ele, 19, 200);
}
其中,OSA_WAIT_1 我仿照原来的forever把全F改成了00000001U,
rxb_3g[0]和rxb_2430[0]初始状态里面存的是‘~’,所以只要判断到U0或者U4其中某一个串口收到数据,则将接收区[0]改回成初始状态'~',并跳出内层While循环,跳出后从U0口发送init_ele里的内容。

但是我用串口助手调试的时候发现,其中一个口接收到了数据之后,并没有跳出内层循环,而是需要另一个串口也接收到数据才能跳出,我想问一下
1)UART_DRV_ReceiveDataBlocking里的timeout到底是什么意思?
2)我这个简易的说明程序哪里写的有问题,应该如何修改?

使用特权

评论回复
7
FSL_TICS_ZJJ| | 2015-11-20 16:06 | 只看该作者
elephy 发表于 2015-11-20 11:12
比如我写成:
while(1)
  {   

你debug看下,如果其中一个串口接收后,看看代码停在什么地方?
按道理OSA_WAIT_1不是OSA_WAIT_FOREVER,就不会一直在那里等。
我这边设置了一个,发现如果接收条件满足,是能够跳出循环的。

使用特权

评论回复
8
elephy|  楼主 | 2015-11-20 16:23 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-20 16:06
你debug看下,如果其中一个串口接收后,看看代码停在什么地方?
按道理OSA_WAIT_1不是OSA_WAIT_FOREVER, ...

debug单步运行到while里的第一个  UART_DRV_ReceiveDataBlocking(BOARD_DEBUG_UART_INSTANCE_U4, rxb_3g, 1, OSA_WAIT_1); 就停住了,一直在等待。直到从串口助手输入一个数才执行第二个UART_DRV_ReceiveDataBlocking

使用特权

评论回复
9
elephy|  楼主 | 2015-11-20 16:24 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-20 16:06
你debug看下,如果其中一个串口接收后,看看代码停在什么地方?
按道理OSA_WAIT_1不是OSA_WAIT_FOREVER, ...

所以我想知道有没有什么办法能让我一直循环检测两个串口的收数据状态,只要有一个口接收到了新数据,则跳出循环?

使用特权

评论回复
10
FSL_TICS_ZJJ| | 2015-11-20 16:29 | 只看该作者
elephy 发表于 2015-11-20 16:23
debug单步运行到while里的第一个  UART_DRV_ReceiveDataBlocking(BOARD_DEBUG_UART_INSTANCE_U4, rxb_3g, ...


你在第二个UART_DRV_ReceiveDataBlocking那打断点,如果不接受,就不能进入下一条?
这样你直接跑官方的hello world,然后把
//#define USE_STDIO_FUNCTIONS
这句屏蔽掉,把
main 中最后的while(1)改成这样:
    while(1)
    {
        /********************************************
         * Main routine that simply echoes received
         * characters forever
         *********************************************/
  i++;
        /* First, get character.  */
           while(1)
           {

        UART_DRV_ReceiveDataBlocking(BOARD_DEBUG_UART_INSTANCE, receiveBuff, 1,
                                    200);//00000001U  OSA_WAIT_FOREVER

        /* Now, stuff the buffer for the TX side and send the character*/
        sourceBuff[0] = receiveBuff[0];
        if(sourceBuff[0] =='a')
        {
          sourceBuff[0] = 0;
           break;
        }
        
        /* Now echo the received character */
        UART_DRV_SendDataBlocking(BOARD_DEBUG_UART_INSTANCE, sourceBuff, 1,
                                  200);
          }
    }
你会发现,就算不发送,也会一直在第二个while(1)里面循环,可以进入sourceBuff[0] = receiveBuff[0];
而不是直接在UART_DRV_ReceiveDataBlocking那等。
你用官方代码试试。

使用特权

评论回复
11
elephy|  楼主 | 2015-11-20 16:39 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-20 16:29
你在第二个UART_DRV_ReceiveDataBlocking那打断点,如果不接受,就不能进入下一条?
这样你直接跑官方的 ...

像你这样写的话一个串口是可以的,两个串口debug单步运行也是可以的,但是用两台电脑模拟给两个串口发数据时就不行了

使用特权

评论回复
12
elephy|  楼主 | 2015-11-20 16:42 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-11-20 16:29
你在第二个UART_DRV_ReceiveDataBlocking那打断点,如果不接受,就不能进入下一条?
这样你直接跑官方的 ...

我现在写两个串口让它如果能跳出来就显示一句话,再重新进入循环,现象是,运行之后一个串口助手发数据,屏幕上没有显示那句话,另一个电脑的助手发一个数据,屏幕上显示1次那句话

使用特权

评论回复
13
侣行天下| | 2015-11-21 17:49 | 只看该作者
发送和接收会有时间差吧,想完全同时不太可能

使用特权

评论回复
14
elephy|  楼主 | 2015-11-21 20:51 | 只看该作者
侣行天下 发表于 2015-11-21 17:49
发送和接收会有时间差吧,想完全同时不太可能

但是我的想法是在一个循环里一直检测两个串口收数据的状态,判断只要其中一个口收到数据就跳出循环,好像和你说的时间差关系不大,我觉得

使用特权

评论回复
15
ccw1986| | 2015-11-22 17:30 | 只看该作者
我觉得这两个其中一个最好用中断

使用特权

评论回复
16
elephy|  楼主 | 2015-11-23 18:49 | 只看该作者
ccw1986 发表于 2015-11-22 17:30
我觉得这两个其中一个最好用中断

不是很会调中断,能说的再详细一点么?

使用特权

评论回复
17
舒斯特尔| | 2015-11-23 20:15 | 只看该作者
楼主你用中断不就解决这个问题了吗

使用特权

评论回复
18
elephy|  楼主 | 2015-11-24 16:08 | 只看该作者
舒斯特尔 发表于 2015-11-23 20:15
楼主你用中断不就解决这个问题了吗

终端这块我不太明白,能否说得更细致一点?

使用特权

评论回复
19
Micachl| | 2015-11-24 16:37 | 只看该作者
elephy 发表于 2015-11-24 16:08
终端这块我不太明白,能否说得更细致一点?

发送数据和接收数据的时候都在中断的模式下去写

使用特权

评论回复
20
elephy|  楼主 | 2015-11-24 16:43 | 只看该作者
Micachl 发表于 2015-11-24 16:37
发送数据和接收数据的时候都在中断的模式下去写

有没有中断相关的例程,或者中断函数从哪里调用的?

使用特权

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

本版积分规则

4

主题

64

帖子

1

粉丝